diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs
new file mode 100644
index 0000000000..d9be17ddf8
--- /dev/null
+++ b/.git-blame-ignore-revs
@@ -0,0 +1,4 @@
+9bdcd4f36a2e5285267b69b17e8fc26482dc1c72
+eea9999dc5eaf464a432f77d5b65269f9baf198d
+98125f88605cd7e46e9be4e1b3ad0600dd5d2b51
+19b7a29720a6f2c95d06e2ea4baa335dcf32e68f
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 0000000000..30dd030d31
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,11 @@
+# see https://docs.github.com/en/code-security/dependabot/working-with-dependabot/keeping-your-actions-up-to-date-with-dependabot
+# make sure our actions stay up-to-date and we know about any updates.
+# most of the time, this happens for major releases.
+# (...unless we stop using version tags and switch to hashes...)
+
+version: 2
+updates:
+ - package-ecosystem: "github-actions"
+ directory: "/"
+ schedule:
+ interval: "weekly"
diff --git a/.github/workflows/build-host.yml b/.github/workflows/build-host.yml
new file mode 100644
index 0000000000..ae0353068d
--- /dev/null
+++ b/.github/workflows/build-host.yml
@@ -0,0 +1,40 @@
+# Run host test suite under valgrind for runtime checking of code.
+# Also, a quick test that the mocking builds work at all
+
+name: Build on host OS
+
+on:
+ pull_request:
+
+permissions:
+ contents: read
+
+jobs:
+ host-tests:
+ name: Tests
+ runs-on: ubuntu-latest
+ defaults:
+ run:
+ shell: bash
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ submodules: true
+ - run: |
+ sudo apt update
+ sudo apt install valgrind lcov
+ bash ./tests/ci/host_test.sh
+
+ mock-check:
+ name: Mock
+ runs-on: ubuntu-latest
+ defaults:
+ run:
+ shell: bash
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ submodules: true
+ - run: |
+ cd tests/host
+ make -j ../../libraries/ESP8266WebServer/examples/FSBrowser/FSBrowser
diff --git a/.github/workflows/build-ide.yml b/.github/workflows/build-ide.yml
new file mode 100644
index 0000000000..565b08d392
--- /dev/null
+++ b/.github/workflows/build-ide.yml
@@ -0,0 +1,107 @@
+# Cross-platform builds to ensure our Core and toolchain works
+
+name: Build IDE examples
+
+on:
+ pull_request:
+
+permissions:
+ contents: read
+
+jobs:
+
+ # Examples are built in parallel to avoid CI total job time limitation
+ sanity-check:
+ runs-on: ubuntu-latest
+ defaults:
+ run:
+ shell: bash
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ submodules: false
+ - uses: actions/cache@v4
+ with:
+ path: ./tools/dist
+ key: ${{ runner.os }}-${{ hashFiles('package/package_esp8266com_index.template.json', 'tests/common.sh', 'tests/build.sh') }}
+ - name: Toolchain sanity checks
+ run: |
+ bash ./tests/sanity_check.sh
+
+ build-linux:
+ name: Linux - LwIP ${{ matrix.lwip }} (${{ matrix.chunk }})
+ runs-on: ubuntu-latest
+ defaults:
+ run:
+ shell: bash
+ strategy:
+ matrix:
+ lwip: ["default", "IPv6"]
+ chunk: [0, 1, 2, 3, 4, 5, 6, 7]
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ submodules: true
+ - uses: actions/setup-python@v5
+ with:
+ python-version: '3.x'
+ - uses: actions/cache@v4
+ with:
+ path: ./tools/dist
+ key: ${{ runner.os }}-${{ hashFiles('package/package_esp8266com_index.template.json', 'tests/common.sh', 'tests/build.sh') }}
+ - name: Build Sketches
+ env:
+ ESP8266_ARDUINO_BUILDER: "arduino"
+ ESP8266_ARDUINO_IDE: "${{ runner.temp }}/arduino_ide"
+ ESP8266_ARDUINO_LWIP: ${{ matrix.lwip }}
+ run: |
+ bash ./tests/build.sh 8 ${{ matrix.chunk }}
+
+ # Just try to build at least one sketch, since we spend so much time with the matrix above
+
+ build-windows:
+ name: Windows
+ runs-on: windows-latest
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ submodules: false
+ - uses: actions/setup-python@v5
+ with:
+ python-version: '3.x'
+ - uses: actions/cache@v4
+ with:
+ path: ./tools/dist
+ key: ${{ runner.os }}-${{ hashFiles('package/package_esp8266com_index.template.json', 'tests/common.sh', 'tests/build.sh') }}
+ - name: Build Sketch
+ env:
+ ESP8266_ARDUINO_HARDWARE: "${{ runner.temp }}/hardware"
+ ESP8266_ARDUINO_IDE: "${{ runner.temp }}/arduino_ide"
+ ESP8266_ARDUINO_SKETCHES: "libraries/esp8266/examples/Blink/Blink.ino"
+ run: |
+ bash ./tests/build.sh
+
+ build-mac:
+ name: macOS
+ runs-on: macOS-latest
+ defaults:
+ run:
+ shell: bash
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ submodules: false
+ - uses: actions/setup-python@v5
+ with:
+ python-version: '3.x'
+ - uses: actions/cache@v4
+ with:
+ path: ./tools/dist
+ key: ${{ runner.os }}-${{ hashFiles('package/package_esp8266com_index.template.json', 'tests/common.sh', 'tests/build.sh') }}
+ - name: Build Sketch
+ env:
+ ESP8266_ARDUINO_HARDWARE: "${{ runner.temp }}/hardware"
+ ESP8266_ARDUINO_IDE: "${{ runner.temp }}/arduino_ide"
+ ESP8266_ARDUINO_SKETCHES: "libraries/esp8266/examples/Blink/Blink.ino"
+ run: |
+ bash ./tests/build.sh
diff --git a/.github/workflows/build-platformio.yml b/.github/workflows/build-platformio.yml
new file mode 100644
index 0000000000..5150a4bd29
--- /dev/null
+++ b/.github/workflows/build-platformio.yml
@@ -0,0 +1,39 @@
+# We do not distribute any environment settings, so just try to build some sketches
+# using the 'master' branch and using the uploaded toolchain version via get.py
+# Also, limit the amount of sketches and simply
+
+name: Build examples with PlatformIO
+
+on:
+ pull_request:
+
+permissions:
+ contents: read
+
+jobs:
+ build-pio:
+ name: Linux (random sketches)
+ runs-on: ubuntu-latest
+ defaults:
+ run:
+ shell: bash
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ submodules: true
+ - uses: actions/setup-python@v5
+ with:
+ python-version: '3.x'
+ - uses: actions/cache@v4
+ with:
+ path: |
+ tools/dist
+ ~/.cache/pip
+ ~/.platformio/.cache
+ key: ${{ runner.os }}-${{ hashFiles('package/package_esp8266com_index.template.json', 'tests/common.sh', 'tests/build.sh') }}
+ - name: Build
+ env:
+ ESP8266_ARDUINO_BUILDER: "platformio"
+ run: |
+ pip install -U platformio
+ env ESP8266_ARDUINO_SKETCHES="$(find libraries/ -name '*.ino' | shuf -n 10 -)" bash ./tests/build.sh
diff --git a/.github/workflows/check-autogenerated.yml b/.github/workflows/check-autogenerated.yml
new file mode 100644
index 0000000000..40f3f93e70
--- /dev/null
+++ b/.github/workflows/check-autogenerated.yml
@@ -0,0 +1,62 @@
+# Ensure no manual edits happen to our autogenerated files
+
+name: Check autogenerated files
+
+on:
+ pull_request:
+
+permissions:
+ contents: read
+
+jobs:
+ pkgrefs-check:
+ name: .json template
+ runs-on: ubuntu-latest
+ defaults:
+ run:
+ shell: bash
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ submodules: false
+ - run: |
+ bash ./tests/ci/pkgrefs_test.sh
+
+ eboot-check:
+ name: eboot .elf
+ runs-on: ubuntu-latest
+ defaults:
+ run:
+ shell: bash
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ submodules: false
+ - uses: actions/setup-python@v5
+ with:
+ python-version: '3.x'
+ - uses: actions/cache@v4
+ with:
+ path: ./tools/dist
+ key: ${{ runner.os }}-${{ hashFiles('package/package_esp8266com_index.template.json', 'tests/common.sh') }}
+ - run: |
+ # ^ reuse toolchain cache from our linux build job
+ git submodule update --init --remote tools/sdk/uzlib
+ bash ./tests/ci/eboot_test.sh
+
+ boards-txt-check:
+ name: boards.txt.py
+ runs-on: ubuntu-latest
+ defaults:
+ run:
+ shell: bash
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ submodules: false
+ - uses: actions/setup-python@v5
+ with:
+ python-version: '3.x'
+ - name: Check git-diff result
+ run: |
+ bash ./tests/ci/build_boards.sh
diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml
new file mode 100644
index 0000000000..977570aad8
--- /dev/null
+++ b/.github/workflows/documentation.yml
@@ -0,0 +1,31 @@
+# Ensure Sphinx can build the documentation properly.
+
+name: Documentation
+
+on:
+ pull_request:
+
+permissions:
+ contents: read
+
+jobs:
+ documentation:
+ name: Sphinx build
+ runs-on: ubuntu-latest
+ defaults:
+ run:
+ shell: bash
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ submodules: true
+ - uses: actions/setup-python@v5
+ with:
+ python-version: '3.x'
+ - name: Build documentation
+ run: |
+ pushd doc/
+ python3 -mvenv _venv
+ ./_venv/bin/pip install -r requirements.txt
+ env SPHINXBUILD=$(pwd)/_venv/bin/sphinx-build ../tests/ci/build_docs.sh
+ popd
diff --git a/.github/workflows/release-to-publish.yml b/.github/workflows/release-to-publish.yml
new file mode 100644
index 0000000000..3a80412551
--- /dev/null
+++ b/.github/workflows/release-to-publish.yml
@@ -0,0 +1,49 @@
+# Whenever a release is published from a draft, this will update the
+# master Arduino JSON file to add its new entry.
+
+# We keep the master JSON file in another repo, so we need to use a pre-set
+# Deployment SSH key to be able to push a change to the repo.
+
+#### Steps to follow when you need to make a new SSH key for upload (not
+#### normally needed!)
+
+# Generate a new SSH key private/public pair
+
+# ssh-keygen -t rsa -b 4096 -C "your@email.com" -f ./deploy_rsa
+
+# Upload deploy_rsa.pub to the *ESP8266.GITHUB.IO* repo as a deployment key
+
+# Convert the private key to base64 (to remove line breaks and allow easier
+# usage in the script as an environment variable)
+
+# base64.exe -w 0 < deploy_rsa > deploy_rsa.b64
+
+# Copy the contents of the .b64 file to the clipboard, make a new GitHub
+# secret in the ESP8266/Arduino repo called "GHCI_DEPLOY_KEY" and paste
+# the B64 code into the variable.
+
+name: ESP8266 Arduino Release Publisher
+
+on:
+ release:
+ types: [published]
+
+permissions:
+ contents: read
+
+jobs:
+ package:
+ name: Update master JSON file
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ submodules: false
+ fetch-depth: 0
+ - name: Deploy updated JSON
+ env:
+ BUILD_TYPE: package
+ CI_GITHUB_API_KEY: ${{ secrets.GITHUB_TOKEN }}
+ GHCI_DEPLOY_KEY: ${{ secrets.GHCI_DEPLOY_KEY }}
+ run: |
+ bash ./package/deploy_package_index.sh
diff --git a/.github/workflows/style-check.yml b/.github/workflows/style-check.yml
new file mode 100644
index 0000000000..c371c2f252
--- /dev/null
+++ b/.github/workflows/style-check.yml
@@ -0,0 +1,45 @@
+name: Style and syntax checks
+
+on:
+ pull_request:
+
+permissions:
+ contents: read
+
+jobs:
+
+ # Generic formatting for Core and examples
+
+ clang-format:
+ name: clang-format
+ runs-on: ubuntu-latest
+ defaults:
+ run:
+ shell: bash
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ submodules: true
+ - uses: actions/setup-python@v5
+ with:
+ python-version: '3.x'
+ - name: Style check
+ run: |
+ sudo apt update
+ python ./tests/test_restyle.py --quiet
+ env CLANG_FORMAT="clang-format-18" bash ./tests/ci/style_check.sh
+
+ # Validate orthography
+
+ code-spell:
+ name: codespell
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ submodules: false
+ - name: Run codespell
+ uses: codespell-project/actions-codespell@master
+ with:
+ skip: ./libraries/ESP8266SdFat,./libraries/LittleFS/lib,./tools/pyserial,./tools/sdk,./tools/esptool,./libraries/SoftwareSerial,./libraries/Ethernet,./github/workflows,./libraries/ESP8266HTTPUpdateServer/examples/SecureBearSSLUpdater/SecureBearSSLUpdater.ino,./libraries/esp8266/examples/RTCUserMemory/RTCUserMemory.ino,./libraries/esp8266/examples/StreamString/StreamString.ino,./libraries/ESP8266WiFi/examples/BearSSL_Validation/BearSSL_Validation.ino,./libraries/ESP8266WiFi/examples/BearSSL_Sessions/BearSSL_Sessions.ino,./libraries/ESP8266WebServer/examples/HelloServerBearSSL/HelloServerBearSSL.ino,./libraries/ESP8266WebServer/examples/HttpHashCredAuth/HttpHashCredAuth.ino,./cores/esp8266/spiffs,./tests/device/test_libc/libm_string.c, ./libraries/Netdump/examples/Netdump/Netdump.ino,./libraries/ESP8266WiFi/examples/BearSSL_Server,./cores/esp8266/LwipIntfDev.h
+ ignore_words_list: ESP8266,esp8266,esp,dout,DOUT,ser,ans
diff --git a/.github/workflows/tag-to-draft-release.yml b/.github/workflows/tag-to-draft-release.yml
new file mode 100644
index 0000000000..e9311f9fce
--- /dev/null
+++ b/.github/workflows/tag-to-draft-release.yml
@@ -0,0 +1,51 @@
+# Whenever a tag of the form #.xxxx is pushed against master, generate a
+# draft release and upload the ZIP and JSON file to it. Maintainers then
+# will manually add the changelist and publish it.
+
+name: ESP8266 Arduino Draft Release
+
+on:
+ push:
+ tags:
+ # Run for tags of the x.x.x* form (i.e. 3.0.0, 3.0.0-beta, etc.).
+ - '[0-9]+.[0-9]+.[0-9]+*'
+
+jobs:
+ package:
+ name: Package
+ runs-on: ubuntu-latest
+ defaults:
+ run:
+ shell: bash
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ submodules: true
+ fetch-depth: 0
+ - uses: actions/setup-python@v5
+ with:
+ python-version: '3.x'
+ - name: Set GIT tag name
+ run: |
+ # Sets an environment variable used in the next steps
+ ESP8266_ARDUINO_RELEASE_TAG="$(git describe --exact-match --tags)"
+ echo "ESP8266_ARDUINO_RELEASE_TAG=${ESP8266_ARDUINO_RELEASE_TAG}" >> $GITHUB_ENV
+ - name: Build package JSON
+ env:
+ CI_GITHUB_API_KEY: ${{ secrets.GITHUB_TOKEN }}
+ BUILD_TYPE: package
+ run: |
+ bash ./tests/ci/build_package.sh
+ # Create a draft release and upload the ZIP and JSON files.
+ # This draft is not visible to normal users and needs to be
+ # updated manually with release notes and published from the
+ # GitHub web interface.
+ pip3 install PyGithub
+ python3 ./package/upload_release.py \
+ --user "$GITHUB_ACTOR" \
+ --repo "$GITHUB_REPOSITORY" \
+ --token "$CI_GITHUB_API_KEY" \
+ --tag "$ESP8266_ARDUINO_RELEASE_TAG" \
+ --name "Release ${ESP8266_ARDUINO_RELEASE_TAG}" \
+ --msg "Update the draft with release notes before publishing." \
+ package/versions/*/*.zip package/versions/*/package_esp8266com_index.json
diff --git a/.gitignore b/.gitignore
index 2623c405ad..6413393ea9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,28 @@
.DS_Store
tools/dist/
tools/xtensa-lx106-elf/
-tools/esptool/
tools/mkspiffs/
+tools/mklittlefs/
+tools/python3/
package/versions/
exclude.txt
+
+tests/hosts/lcov/
+
+*.pyc
+*.gch
+
+boards.local.txt
+
+*.gcov
+*.gcno
+*.gcda
+*.o
+*.a
+
+#Ignore files built by Visual Studio/Visual Micro
+[Dd]ebug*/
+[Rr]elease*/
+.vs/
+__vm/
+*.vcxproj*
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000000..ae42999675
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,27 @@
+[submodule "lwip2"]
+ path = tools/sdk/lwip2/builder
+ url = https://github.com/d-a-v/esp82xx-nonos-linklayer.git
+[submodule "tools/sdk/ssl/bearssl"]
+ path = tools/sdk/ssl/bearssl
+ url = https://github.com/earlephilhower/bearssl-esp8266.git
+[submodule "libraries/SoftwareSerial"]
+ path = libraries/SoftwareSerial
+ url = https://github.com/plerup/espsoftwareserial.git
+[submodule "libraries/LittleFS/lib/littlefs"]
+ path = libraries/LittleFS/lib/littlefs
+ url = https://github.com/ARMmbed/littlefs.git
+[submodule "libraries/ESP8266SdFat"]
+ path = libraries/ESP8266SdFat
+ url = https://github.com/earlephilhower/ESP8266SdFat.git
+[submodule "tools/pyserial"]
+ path = tools/pyserial
+ url = https://github.com/pyserial/pyserial.git
+[submodule "tools/esptool"]
+ path = tools/esptool
+ url = https://github.com/espressif/esptool.git
+[submodule "libraries/Ethernet"]
+ path = libraries/Ethernet
+ url = https://github.com/arduino-libraries/Ethernet.git
+[submodule "tools/sdk/uzlib"]
+ path = tools/sdk/uzlib
+ url = https://github.com/pfalcon/uzlib.git
diff --git a/.readthedocs.yaml b/.readthedocs.yaml
new file mode 100644
index 0000000000..867f3d40de
--- /dev/null
+++ b/.readthedocs.yaml
@@ -0,0 +1,21 @@
+# Read the Docs configuration file for Sphinx projects
+# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
+
+# Required
+version: 2
+
+# Set the OS, Python version and other tools you might need
+build:
+ os: ubuntu-24.04
+ tools:
+ python: "3.12"
+
+# Build documentation in the "doc/" directory with Sphinx
+sphinx:
+ configuration: doc/conf.py
+
+# Install same versions as our local tools
+# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html
+python:
+ install:
+ - requirements: doc/requirements.txt
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 0ce5d9c42f..0000000000
--- a/.travis.yml
+++ /dev/null
@@ -1,58 +0,0 @@
-sudo: false
-language: bash
-os:
- - linux
-
-addons:
- apt:
- sources:
- - ubuntu-toolchain-r-test
- packages:
- - g++-4.8
-
-script:
- - set -e
- - export CXX="g++-4.8" CC="gcc-4.8" GCOV="gcov-4.8"
- - echo -e "travis_fold:start:host_tests"
- - pushd $TRAVIS_BUILD_DIR/tests/host
- - make
- - make clean-objects
- - echo -e "travis_fold:end:host_tests"
- - echo -e "travis_fold:start:sketch_test_env_prepare"
- - popd
- - wget -O arduino.tar.xz https://www.arduino.cc/download.php?f=/arduino-nightly-linux64.tar.xz
- - tar xf arduino.tar.xz
- - mv arduino-nightly $HOME/arduino_ide
- - cd $HOME/arduino_ide/hardware
- - mkdir esp8266com
- - cd esp8266com
- - ln -s $TRAVIS_BUILD_DIR esp8266
- - cd esp8266/tools
- - python get.py
- - export PATH="$HOME/arduino_ide:$TRAVIS_BUILD_DIR/tools/xtensa-lx106-elf/bin:$PATH"
- - which arduino
- - cd $TRAVIS_BUILD_DIR
- - source tests/common.sh
- - install_libraries
- - echo -e "travis_fold:end:sketch_test_env_prepare"
- - echo -e "travis_fold:start:sketch_test"
- - build_sketches $HOME/arduino_ide $TRAVIS_BUILD_DIR "-l $HOME/Arduino/libraries"
- - echo -e "travis_fold:end:sketch_test"
- - echo -e "travis_fold:start:size_report"
- - cat size.log
- - echo -e "travis_fold:end:size_report"
-
-after_success:
- - pushd $TRAVIS_BUILD_DIR/tests/host
- - bash <(curl -s https://codecov.io/bash) -X gcov
-
-notifications:
- email:
- on_success: change
- on_failure: change
- webhooks:
- urls:
- - secure: "dnSY+KA7NK+KD+Z71copmANDUsyVePrZ0iXvXxmqMEQv+lp3j2Z87G5pHn7j0WNcNZrejJqOdbElJ9Q4QESRaAYxTR7cA6ameJeEKHiFJrQtN/4abvoXb9E1CxpL8aNON/xgnqCk+fycOK3nbWWXlJBodzBm7KN64vrcHO7et+M="
- on_success: change # options: [always|never|change] default: always
- on_failure: always # options: [always|never|change] default: always
- on_start: false # default: false
diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md
index 041742df4a..51d0688744 100644
--- a/ISSUE_TEMPLATE.md
+++ b/ISSUE_TEMPLATE.md
@@ -1,36 +1,65 @@
+----------------------------- Delete below -----------------------------
-Please fill the info fields, it helps to get you faster support ;)
+If your issue is a general question, starts similar to "How do I..", is related to 3rd party libs, or is related to hardware, please discuss at a community forum like esp8266.com.
-if you have a stack dump decode it:
-https://github.com/esp8266/Arduino/blob/master/doc/Troubleshooting/stack_dump.md
+INSTRUCTIONS
+============
+If you do not follow these instructions, your issue may be dismissed.
-for better debug messages:
-https://github.com/esp8266/Arduino/blob/master/doc/Troubleshooting/debugging.md
+1. Follow the checklist under Basic Infos and fill in the [ ] spaces with an X.
+2. Fill in all the fields under Platform and Settings in IDE marked with [ ] (pick the correct option for you in each case, delete the others).
+3. If you haven't already done so, test your issue against current master branch (aka latest git), because it may have been already fixed.
+4. Describe your problem.
+5. If you have a STACK DUMP decode it:
------------------------------ Remove above -----------------------------
+https://arduino-esp8266.readthedocs.io/en/latest/Troubleshooting/stack_dump.html
+
+6. Include a Minimal Complete Reproducible Example sketch that shows your issue. Do not include your entire project, or a huge piece of code.
+7. Include debug messages:
+
+https://arduino-esp8266.readthedocs.io/en/latest/Troubleshooting/debugging.html
+
+8. Use markup (buttons above) and the Preview tab to check what the issue will look like.
+9. Delete these instructions from the above to the below marker lines before submitting this issue.
+
+
+----------------------------- Delete above -----------------------------
### Basic Infos
-#### Hardware
-Hardware: ?ESP-12?
-Core Version: ?2.1.0-rc2?
+- [ ] This issue complies with the [issue POLICY doc](https://github.com/esp8266/Arduino/blob/master/POLICY.md).
+- [ ] I have read the documentation at [readthedocs](https://arduino-esp8266.readthedocs.io/en/latest) and the issue is not addressed there.
+- [ ] I have tested that the issue is present in current master branch (aka latest git).
+- [ ] I have searched the issue tracker for a similar issue.
+- [ ] If there is a stack dump, I have decoded it.
+- [ ] I have filled out all fields below.
-### Description
+#### Platform
-Problem description
+- Hardware: [ESP-12|ESP-01|ESP-07|ESP8285 device|other]
+- Core Version: [latest git hash or date]
+- Development Env: [Arduino IDE|Platformio|Make|other]
+- Operating System: [Windows|Ubuntu|MacOS]
### Settings in IDE
-Module: ?Generic ESP8266 Module?
-Flash Size: ?4MB/1MB?
-CPU Frequency: ?80Mhz?
-Flash Mode: ?qio?
-Flash Frequency: ?40Mhz?
-Upload Using: ?OTA / SERIAL?
-Reset Method: ?ck / nodemcu?
+- Module: [Generic ESP8266 Module|Wemos D1 mini r2|Nodemcu|other]
+- Flash Mode: [qio|dio|other]
+- Flash Size: [4MB/1MB]
+- lwip Variant: [v1.4|v2 Lower Memory|Higher Bandwidth]
+- Reset Method: [ck|nodemcu]
+- Flash Frequency: [40Mhz]
+- CPU Frequency: [80Mhz|160MHz]
+- Upload Using: [OTA|SERIAL]
+- Upload Speed: [115200|other] (serial upload only)
-### Sketch
+### Problem Description
+
+Detailed problem description goes here.
+
+
+### [MCVE](https://stackoverflow.com/help/mcve) Sketch
```cpp
@@ -43,12 +72,13 @@ void setup() {
void loop() {
}
+
```
### Debug Messages
```
-messages here
+Debug messages go here
```
diff --git a/POLICY.md b/POLICY.md
new file mode 100644
index 0000000000..8ff05c83e5
--- /dev/null
+++ b/POLICY.md
@@ -0,0 +1,67 @@
+This document describes rules that are in effect for this repository, meant for handling issues by contributors in the issue tracker and PRs.
+# Opening New Issues
+1. The issue tracker is precisely that: a tool to track issues in the core code, and not a discussion forum. Opening an issue means that a problem has been found in the core code, and that it should be addressed by a contributor.
+2. When opening an issue, a template is presented with fields to fill out. The requested information is important. If the template is ignored, or not enough info about the issue is provided, the issue may be closed due to lack of info. Example:
+ * Using WifiMulti and FS crashes with error. Why? (no basic info, no IDE settings, no sketch provided)
+3. Questions of type "How do I..." or "Can you please help me with..." or "Can the ESP do..." won't be handled here. Such questions should be directed at a discussion forum, like esp8266.com or stackoverflow. All issues of this type will be closed with a simple reference to the policy. Example:
+ * how do I connect to wifi
+ * how do I connect two ESPs
+ * can I send http data over a public network
+ * my wiring/project/code doesn't work, help!
+4. Issues that are obviously user error, programming language errors, lack of knowledge or experience with the use semantics of the core libs, or similar, will be closed with a reference to the policy. Examples:
+ * sketch crashes due to a char[] in it that is not null terminated
+ * trying to use yield/delay, or libs that use yield/delay, from inside async callbacks
+ * Use of new/malloc without matching delete/free (mem leak)
+5. Issues about topics already handled in the documentation will be closed in a similar manner. Example:
+ * can't flash with error espcomm failed
+6. Issues must be provided with a minimalist sketch. Issues with an incomplete sketch, or a huge sketch, will be closed. Maximum effort must be put forth by the person opening the issue to reduce the relevant code that reproduces the issue, so that investigation can be taken up. MCVE is a must.
+7. Issues for unmerged PRs will be closed. If there is an issue with a PR, the explanation should be added to the PR itself.
+8. Issues with accompanied investigation that shows the root of the problem should be given priority
+9. Duplicate issues will be closed with a reference to the original
+
+# Triaging
+1. Any contributor of the project can participate in the triaging process, if he/she chooses to do so
+2. An issue that needs to be closed, either due to not complying with this policy, or for other reasons, should be closed by a contributor
+3. Issues that are accepted should be marked with appropriate labels, e.g.: component: xyz
+4. If an issue is deemed to require specialized knowledge (e.g.: TLS, HTTP parser, SDK integration, etc), contributor(s) relevant to the affected code should be /cc’ed, as this can help grab attention
+5. Severe issues should be assigned to the current milestone (i.e.: the next version to be released), or the milestone following. It is ok to push back issues depending on available resources.
+6. Issues that could impact functionality for many users should be considered severe.
+7. Issues caused by the SDK or chip should not be marked severe, as there usually isn’t much to be done. Common sense should be applied when deciding. Such issues should be documented in a KID (Known Issues Document), possibly on the Wiki, for reference by users. Example:
+ * ARP issue
+ * Extra channel change beacon announced by the SoftAP
+ * Wakeup ROM bug in the ESP chip
+8. Issues with feature requests should be discussed for viability/desirability. Example:
+ * Support for new board. If the new board is not widely used, doesn’t have a manufacturer webpage, etc, then it isn’t desirable to support it. If the new board is essentially a duplicate of another, it isn’t desirable to duplicate the existing one.
+9. Feature requests or changes that are meant to address a very specific/limited use case, especially if at the expense of increased code complexity, may be denied, or may be required to be redesigned, generalized, or simplified
+10. Feature requests that are not accompanied by a PR:
+ * could be closed immediately (denied)
+ * could be closed after some predetermined period of time (left as candidate for somebody to pick up)
+ * could be deemed interesting enough to work on, but without a specific project or target, and hence accumulated in a long-term feature request list. Such feature requests will in general not be targeted for a deadline or release.
+11. In some cases, feedback may be requested from the issue reporter, either as additional info for clarification, additional testing, or other. If no feedback is provided after 30 days, the issue may be closed by a contributor.
+
+# Compatibility
+1. Compatibility with the Arduino build system is first priority. Compatibility with PlatformIO and make are also maintained, but are second priority.
+2. Feature requests should consider compatibility with Arduino
+ * ESP-specific APIs should be added with care, and should be marked as such (Example: ESP8266WiFi)
+ * APIs of common libraries should maintain compatibility (Example: Wire, SPI, Servo)
+ * ESP-specific extensions to compatible APIs are ok, especially if required to fully use certain peripherals, but such functions should be clearly marked as ESP-specific
+3. When making changes that are likely to impact PlatformIO or make, relevant people should be notified. Check whether some corresponding changes are needed on the build system side. When an issue related to one of these build systems is reported, redirect the issue reporter to the respective issue tracker.
+4. The core libs are implemented as a wrapper layer over the Espressif SDK. Due to the requirements and limitations imposed by the SDK, there are inherent differences between the behavior of this core and the standard Arduino core (Example: using long delay()s is not allowed here). Compatibility can’t be maintained in such cases, and differences should be clearly documented.
+
+# Pull requests
+1. All pull requests should undergo peer review by at least one contributor other than the creator
+2. All pull requests should consider updates to the documentation
+3. All pull requests should consider updates to regression tests, where possible
+4. Pull requests that address an outstanding issue, particularly an issue deemed to be severe, should be given priority
+5. If a PR is accepted, then it should undergo review and updated based on the feedback provided, then merged
+6. Pull requests that don't meet the above will be denied and closed
+
+# Other
+A table should be maintained for relating maintainers and components. When triaging, this is essential to figure out if someone in particular should be consulted about specific changes.
+
+A stable release cadence should be established, e.g.: every 6 months.
+
+Regression testing should be revisited and streamlined with the release process. Running regression tests should be done before merging a PR to reduce overhead for a release.
+
+
+
diff --git a/README.md b/README.md
index cbb7da28a5..21ec6ef397 100644
--- a/README.md
+++ b/README.md
@@ -1,9 +1,17 @@
Arduino core for ESP8266 WiFi chip
===========================================
-This project brings support for ESP8266 chip to the Arduino environment. It lets you write sketches using familiar Arduino functions and libraries, and run them directly on ESP8266, no external microcontroller required.
+# Quick links
-ESP8266 Arduino core comes with libraries to communicate over WiFi using TCP and UDP, set up HTTP, mDNS, SSDP, and DNS servers, do OTA updates, use a file system in flash memory, work with SD cards, servos, SPI and I2C peripherals.
+- [Latest release documentation](https://arduino-esp8266.readthedocs.io/en/3.1.2/)
+- [Current "git version" documentation](https://arduino-esp8266.readthedocs.io/en/latest/)
+- [Install git version](https://arduino-esp8266.readthedocs.io/en/latest/installing.html#using-git-version) ([sources](doc/installing.rst#using-git-version))
+
+# Arduino on ESP8266
+
+This project brings support for the ESP8266 chip to the Arduino environment. It lets you write sketches, using familiar Arduino functions and libraries, and run them directly on ESP8266, with no external microcontroller required.
+
+ESP8266 Arduino core comes with libraries to communicate over WiFi using TCP and UDP, set up HTTP, mDNS, SSDP, and DNS servers, do OTA updates, use a file system in flash memory, and work with SD cards, servos, SPI and I2C peripherals.
# Contents
- Installing options:
@@ -16,97 +24,78 @@ ESP8266 Arduino core comes with libraries to communicate over WiFi using TCP and
- [Contributing](#contributing)
- [License and credits](#license-and-credits)
-### Installing with Boards Manager ###
+### Installing with Boards Manager
Starting with 1.6.4, Arduino allows installation of third-party platform packages using Boards Manager. We have packages available for Windows, Mac OS, and Linux (32 and 64 bit).
-- Install Arduino 1.6.8 from the [Arduino website](http://www.arduino.cc/en/main/software).
-- Start Arduino and open Preferences window.
-- Enter ```http://arduino.esp8266.com/stable/package_esp8266com_index.json``` into *Additional Board Manager URLs* field. You can add multiple URLs, separating them with commas.
+- [Download and install Arduino IDE 1.x or 2.x](https://www.arduino.cc/en/software)
+- Start Arduino and open the Preferences window
+- Enter `https://arduino.esp8266.com/stable/package_esp8266com_index.json` into the *File>Preferences>Additional Boards Manager URLs* field of the Arduino IDE. You can add multiple URLs, separating them with commas.
- Open Boards Manager from Tools > Board menu and install *esp8266* platform (and don't forget to select your ESP8266 board from Tools > Board menu after installation).
-The best place to ask questions related to this core is ESP8266 community forum: http://www.esp8266.com/arduino.
-If you find this forum or the ESP8266 Boards Manager package useful, please consider supporting it with a donation.
-[](https://www.paypal.com/webscr?cmd=_s-xclick&hosted_button_id=4M56YCWV6PX66)
-
-#### Available versions
-
-##### Stable version 
-Boards manager link: `http://arduino.esp8266.com/stable/package_esp8266com_index.json`
+#### Latest release [](https://github.com/esp8266/Arduino/releases/latest/)
+Boards manager link: `https://arduino.esp8266.com/stable/package_esp8266com_index.json`
-Documentation: [http://esp8266.github.io/Arduino/versions/2.1.0/](http://esp8266.github.io/Arduino/versions/2.1.0/)
+Documentation: [https://arduino-esp8266.readthedocs.io/en/3.1.2/](https://arduino-esp8266.readthedocs.io/en/3.1.2/)
-##### Staging version 
-Boards manager link: `http://arduino.esp8266.com/staging/package_esp8266com_index.json`
+### Using git version
-Documentation: [http://esp8266.github.io/Arduino/versions/2.1.0-rc2/](http://esp8266.github.io/Arduino/versions/2.1.0-rc2/)
+Also known as latest git or master branch.
-### Using git version
-[](https://travis-ci.org/esp8266/Arduino) [](https://codecov.io/github/esp8266/Arduino?branch=master)
-
-- Install Arduino 1.6.8
-- Go to Arduino directory
-- Clone this repository into hardware/esp8266com/esp8266 directory (or clone it elsewhere and create a symlink)
-```bash
-cd hardware
-mkdir esp8266com
-cd esp8266com
-git clone https://github.com/esp8266/Arduino.git esp8266
-```
-- Download binary tools (you need Python 2.7)
-```bash
-cd esp8266/tools
-python get.py
-```
-- Restart Arduino
+- When using [Arduino IDE](https://www.arduino.cc/en/software), follow [our instructions here](https://arduino-esp8266.readthedocs.io/en/latest/installing.html#using-git-version).
+- When using [PlatformIO](https://platformio.org/install), refer to [platformio/espressif8266 platform documentation](https://docs.platformio.org/en/stable/platforms/espressif8266.html#using-arduino-framework-with-staging-version).
### Using PlatformIO
-[PlatformIO](http://platformio.org) is an open source ecosystem for IoT
-development with cross platform build system, library manager and full support
-for Espressif (ESP8266) development. It works on the popular host OS: Mac OS X, Windows,
-Linux 32/64, Linux ARM (like Raspberry Pi, BeagleBone, CubieBoard).
+[PlatformIO](https://platformio.org?utm_source=arduino-esp8266) is an open source ecosystem for IoT
+development with a cross-platform build system, a library manager, and full support
+for Espressif (ESP8266) development. It works on the following popular host operating systems: macOS, Windows,
+Linux 32/64, and Linux ARM (like Raspberry Pi, BeagleBone, CubieBoard).
-- [What is PlatformIO?](http://docs.platformio.org/en/latest/what-is-platformio.html)
-- [PlatformIO IDE](http://platformio.org/#!/platformio-ide)
-- Quick Start with [PlatformIO IDE](http://docs.platformio.org/en/latest/ide/atom.html#quick-start) or [PlatformIO CLI](http://docs.platformio.org/en/latest/quickstart.html)
-- [Advanced using](http://docs.platformio.org/en/latest/platforms/espressif.html) -
- custom settings, uploading to SPIFFS, Over-the-Air (OTA) or using stage version
-- [Integration with other IDE](http://docs.platformio.org/en/latest/ide.html) -
- Atom, CLion, Eclipse, Emacs, NetBeans, Qt Creator, Sublime Text, VIM and Visual Studio
-- [Project Examples](http://docs.platformio.org/en/latest/platforms/espressif.html#examples)
+- [What is PlatformIO?](https://docs.platformio.org/en/latest/what-is-platformio.html?utm_source=arduino-esp8266)
+- [PlatformIO IDE](https://platformio.org/platformio-ide?utm_source=arduino-esp8266)
+- [PlatformIO Core](https://docs.platformio.org/en/latest/core.html?utm_source=arduino-esp8266) (command line tool)
+- [Advanced usage](https://docs.platformio.org/en/latest/platforms/espressif8266.html?utm_source=arduino-esp8266) -
+ custom settings, uploading to SPIFFS, Over-the-Air (OTA), staging version
+- [Integration with Cloud and Standalone IDEs](https://docs.platformio.org/en/latest/ide.html?utm_source=arduino-esp8266) -
+ Cloud9, Codeanywhere, Eclipse Che (Codenvy), Atom, CLion, Eclipse, Emacs, NetBeans, Qt Creator, Sublime Text, VIM, Visual Studio, and VSCode
+- [Project Examples](https://docs.platformio.org/en/latest/platforms/espressif8266.html?utm_source=arduino-esp8266#examples)
### Building with make
[makeEspArduino](https://github.com/plerup/makeEspArduino) is a generic makefile for any ESP8266 Arduino project.
Using make instead of the Arduino IDE makes it easier to do automated and production builds.
-
### Documentation
-Documentation for latest development version:
-
-- [Reference](doc/reference.md)
-- [Libraries](doc/libraries.md)
-- [File system](doc/filesystem.md)
-- [OTA update](doc/ota_updates/readme.md)
-- [Supported boards](doc/boards.md)
-- [Change log](doc/changes.md)
+Documentation for latest development version: https://arduino-esp8266.readthedocs.io/en/latest/
### Issues and support ###
-If you encounter an issue, you are welcome to submit it here on Github: https://github.com/esp8266/Arduino/issues.
-Please provide as much context as possible: version which you are using (you can check it in Boards Manager), your sketch code, serial output, board model, IDE settings (board selection, flash size, etc).
+[ESP8266 Community Forum](https://www.esp8266.com/u/arduinoanswers) is a well-established community for questions and answers about Arduino for ESP8266. Stackoverflow is also an alternative. If you need help, have a "How do I..." type question, have a problem with a 3rd party library not hosted in this repo, or just want to discuss how to approach a problem, please ask there.
+
+If you find the forum useful, please consider supporting it with a donation.
+[](https://www.paypal.com/webscr?cmd=_s-xclick&hosted_button_id=4M56YCWV6PX66)
+
+If you encounter an issue which you think is a bug in the ESP8266 Arduino Core or the associated libraries, or if you want to propose an enhancement, you are welcome to submit it here on Github: https://github.com/esp8266/Arduino/issues.
+
+Please provide as much context as possible, as well as the information requested in the issue template:
-If you can not find the answers above, you can also try [ESP8266 Community Forum](http://www.esp8266.com/arduino)
+- ESP8266 Arduino core version which you are using (you can check it in Boards Manager)
+- your sketch code; please wrap it into a code block, see [Github markdown manual](https://help.github.com/articles/basic-writing-and-formatting-syntax/#quoting-code)
+- when encountering an issue that happens at run time, attach the serial output. Wrap it into a code block, just like the code.
+- for issues that happen at compile time, enable verbose compiler output in the IDE preferences, and attach that output (also inside a code block)
+- ESP8266 development board model
+- IDE settings (board choice, flash size)
+- etc
### Contributing
-For minor fixes of code and documentation, go ahead and submit a pull request.
+For minor fixes of code and documentation, please go ahead and submit a pull request. A gentle introduction to the process can be found [here](https://www.freecodecamp.org/news/a-simple-git-guide-and-cheat-sheet-for-open-source-contributors/).
-Check out the list of issues which are easy to fix — [easy issues for 2.2.0](https://github.com/esp8266/Arduino/issues?q=is%3Aopen+is%3Aissue+milestone%3A2.2.0+label%3A%22level%3A+easy%22). Working on them is a great way to move the project forward.
+Check out the list of issues that are easy to fix — [easy issues pending](https://github.com/esp8266/Arduino/issues?q=is%3Aopen+is%3Aissue+label%3A%22level%3A+easy%22). Working on them is a great way to move the project forward.
-Larger changes (rewriting parts of existing code from scratch, adding new functions to the core, adding new libraries) should generally be discussed [in the chat](https://gitter.im/esp8266/Arduino) first.
+Larger changes (rewriting parts of existing code from scratch, adding new functions to the core, adding new libraries) should generally be discussed by opening an issue first. PRs with such changes require testing and approval.
Feature branches with lots of small commits (especially titled "oops", "fix typo", "forgot to add file", etc.) should be squashed before opening a pull request. At the same time, please refrain from putting multiple unrelated changes into a single pull request.
@@ -116,12 +105,32 @@ Arduino IDE is developed and maintained by the Arduino team. The IDE is licensed
ESP8266 core includes an xtensa gcc toolchain, which is also under GPL.
-Esptool written by Christian Klippel is licensed under GPLv2, currently maintained by Ivan Grokhotkov: https://github.com/igrr/esptool-ck.
+Esptool.py was initially created by Fredrik Ahlberg (@themadinventor, @kongo), and is currently maintained by Angus Gratton (@projectgus) under GPL 2.0 license.
-Espressif SDK included in this build is under Espressif MIT License.
+[Espressif's NONOS SDK](https://github.com/espressif/ESP8266_NONOS_SDK) included in this build is under Espressif MIT License.
ESP8266 core files are licensed under LGPL.
-[SPI Flash File System (SPIFFS)](https://github.com/pellepl/spiffs) written by Peter Andersson is used in this project. It is distributed under MIT license.
+[SPI Flash File System (SPIFFS)](https://github.com/pellepl/spiffs) written by Peter Andersson is used in this project. It is distributed under the MIT license.
+
+[umm_malloc](https://github.com/rhempel/umm_malloc) memory management library written by Ralph Hempel is used in this project. It is distributed under the MIT license.
+
+[SoftwareSerial](https://github.com/plerup/espsoftwareserial) library and examples written by Peter Lerup. Distributed under LGPL 2.1.
+
+[BearSSL](https://bearssl.org) library written by Thomas Pornin, built from https://github.com/earlephilhower/bearssl-esp8266, is used in this project. It is distributed under the [MIT License](https://bearssl.org/#legal-details).
+
+[LittleFS](https://github.com/ARMmbed/littlefs) library written by ARM Limited and released under the [BSD 3-clause license](https://github.com/ARMmbed/littlefs/blob/master/LICENSE.md).
+
+[uzlib](https://github.com/pfalcon/uzlib) library written and (c) 2014-2018 Paul Sokolovsky, licensed under the ZLib license (https://www.zlib.net/zlib_license.html). uzlib is based on: tinf library by Joergen Ibsen (Deflate decompression); Deflate Static Huffman tree routines by Simon Tatham; LZ77 compressor by Paul Sokolovsky; with library integrated and maintained by Paul Sokolovsky.
+
+### Other useful links ###
+
+[Toolchain repo](https://github.com/earlephilhower/esp-quick-toolchain)
+
+[Lwip link layer repo](https://github.com/d-a-v/esp82xx-nonos-linklayer)
+
+[SoftwareSerial repo](https://github.com/plerup/espsoftwareserial)
+
+[Serial Monitor Arduino IDE plugin](https://github.com/mytrain/arduino-esp8266-serial-plugin) Original discussion [here](https://github.com/esp8266/Arduino/issues/1360), quick download [there](http://mytrain.fr/cms//images/mytrain/private/ESP8266SM.v3.zip).
-[umm_malloc](https://github.com/rhempel/umm_malloc) memory management library written by Ralph Hempel is used in this project. It is distributed under MIT license.
+[FTP Client/Server Library](https://github.com/dplasa/FTPClientServer)
diff --git a/boards.txt b/boards.txt
index 70ff0b8b0e..1b44fe3310 100644
--- a/boards.txt
+++ b/boards.txt
@@ -1,1334 +1,9538 @@
-menu.UploadSpeed=Upload Speed
-menu.CpuFrequency=CPU Frequency
-menu.FlashSize=Flash Size
+#
+# Do not create pull-requests for this file only, CI will not accept them.
+# You *must* edit/modify/run boards.txt.py to regenerate boards.txt.
+# All modified files after running with option "--allgen" must be included in the pull-request.
+#
+
+menu.BoardModel=Model
+menu.ESPModule=Module
+menu.UploadTool=Upload Tool
+menu.led=Builtin Led
+menu.baud=Upload Speed
+menu.xtal=CPU Frequency
+menu.CrystalFreq=Crystal Frequency
+menu.eesz=Flash Size
menu.FlashMode=Flash Mode
menu.FlashFreq=Flash Frequency
menu.ResetMethod=Reset Method
-menu.ESPModule=Module
-menu.Debug=Debug port
-menu.DebugLevel=Debug Level
+menu.dbg=Debug port
+menu.lvl=Debug Level
+menu.optim=Debug Optimization
+menu.ip=lwIP Variant
+menu.vt=VTables
+menu.exception=C++ Exceptions
+menu.stacksmash=Stack Protection
+menu.wipe=Erase Flash
+menu.sdk=NONOS SDK Version
+menu.iramfloat=Floating Point operations
+menu.ssl=SSL Support
+menu.mmu=MMU
+menu.non32xfer=Non-32-Bit Access
##############################################################
generic.name=Generic ESP8266 Module
-
+generic.build.board=ESP8266_GENERIC
generic.upload.tool=esptool
-generic.upload.speed=115200
-generic.upload.resetmethod=ck
-generic.upload.maximum_size=434160
generic.upload.maximum_data_size=81920
generic.upload.wait_for_upload_port=true
+generic.upload.erase_cmd=
generic.serial.disableDTR=true
generic.serial.disableRTS=true
-
generic.build.mcu=esp8266
-generic.build.f_cpu=80000000L
-generic.build.board=ESP8266_ESP01
generic.build.core=esp8266
generic.build.variant=generic
-generic.build.flash_mode=qio
generic.build.spiffs_pagesize=256
+generic.build.debug_optim=
generic.build.debug_port=
generic.build.debug_level=
-
-generic.menu.CpuFrequency.80=80 MHz
-generic.menu.CpuFrequency.80.build.f_cpu=80000000L
-generic.menu.CpuFrequency.160=160 MHz
-generic.menu.CpuFrequency.160.build.f_cpu=160000000L
-
+generic.menu.xtal.80=80 MHz
+generic.menu.xtal.80.build.f_cpu=80000000L
+generic.menu.xtal.160=160 MHz
+generic.menu.xtal.160.build.f_cpu=160000000L
+generic.menu.vt.flash=Flash
+generic.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+generic.menu.vt.heap=Heap
+generic.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+generic.menu.vt.iram=IRAM
+generic.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+generic.menu.exception.disabled=Disabled (new aborts on oom)
+generic.menu.exception.disabled.build.exception_flags=-fno-exceptions
+generic.menu.exception.disabled.build.stdcpp_lib=-lstdc++
+generic.menu.exception.enabled=Enabled
+generic.menu.exception.enabled.build.exception_flags=-fexceptions
+generic.menu.exception.enabled.build.stdcpp_lib=-lstdc++-exc
+generic.menu.stacksmash.disabled=Disabled
+generic.menu.stacksmash.disabled.build.stacksmash_flags=
+generic.menu.stacksmash.enabled=Enabled
+generic.menu.stacksmash.enabled.build.stacksmash_flags=-fstack-protector
+generic.menu.ssl.all=All SSL ciphers (most compatible)
+generic.menu.ssl.all.build.sslflags=
+generic.menu.ssl.basic=Basic SSL ciphers (lower ROM use)
+generic.menu.ssl.basic.build.sslflags=-DBEARSSL_SSL_BASIC
+generic.menu.mmu.3232=32KB cache + 32KB IRAM (balanced)
+generic.menu.mmu.3232.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+generic.menu.mmu.4816=16KB cache + 48KB IRAM (IRAM)
+generic.menu.mmu.4816.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000
+generic.menu.mmu.4816H=16KB cache + 48KB IRAM and 2nd Heap (shared)
+generic.menu.mmu.4816H.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_IRAM_HEAP
+generic.menu.mmu.3216=16KB cache + 32KB IRAM + 16KB 2nd Heap (not shared)
+generic.menu.mmu.3216.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_SEC_HEAP=0x40108000 -DMMU_SEC_HEAP_SIZE=0x4000
+generic.menu.mmu.ext128k=128K Heap External 23LC1024
+generic.menu.mmu.ext128k.build.mmuflags=-DMMU_EXTERNAL_HEAP=128 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+generic.menu.mmu.ext8192k=8M w/256K Heap External 64 MBit PSRAM
+generic.menu.mmu.ext8192k.build.mmuflags=-DMMU_EXTERNAL_HEAP=256 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+generic.menu.non32xfer.fast=Use pgm_read macros for IRAM/PROGMEM
+generic.menu.non32xfer.fast.build.non32xferflags=
+generic.menu.non32xfer.safe=Byte/Word access to IRAM/PROGMEM (very slow)
+generic.menu.non32xfer.safe.build.non32xferflags=-DNON32XFER_HANDLER
+generic.menu.ResetMethod.nodemcu=dtr (aka nodemcu)
+generic.menu.ResetMethod.nodemcu.upload.resetmethod=--before default_reset --after hard_reset
+generic.menu.ResetMethod.ck=no dtr (aka ck)
+generic.menu.ResetMethod.ck.upload.resetmethod=--before no_reset --after soft_reset
+generic.menu.ResetMethod.nodtr_nosync=no dtr, no_sync
+generic.menu.ResetMethod.nodtr_nosync.upload.resetmethod=--before no_reset_no_sync --after soft_reset
+generic.menu.CrystalFreq.26=26 MHz
+generic.menu.CrystalFreq.40=40 MHz
+generic.menu.CrystalFreq.40.build.extra_flags=-DF_CRYSTAL=40000000
generic.menu.FlashFreq.40=40MHz
generic.menu.FlashFreq.40.build.flash_freq=40
generic.menu.FlashFreq.80=80MHz
generic.menu.FlashFreq.80.build.flash_freq=80
-
+generic.menu.FlashFreq.20=20MHz
+generic.menu.FlashFreq.20.build.flash_freq=20
+generic.menu.FlashFreq.26=26MHz
+generic.menu.FlashFreq.26.build.flash_freq=26
+generic.menu.FlashMode.dout=DOUT (compatible)
+generic.menu.FlashMode.dout.build.flash_mode=dout
+generic.menu.FlashMode.dout.build.flash_flags=-DFLASHMODE_DOUT
generic.menu.FlashMode.dio=DIO
generic.menu.FlashMode.dio.build.flash_mode=dio
-generic.menu.FlashMode.qio=QIO
+generic.menu.FlashMode.dio.build.flash_flags=-DFLASHMODE_DIO
+generic.menu.FlashMode.qout=QOUT
+generic.menu.FlashMode.qout.build.flash_mode=qout
+generic.menu.FlashMode.qout.build.flash_flags=-DFLASHMODE_QOUT
+generic.menu.FlashMode.qio=QIO (fast)
generic.menu.FlashMode.qio.build.flash_mode=qio
+generic.menu.FlashMode.qio.build.flash_flags=-DFLASHMODE_QIO
+generic.menu.eesz.1M64=1MB (FS:64KB OTA:~470KB)
+generic.menu.eesz.1M64.build.flash_size=1M
+generic.menu.eesz.1M64.build.flash_ld=eagle.flash.1m64.ld
+generic.menu.eesz.1M64.build.spiffs_pagesize=256
+generic.menu.eesz.1M64.build.rfcal_addr=0xFC000
+generic.menu.eesz.1M64.build.spiffs_start=0xEB000
+generic.menu.eesz.1M64.build.spiffs_end=0xFB000
+generic.menu.eesz.1M64.build.spiffs_blocksize=4096
+generic.menu.eesz.1M128=1MB (FS:128KB OTA:~438KB)
+generic.menu.eesz.1M128.build.flash_size=1M
+generic.menu.eesz.1M128.build.flash_ld=eagle.flash.1m128.ld
+generic.menu.eesz.1M128.build.spiffs_pagesize=256
+generic.menu.eesz.1M128.build.rfcal_addr=0xFC000
+generic.menu.eesz.1M128.build.spiffs_start=0xDB000
+generic.menu.eesz.1M128.build.spiffs_end=0xFB000
+generic.menu.eesz.1M128.build.spiffs_blocksize=4096
+generic.menu.eesz.1M144=1MB (FS:144KB OTA:~430KB)
+generic.menu.eesz.1M144.build.flash_size=1M
+generic.menu.eesz.1M144.build.flash_ld=eagle.flash.1m144.ld
+generic.menu.eesz.1M144.build.spiffs_pagesize=256
+generic.menu.eesz.1M144.build.rfcal_addr=0xFC000
+generic.menu.eesz.1M144.build.spiffs_start=0xD7000
+generic.menu.eesz.1M144.build.spiffs_end=0xFB000
+generic.menu.eesz.1M144.build.spiffs_blocksize=4096
+generic.menu.eesz.1M160=1MB (FS:160KB OTA:~422KB)
+generic.menu.eesz.1M160.build.flash_size=1M
+generic.menu.eesz.1M160.build.flash_ld=eagle.flash.1m160.ld
+generic.menu.eesz.1M160.build.spiffs_pagesize=256
+generic.menu.eesz.1M160.build.rfcal_addr=0xFC000
+generic.menu.eesz.1M160.build.spiffs_start=0xD3000
+generic.menu.eesz.1M160.build.spiffs_end=0xFB000
+generic.menu.eesz.1M160.build.spiffs_blocksize=4096
+generic.menu.eesz.1M192=1MB (FS:192KB OTA:~406KB)
+generic.menu.eesz.1M192.build.flash_size=1M
+generic.menu.eesz.1M192.build.flash_ld=eagle.flash.1m192.ld
+generic.menu.eesz.1M192.build.spiffs_pagesize=256
+generic.menu.eesz.1M192.build.rfcal_addr=0xFC000
+generic.menu.eesz.1M192.build.spiffs_start=0xCB000
+generic.menu.eesz.1M192.build.spiffs_end=0xFB000
+generic.menu.eesz.1M192.build.spiffs_blocksize=4096
+generic.menu.eesz.1M256=1MB (FS:256KB OTA:~374KB)
+generic.menu.eesz.1M256.build.flash_size=1M
+generic.menu.eesz.1M256.build.flash_ld=eagle.flash.1m256.ld
+generic.menu.eesz.1M256.build.spiffs_pagesize=256
+generic.menu.eesz.1M256.build.rfcal_addr=0xFC000
+generic.menu.eesz.1M256.build.spiffs_start=0xBB000
+generic.menu.eesz.1M256.build.spiffs_end=0xFB000
+generic.menu.eesz.1M256.build.spiffs_blocksize=4096
+generic.menu.eesz.1M512=1MB (FS:512KB OTA:~246KB)
+generic.menu.eesz.1M512.build.flash_size=1M
+generic.menu.eesz.1M512.build.flash_ld=eagle.flash.1m512.ld
+generic.menu.eesz.1M512.build.spiffs_pagesize=256
+generic.menu.eesz.1M512.build.rfcal_addr=0xFC000
+generic.menu.eesz.1M512.build.spiffs_start=0x7B000
+generic.menu.eesz.1M512.build.spiffs_end=0xFB000
+generic.menu.eesz.1M512.build.spiffs_blocksize=8192
+generic.menu.eesz.1M=1MB (FS:none OTA:~502KB)
+generic.menu.eesz.1M.build.flash_size=1M
+generic.menu.eesz.1M.build.flash_ld=eagle.flash.1m.ld
+generic.menu.eesz.1M.build.spiffs_pagesize=256
+generic.menu.eesz.1M.build.rfcal_addr=0xFC000
+generic.menu.eesz.2M64=2MB (FS:64KB OTA:~992KB)
+generic.menu.eesz.2M64.build.flash_size=2M
+generic.menu.eesz.2M64.build.flash_ld=eagle.flash.2m64.ld
+generic.menu.eesz.2M64.build.spiffs_pagesize=256
+generic.menu.eesz.2M64.build.rfcal_addr=0x1FC000
+generic.menu.eesz.2M64.build.spiffs_start=0x1F0000
+generic.menu.eesz.2M64.build.spiffs_end=0x1FB000
+generic.menu.eesz.2M64.build.spiffs_blocksize=4096
+generic.menu.eesz.2M128=2MB (FS:128KB OTA:~960KB)
+generic.menu.eesz.2M128.build.flash_size=2M
+generic.menu.eesz.2M128.build.flash_ld=eagle.flash.2m128.ld
+generic.menu.eesz.2M128.build.spiffs_pagesize=256
+generic.menu.eesz.2M128.build.rfcal_addr=0x1FC000
+generic.menu.eesz.2M128.build.spiffs_start=0x1E0000
+generic.menu.eesz.2M128.build.spiffs_end=0x1FB000
+generic.menu.eesz.2M128.build.spiffs_blocksize=4096
+generic.menu.eesz.2M256=2MB (FS:256KB OTA:~896KB)
+generic.menu.eesz.2M256.build.flash_size=2M
+generic.menu.eesz.2M256.build.flash_ld=eagle.flash.2m256.ld
+generic.menu.eesz.2M256.build.spiffs_pagesize=256
+generic.menu.eesz.2M256.build.rfcal_addr=0x1FC000
+generic.menu.eesz.2M256.build.spiffs_start=0x1C0000
+generic.menu.eesz.2M256.build.spiffs_end=0x1FB000
+generic.menu.eesz.2M256.build.spiffs_blocksize=4096
+generic.menu.eesz.2M512=2MB (FS:512KB OTA:~768KB)
+generic.menu.eesz.2M512.build.flash_size=2M
+generic.menu.eesz.2M512.build.flash_ld=eagle.flash.2m512.ld
+generic.menu.eesz.2M512.build.spiffs_pagesize=256
+generic.menu.eesz.2M512.build.rfcal_addr=0x1FC000
+generic.menu.eesz.2M512.build.spiffs_start=0x180000
+generic.menu.eesz.2M512.build.spiffs_end=0x1FA000
+generic.menu.eesz.2M512.build.spiffs_blocksize=8192
+generic.menu.eesz.2M1M=2MB (FS:1MB OTA:~512KB)
+generic.menu.eesz.2M1M.build.flash_size=2M
+generic.menu.eesz.2M1M.build.flash_ld=eagle.flash.2m1m.ld
+generic.menu.eesz.2M1M.build.spiffs_pagesize=256
+generic.menu.eesz.2M1M.build.rfcal_addr=0x1FC000
+generic.menu.eesz.2M1M.build.spiffs_start=0x100000
+generic.menu.eesz.2M1M.build.spiffs_end=0x1FA000
+generic.menu.eesz.2M1M.build.spiffs_blocksize=8192
+generic.menu.eesz.2M=2MB (FS:none OTA:~1019KB)
+generic.menu.eesz.2M.build.flash_size=2M
+generic.menu.eesz.2M.build.flash_ld=eagle.flash.2m.ld
+generic.menu.eesz.2M.build.spiffs_pagesize=256
+generic.menu.eesz.2M.build.rfcal_addr=0x1FC000
+generic.menu.eesz.4M2M=4MB (FS:2MB OTA:~1019KB)
+generic.menu.eesz.4M2M.build.flash_size=4M
+generic.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
+generic.menu.eesz.4M2M.build.spiffs_pagesize=256
+generic.menu.eesz.4M2M.build.rfcal_addr=0x3FC000
+generic.menu.eesz.4M2M.build.spiffs_start=0x200000
+generic.menu.eesz.4M2M.build.spiffs_end=0x3FA000
+generic.menu.eesz.4M2M.build.spiffs_blocksize=8192
+generic.menu.eesz.4M3M=4MB (FS:3MB OTA:~512KB)
+generic.menu.eesz.4M3M.build.flash_size=4M
+generic.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
+generic.menu.eesz.4M3M.build.spiffs_pagesize=256
+generic.menu.eesz.4M3M.build.rfcal_addr=0x3FC000
+generic.menu.eesz.4M3M.build.spiffs_start=0x100000
+generic.menu.eesz.4M3M.build.spiffs_end=0x3FA000
+generic.menu.eesz.4M3M.build.spiffs_blocksize=8192
+generic.menu.eesz.4M1M=4MB (FS:1MB OTA:~1019KB)
+generic.menu.eesz.4M1M.build.flash_size=4M
+generic.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
+generic.menu.eesz.4M1M.build.spiffs_pagesize=256
+generic.menu.eesz.4M1M.build.rfcal_addr=0x3FC000
+generic.menu.eesz.4M1M.build.spiffs_start=0x300000
+generic.menu.eesz.4M1M.build.spiffs_end=0x3FA000
+generic.menu.eesz.4M1M.build.spiffs_blocksize=8192
+generic.menu.eesz.4M=4MB (FS:none OTA:~1019KB)
+generic.menu.eesz.4M.build.flash_size=4M
+generic.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
+generic.menu.eesz.4M.build.spiffs_pagesize=256
+generic.menu.eesz.4M.build.rfcal_addr=0x3FC000
+generic.menu.eesz.8M6M=8MB (FS:6MB OTA:~1019KB)
+generic.menu.eesz.8M6M.build.flash_size=8M
+generic.menu.eesz.8M6M.build.flash_ld=eagle.flash.8m6m.ld
+generic.menu.eesz.8M6M.build.spiffs_pagesize=256
+generic.menu.eesz.8M6M.build.rfcal_addr=0x7FC000
+generic.menu.eesz.8M6M.build.spiffs_start=0x200000
+generic.menu.eesz.8M6M.build.spiffs_end=0x7FA000
+generic.menu.eesz.8M6M.build.spiffs_blocksize=8192
+generic.menu.eesz.8M7M=8MB (FS:7MB OTA:~512KB)
+generic.menu.eesz.8M7M.build.flash_size=8M
+generic.menu.eesz.8M7M.build.flash_ld=eagle.flash.8m7m.ld
+generic.menu.eesz.8M7M.build.spiffs_pagesize=256
+generic.menu.eesz.8M7M.build.rfcal_addr=0x7FC000
+generic.menu.eesz.8M7M.build.spiffs_start=0x100000
+generic.menu.eesz.8M7M.build.spiffs_end=0x7FA000
+generic.menu.eesz.8M7M.build.spiffs_blocksize=8192
+generic.menu.eesz.8M=8MB (FS:none OTA:~1019KB)
+generic.menu.eesz.8M.build.flash_size=8M
+generic.menu.eesz.8M.build.flash_ld=eagle.flash.8m.ld
+generic.menu.eesz.8M.build.spiffs_pagesize=256
+generic.menu.eesz.8M.build.rfcal_addr=0x7FC000
+generic.menu.eesz.16M14M=16MB (FS:14MB OTA:~1019KB)
+generic.menu.eesz.16M14M.build.flash_size=16M
+generic.menu.eesz.16M14M.build.flash_ld=eagle.flash.16m14m.ld
+generic.menu.eesz.16M14M.build.spiffs_pagesize=256
+generic.menu.eesz.16M14M.build.rfcal_addr=0xFFC000
+generic.menu.eesz.16M14M.build.spiffs_start=0x200000
+generic.menu.eesz.16M14M.build.spiffs_end=0xFFA000
+generic.menu.eesz.16M14M.build.spiffs_blocksize=8192
+generic.menu.eesz.16M15M=16MB (FS:15MB OTA:~512KB)
+generic.menu.eesz.16M15M.build.flash_size=16M
+generic.menu.eesz.16M15M.build.flash_ld=eagle.flash.16m15m.ld
+generic.menu.eesz.16M15M.build.spiffs_pagesize=256
+generic.menu.eesz.16M15M.build.rfcal_addr=0xFFC000
+generic.menu.eesz.16M15M.build.spiffs_start=0x100000
+generic.menu.eesz.16M15M.build.spiffs_end=0xFFA000
+generic.menu.eesz.16M15M.build.spiffs_blocksize=8192
+generic.menu.eesz.16M=16MB (FS:none OTA:~1019KB)
+generic.menu.eesz.16M.build.flash_size=16M
+generic.menu.eesz.16M.build.flash_ld=eagle.flash.16m.ld
+generic.menu.eesz.16M.build.spiffs_pagesize=256
+generic.menu.eesz.16M.build.rfcal_addr=0xFFC000
+generic.menu.eesz.512K32=512KB (FS:32KB OTA:~230KB)
+generic.menu.eesz.512K32.build.flash_size=512K
+generic.menu.eesz.512K32.build.flash_ld=eagle.flash.512k32.ld
+generic.menu.eesz.512K32.build.spiffs_pagesize=256
+generic.menu.eesz.512K32.build.rfcal_addr=0x7C000
+generic.menu.eesz.512K32.build.spiffs_start=0x73000
+generic.menu.eesz.512K32.build.spiffs_end=0x7B000
+generic.menu.eesz.512K32.build.spiffs_blocksize=4096
+generic.menu.eesz.512K64=512KB (FS:64KB OTA:~214KB)
+generic.menu.eesz.512K64.build.flash_size=512K
+generic.menu.eesz.512K64.build.flash_ld=eagle.flash.512k64.ld
+generic.menu.eesz.512K64.build.spiffs_pagesize=256
+generic.menu.eesz.512K64.build.rfcal_addr=0x7C000
+generic.menu.eesz.512K64.build.spiffs_start=0x6B000
+generic.menu.eesz.512K64.build.spiffs_end=0x7B000
+generic.menu.eesz.512K64.build.spiffs_blocksize=4096
+generic.menu.eesz.512K128=512KB (FS:128KB OTA:~182KB)
+generic.menu.eesz.512K128.build.flash_size=512K
+generic.menu.eesz.512K128.build.flash_ld=eagle.flash.512k128.ld
+generic.menu.eesz.512K128.build.spiffs_pagesize=256
+generic.menu.eesz.512K128.build.rfcal_addr=0x7C000
+generic.menu.eesz.512K128.build.spiffs_start=0x5B000
+generic.menu.eesz.512K128.build.spiffs_end=0x7B000
+generic.menu.eesz.512K128.build.spiffs_blocksize=4096
+generic.menu.eesz.512K=512KB (FS:none OTA:~246KB)
+generic.menu.eesz.512K.build.flash_size=512K
+generic.menu.eesz.512K.build.flash_ld=eagle.flash.512k.ld
+generic.menu.eesz.512K.build.spiffs_pagesize=256
+generic.menu.eesz.512K.build.rfcal_addr=0x7C000
+generic.menu.led.2=2
+generic.menu.led.2.build.led=-DLED_BUILTIN=2
+generic.menu.led.0=0
+generic.menu.led.0.build.led=-DLED_BUILTIN=0
+generic.menu.led.1=1
+generic.menu.led.1.build.led=-DLED_BUILTIN=1
+generic.menu.led.3=3
+generic.menu.led.3.build.led=-DLED_BUILTIN=3
+generic.menu.led.4=4
+generic.menu.led.4.build.led=-DLED_BUILTIN=4
+generic.menu.led.5=5
+generic.menu.led.5.build.led=-DLED_BUILTIN=5
+generic.menu.led.6=6
+generic.menu.led.6.build.led=-DLED_BUILTIN=6
+generic.menu.led.7=7
+generic.menu.led.7.build.led=-DLED_BUILTIN=7
+generic.menu.led.8=8
+generic.menu.led.8.build.led=-DLED_BUILTIN=8
+generic.menu.led.9=9
+generic.menu.led.9.build.led=-DLED_BUILTIN=9
+generic.menu.led.10=10
+generic.menu.led.10.build.led=-DLED_BUILTIN=10
+generic.menu.led.11=11
+generic.menu.led.11.build.led=-DLED_BUILTIN=11
+generic.menu.led.12=12
+generic.menu.led.12.build.led=-DLED_BUILTIN=12
+generic.menu.led.13=13
+generic.menu.led.13.build.led=-DLED_BUILTIN=13
+generic.menu.led.14=14
+generic.menu.led.14.build.led=-DLED_BUILTIN=14
+generic.menu.led.15=15
+generic.menu.led.15.build.led=-DLED_BUILTIN=15
+generic.menu.led.16=16
+generic.menu.led.16.build.led=-DLED_BUILTIN=16
+generic.menu.sdk.nonosdk_190703=nonos-sdk 2.2.1+100 (190703)
+generic.menu.sdk.nonosdk_190703.build.sdk=NONOSDK22x_190703
+generic.menu.sdk.nonosdk_191122=nonos-sdk 2.2.1+119 (191122)
+generic.menu.sdk.nonosdk_191122.build.sdk=NONOSDK22x_191122
+generic.menu.sdk.nonosdk_191105=nonos-sdk 2.2.1+113 (191105)
+generic.menu.sdk.nonosdk_191105.build.sdk=NONOSDK22x_191105
+generic.menu.sdk.nonosdk_191024=nonos-sdk 2.2.1+111 (191024)
+generic.menu.sdk.nonosdk_191024.build.sdk=NONOSDK22x_191024
+generic.menu.sdk.nonosdk_190313=nonos-sdk 2.2.1+61 (190313)
+generic.menu.sdk.nonosdk_190313.build.sdk=NONOSDK22x_190313
+generic.menu.sdk.nonosdk221=nonos-sdk 2.2.1 (legacy)
+generic.menu.sdk.nonosdk221.build.sdk=NONOSDK221
+generic.menu.sdk.nonosdk305=nonos-sdk 3.0.5 (experimental)
+generic.menu.sdk.nonosdk305.build.sdk=NONOSDK305
+generic.menu.ip.lm2f=v2 Lower Memory
+generic.menu.ip.lm2f.build.lwip_include=lwip2/include
+generic.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+generic.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+generic.menu.ip.hb2f=v2 Higher Bandwidth
+generic.menu.ip.hb2f.build.lwip_include=lwip2/include
+generic.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+generic.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+generic.menu.ip.lm2n=v2 Lower Memory (no features)
+generic.menu.ip.lm2n.build.lwip_include=lwip2/include
+generic.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+generic.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+generic.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+generic.menu.ip.hb2n.build.lwip_include=lwip2/include
+generic.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+generic.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+generic.menu.ip.lm6f=v2 IPv6 Lower Memory
+generic.menu.ip.lm6f.build.lwip_include=lwip2/include
+generic.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+generic.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+generic.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+generic.menu.ip.hb6f.build.lwip_include=lwip2/include
+generic.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+generic.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+generic.menu.dbg.Disabled=Disabled
+generic.menu.dbg.Disabled.build.debug_port=
+generic.menu.dbg.Serial=Serial
+generic.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+generic.menu.dbg.Serial1=Serial1
+generic.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+generic.menu.lvl.None____=None
+generic.menu.lvl.None____.build.debug_level=
+generic.menu.optim.Smallest=None
+generic.menu.optim.Smallest.build.debug_optim=-Os
+generic.menu.optim.Lite=Lite
+generic.menu.optim.Lite.build.debug_optim=-Os -fno-optimize-sibling-calls
+generic.menu.optim.Full=Optimum
+generic.menu.optim.Full.build.debug_optim=-Og
+generic.menu.lvl.SSL=SSL
+generic.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+generic.menu.lvl.TLS_MEM=TLS_MEM
+generic.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+generic.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+generic.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+generic.menu.lvl.HTTP_SERVER=HTTP_SERVER
+generic.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+generic.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+generic.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+generic.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+generic.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+generic.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+generic.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+generic.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+generic.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+generic.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+generic.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+generic.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+generic.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+generic.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+generic.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+generic.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+generic.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+generic.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+generic.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+generic.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+generic.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+generic.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+generic.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+generic.menu.lvl.CORE=CORE
+generic.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+generic.menu.lvl.WIFI=WIFI
+generic.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+generic.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+generic.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+generic.menu.lvl.UPDATER=UPDATER
+generic.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+generic.menu.lvl.OTA=OTA
+generic.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+generic.menu.lvl.OOM=OOM
+generic.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+generic.menu.lvl.MDNS=MDNS
+generic.menu.lvl.MDNS.build.debug_level= -DDEBUG_ESP_MDNS
+generic.menu.lvl.HWDT=HWDT
+generic.menu.lvl.HWDT.build.debug_level= -DDEBUG_ESP_HWDT
+generic.menu.lvl.HWDT_NOEXTRA4K=HWDT_NOEXTRA4K
+generic.menu.lvl.HWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_HWDT_NOEXTRA4K
+generic.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+generic.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+generic.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+generic.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+generic.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+generic.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+generic.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+generic.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+generic.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+generic.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+generic.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+generic.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+generic.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+generic.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+generic.menu.wipe.none=Only Sketch
+generic.menu.wipe.none.upload.erase_cmd=
+generic.menu.wipe.sdk=Sketch + WiFi Settings
+generic.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
+generic.menu.wipe.all=All Flash Contents
+generic.menu.wipe.all.upload.erase_cmd=erase_flash
+generic.menu.baud.115200=115200
+generic.menu.baud.115200.upload.speed=115200
+generic.menu.baud.57600=57600
+generic.menu.baud.57600.upload.speed=57600
+generic.menu.baud.230400.linux=230400
+generic.menu.baud.230400.macosx=230400
+generic.menu.baud.230400.upload.speed=230400
+generic.menu.baud.256000.windows=256000
+generic.menu.baud.256000.upload.speed=256000
+generic.menu.baud.460800.linux=460800
+generic.menu.baud.460800.macosx=460800
+generic.menu.baud.460800.upload.speed=460800
+generic.menu.baud.512000.windows=512000
+generic.menu.baud.512000.upload.speed=512000
+generic.menu.baud.921600=921600
+generic.menu.baud.921600.upload.speed=921600
+generic.menu.baud.3000000=3000000
+generic.menu.baud.3000000.upload.speed=3000000
+generic.menu.eesz.autoflash=Mapping defined by Hardware and Sketch
+generic.menu.eesz.autoflash.build.flash_size=16M
+generic.menu.eesz.autoflash.build.flash_ld=eagle.flash.auto.ld
+generic.menu.eesz.autoflash.build.extra_flags=-DFLASH_MAP_SUPPORT=1
+generic.menu.eesz.autoflash.upload.maximum_size=1044464
+generic.menu.iramfloat.no=in IROM
+generic.menu.iramfloat.no.build.iramfloat=-DFP_IN_IROM
+generic.menu.iramfloat.yes=allowed in ISR
+generic.menu.iramfloat.yes.build.iramfloat=-DFP_IN_IRAM
-generic.menu.UploadSpeed.115200=115200
-generic.menu.UploadSpeed.115200.upload.speed=115200
-generic.menu.UploadSpeed.9600=9600
-generic.menu.UploadSpeed.9600.upload.speed=9600
-generic.menu.UploadSpeed.57600=57600
-generic.menu.UploadSpeed.57600.upload.speed=57600
-generic.menu.UploadSpeed.256000.windows=256000
-generic.menu.UploadSpeed.256000.upload.speed=256000
-generic.menu.UploadSpeed.230400.linux=230400
-generic.menu.UploadSpeed.230400.macosx=230400
-generic.menu.UploadSpeed.230400.upload.speed=230400
-generic.menu.UploadSpeed.460800.linux=460800
-generic.menu.UploadSpeed.460800.macosx=460800
-generic.menu.UploadSpeed.460800.upload.speed=460800
-generic.menu.UploadSpeed.512000.windows=512000
-generic.menu.UploadSpeed.512000.upload.speed=512000
-generic.menu.UploadSpeed.921600=921600
-generic.menu.UploadSpeed.921600.upload.speed=921600
-
-generic.menu.FlashSize.512K64=512K (64K SPIFFS)
-generic.menu.FlashSize.512K64.build.flash_size=512K
-generic.menu.FlashSize.512K64.build.flash_ld=eagle.flash.512k64.ld
-generic.menu.FlashSize.512K64.build.spiffs_start=0x6B000
-generic.menu.FlashSize.512K64.build.spiffs_end=0x7B000
-generic.menu.FlashSize.512K64.build.spiffs_blocksize=4096
-generic.menu.FlashSize.512K64.upload.maximum_size=434160
-
-generic.menu.FlashSize.512K128=512K (128K SPIFFS)
-generic.menu.FlashSize.512K128.build.flash_size=512K
-generic.menu.FlashSize.512K128.build.flash_ld=eagle.flash.512k128.ld
-generic.menu.FlashSize.512K128.build.spiffs_start=0x5B000
-generic.menu.FlashSize.512K128.build.spiffs_end=0x7B000
-generic.menu.FlashSize.512K128.build.spiffs_blocksize=4096
-generic.menu.FlashSize.512K128.upload.maximum_size=368624
-
-generic.menu.FlashSize.512K0=512K (no SPIFFS)
-generic.menu.FlashSize.512K0.build.flash_size=512K
-generic.menu.FlashSize.512K0.build.flash_ld=eagle.flash.512k0.ld
-generic.menu.FlashSize.512K0.upload.maximum_size=499696
-
-generic.menu.FlashSize.1M512=1M (512K SPIFFS)
-generic.menu.FlashSize.1M512.build.flash_size=1M
-generic.menu.FlashSize.1M512.build.flash_ld=eagle.flash.1m512.ld
-generic.menu.FlashSize.1M512.build.spiffs_start=0x7B000
-generic.menu.FlashSize.1M512.build.spiffs_end=0xFB000
-generic.menu.FlashSize.1M512.build.spiffs_blocksize=8192
-generic.menu.FlashSize.1M512.upload.maximum_size=499696
-
-generic.menu.FlashSize.1M256=1M (256K SPIFFS)
-generic.menu.FlashSize.1M256.build.flash_size=1M
-generic.menu.FlashSize.1M256.build.flash_ld=eagle.flash.1m256.ld
-generic.menu.FlashSize.1M256.build.spiffs_start=0xBB000
-generic.menu.FlashSize.1M256.build.spiffs_end=0xFB000
-generic.menu.FlashSize.1M256.build.spiffs_blocksize=4096
-generic.menu.FlashSize.1M256.upload.maximum_size=761840
-
-generic.menu.FlashSize.1M192=1M (192K SPIFFS)
-generic.menu.FlashSize.1M192.build.flash_size=1M
-generic.menu.FlashSize.1M192.build.flash_ld=eagle.flash.1m192.ld
-generic.menu.FlashSize.1M192.build.spiffs_start=0xCB000
-generic.menu.FlashSize.1M192.build.spiffs_end=0xFB000
-generic.menu.FlashSize.1M192.build.spiffs_blocksize=4096
-generic.menu.FlashSize.1M192.upload.maximum_size=827376
-
-generic.menu.FlashSize.1M160=1M (160K SPIFFS)
-generic.menu.FlashSize.1M160.build.flash_size=1M
-generic.menu.FlashSize.1M160.build.flash_ld=eagle.flash.1m160.ld
-generic.menu.FlashSize.1M160.build.spiffs_start=0xD3000
-generic.menu.FlashSize.1M160.build.spiffs_end=0xFB000
-generic.menu.FlashSize.1M160.build.spiffs_blocksize=4096
-generic.menu.FlashSize.1M160.upload.maximum_size=860144
-
-generic.menu.FlashSize.1M144=1M (144K SPIFFS)
-generic.menu.FlashSize.1M144.build.flash_size=1M
-generic.menu.FlashSize.1M144.build.flash_ld=eagle.flash.1m144.ld
-generic.menu.FlashSize.1M144.build.spiffs_start=0xD7000
-generic.menu.FlashSize.1M144.build.spiffs_end=0xFB000
-generic.menu.FlashSize.1M144.build.spiffs_blocksize=4096
-generic.menu.FlashSize.1M144.upload.maximum_size=876528
-
-generic.menu.FlashSize.1M128=1M (128K SPIFFS)
-generic.menu.FlashSize.1M128.build.flash_size=1M
-generic.menu.FlashSize.1M128.build.flash_ld=eagle.flash.1m128.ld
-generic.menu.FlashSize.1M128.build.spiffs_start=0xDB000
-generic.menu.FlashSize.1M128.build.spiffs_end=0xFB000
-generic.menu.FlashSize.1M128.build.spiffs_blocksize=4096
-generic.menu.FlashSize.1M128.upload.maximum_size=892912
-
-generic.menu.FlashSize.1M64=1M (64K SPIFFS)
-generic.menu.FlashSize.1M64.build.flash_size=1M
-generic.menu.FlashSize.1M64.build.flash_ld=eagle.flash.1m64.ld
-generic.menu.FlashSize.1M64.build.spiffs_start=0xEB000
-generic.menu.FlashSize.1M64.build.spiffs_end=0xFB000
-generic.menu.FlashSize.1M64.build.spiffs_blocksize=4096
-generic.menu.FlashSize.1M64.upload.maximum_size=958448
-
-generic.menu.FlashSize.2M=2M (1M SPIFFS)
-generic.menu.FlashSize.2M.build.flash_size=2M
-generic.menu.FlashSize.2M.build.flash_ld=eagle.flash.2m.ld
-generic.menu.FlashSize.2M.build.spiffs_start=0x100000
-generic.menu.FlashSize.2M.build.spiffs_end=0x1FB000
-generic.menu.FlashSize.2M.build.spiffs_blocksize=8192
-generic.menu.FlashSize.2M.upload.maximum_size=1044464
+##############################################################
+esp8285.name=Generic ESP8285 Module
+esp8285.build.board=ESP8266_ESP01
+esp8285.build.variant=esp8285
+esp8285.upload.tool=esptool
+esp8285.upload.maximum_data_size=81920
+esp8285.upload.wait_for_upload_port=true
+esp8285.upload.erase_cmd=
+esp8285.serial.disableDTR=true
+esp8285.serial.disableRTS=true
+esp8285.build.mcu=esp8266
+esp8285.build.core=esp8266
+esp8285.build.spiffs_pagesize=256
+esp8285.build.debug_optim=
+esp8285.build.debug_port=
+esp8285.build.debug_level=
+esp8285.menu.xtal.80=80 MHz
+esp8285.menu.xtal.80.build.f_cpu=80000000L
+esp8285.menu.xtal.160=160 MHz
+esp8285.menu.xtal.160.build.f_cpu=160000000L
+esp8285.menu.vt.flash=Flash
+esp8285.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+esp8285.menu.vt.heap=Heap
+esp8285.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+esp8285.menu.vt.iram=IRAM
+esp8285.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+esp8285.menu.exception.disabled=Disabled (new aborts on oom)
+esp8285.menu.exception.disabled.build.exception_flags=-fno-exceptions
+esp8285.menu.exception.disabled.build.stdcpp_lib=-lstdc++
+esp8285.menu.exception.enabled=Enabled
+esp8285.menu.exception.enabled.build.exception_flags=-fexceptions
+esp8285.menu.exception.enabled.build.stdcpp_lib=-lstdc++-exc
+esp8285.menu.stacksmash.disabled=Disabled
+esp8285.menu.stacksmash.disabled.build.stacksmash_flags=
+esp8285.menu.stacksmash.enabled=Enabled
+esp8285.menu.stacksmash.enabled.build.stacksmash_flags=-fstack-protector
+esp8285.menu.ssl.all=All SSL ciphers (most compatible)
+esp8285.menu.ssl.all.build.sslflags=
+esp8285.menu.ssl.basic=Basic SSL ciphers (lower ROM use)
+esp8285.menu.ssl.basic.build.sslflags=-DBEARSSL_SSL_BASIC
+esp8285.menu.mmu.3232=32KB cache + 32KB IRAM (balanced)
+esp8285.menu.mmu.3232.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+esp8285.menu.mmu.4816=16KB cache + 48KB IRAM (IRAM)
+esp8285.menu.mmu.4816.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000
+esp8285.menu.mmu.4816H=16KB cache + 48KB IRAM and 2nd Heap (shared)
+esp8285.menu.mmu.4816H.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_IRAM_HEAP
+esp8285.menu.mmu.3216=16KB cache + 32KB IRAM + 16KB 2nd Heap (not shared)
+esp8285.menu.mmu.3216.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_SEC_HEAP=0x40108000 -DMMU_SEC_HEAP_SIZE=0x4000
+esp8285.menu.mmu.ext128k=128K Heap External 23LC1024
+esp8285.menu.mmu.ext128k.build.mmuflags=-DMMU_EXTERNAL_HEAP=128 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+esp8285.menu.mmu.ext8192k=8M w/256K Heap External 64 MBit PSRAM
+esp8285.menu.mmu.ext8192k.build.mmuflags=-DMMU_EXTERNAL_HEAP=256 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+esp8285.menu.non32xfer.fast=Use pgm_read macros for IRAM/PROGMEM
+esp8285.menu.non32xfer.fast.build.non32xferflags=
+esp8285.menu.non32xfer.safe=Byte/Word access to IRAM/PROGMEM (very slow)
+esp8285.menu.non32xfer.safe.build.non32xferflags=-DNON32XFER_HANDLER
+esp8285.menu.ResetMethod.nodemcu=dtr (aka nodemcu)
+esp8285.menu.ResetMethod.nodemcu.upload.resetmethod=--before default_reset --after hard_reset
+esp8285.menu.ResetMethod.ck=no dtr (aka ck)
+esp8285.menu.ResetMethod.ck.upload.resetmethod=--before no_reset --after soft_reset
+esp8285.menu.ResetMethod.nodtr_nosync=no dtr, no_sync
+esp8285.menu.ResetMethod.nodtr_nosync.upload.resetmethod=--before no_reset_no_sync --after soft_reset
+esp8285.menu.CrystalFreq.26=26 MHz
+esp8285.menu.CrystalFreq.40=40 MHz
+esp8285.menu.CrystalFreq.40.build.extra_flags=-DF_CRYSTAL=40000000
+esp8285.build.flash_mode=dout
+esp8285.build.flash_flags=-DFLASHMODE_DOUT
+esp8285.build.flash_freq=40
+esp8285.menu.eesz.1M64=1MB (FS:64KB OTA:~470KB)
+esp8285.menu.eesz.1M64.build.flash_size=1M
+esp8285.menu.eesz.1M64.build.flash_ld=eagle.flash.1m64.ld
+esp8285.menu.eesz.1M64.build.spiffs_pagesize=256
+esp8285.menu.eesz.1M64.build.rfcal_addr=0xFC000
+esp8285.menu.eesz.1M64.build.spiffs_start=0xEB000
+esp8285.menu.eesz.1M64.build.spiffs_end=0xFB000
+esp8285.menu.eesz.1M64.build.spiffs_blocksize=4096
+esp8285.menu.eesz.1M128=1MB (FS:128KB OTA:~438KB)
+esp8285.menu.eesz.1M128.build.flash_size=1M
+esp8285.menu.eesz.1M128.build.flash_ld=eagle.flash.1m128.ld
+esp8285.menu.eesz.1M128.build.spiffs_pagesize=256
+esp8285.menu.eesz.1M128.build.rfcal_addr=0xFC000
+esp8285.menu.eesz.1M128.build.spiffs_start=0xDB000
+esp8285.menu.eesz.1M128.build.spiffs_end=0xFB000
+esp8285.menu.eesz.1M128.build.spiffs_blocksize=4096
+esp8285.menu.eesz.1M144=1MB (FS:144KB OTA:~430KB)
+esp8285.menu.eesz.1M144.build.flash_size=1M
+esp8285.menu.eesz.1M144.build.flash_ld=eagle.flash.1m144.ld
+esp8285.menu.eesz.1M144.build.spiffs_pagesize=256
+esp8285.menu.eesz.1M144.build.rfcal_addr=0xFC000
+esp8285.menu.eesz.1M144.build.spiffs_start=0xD7000
+esp8285.menu.eesz.1M144.build.spiffs_end=0xFB000
+esp8285.menu.eesz.1M144.build.spiffs_blocksize=4096
+esp8285.menu.eesz.1M160=1MB (FS:160KB OTA:~422KB)
+esp8285.menu.eesz.1M160.build.flash_size=1M
+esp8285.menu.eesz.1M160.build.flash_ld=eagle.flash.1m160.ld
+esp8285.menu.eesz.1M160.build.spiffs_pagesize=256
+esp8285.menu.eesz.1M160.build.rfcal_addr=0xFC000
+esp8285.menu.eesz.1M160.build.spiffs_start=0xD3000
+esp8285.menu.eesz.1M160.build.spiffs_end=0xFB000
+esp8285.menu.eesz.1M160.build.spiffs_blocksize=4096
+esp8285.menu.eesz.1M192=1MB (FS:192KB OTA:~406KB)
+esp8285.menu.eesz.1M192.build.flash_size=1M
+esp8285.menu.eesz.1M192.build.flash_ld=eagle.flash.1m192.ld
+esp8285.menu.eesz.1M192.build.spiffs_pagesize=256
+esp8285.menu.eesz.1M192.build.rfcal_addr=0xFC000
+esp8285.menu.eesz.1M192.build.spiffs_start=0xCB000
+esp8285.menu.eesz.1M192.build.spiffs_end=0xFB000
+esp8285.menu.eesz.1M192.build.spiffs_blocksize=4096
+esp8285.menu.eesz.1M256=1MB (FS:256KB OTA:~374KB)
+esp8285.menu.eesz.1M256.build.flash_size=1M
+esp8285.menu.eesz.1M256.build.flash_ld=eagle.flash.1m256.ld
+esp8285.menu.eesz.1M256.build.spiffs_pagesize=256
+esp8285.menu.eesz.1M256.build.rfcal_addr=0xFC000
+esp8285.menu.eesz.1M256.build.spiffs_start=0xBB000
+esp8285.menu.eesz.1M256.build.spiffs_end=0xFB000
+esp8285.menu.eesz.1M256.build.spiffs_blocksize=4096
+esp8285.menu.eesz.1M512=1MB (FS:512KB OTA:~246KB)
+esp8285.menu.eesz.1M512.build.flash_size=1M
+esp8285.menu.eesz.1M512.build.flash_ld=eagle.flash.1m512.ld
+esp8285.menu.eesz.1M512.build.spiffs_pagesize=256
+esp8285.menu.eesz.1M512.build.rfcal_addr=0xFC000
+esp8285.menu.eesz.1M512.build.spiffs_start=0x7B000
+esp8285.menu.eesz.1M512.build.spiffs_end=0xFB000
+esp8285.menu.eesz.1M512.build.spiffs_blocksize=8192
+esp8285.menu.eesz.1M=1MB (FS:none OTA:~502KB)
+esp8285.menu.eesz.1M.build.flash_size=1M
+esp8285.menu.eesz.1M.build.flash_ld=eagle.flash.1m.ld
+esp8285.menu.eesz.1M.build.spiffs_pagesize=256
+esp8285.menu.eesz.1M.build.rfcal_addr=0xFC000
+esp8285.menu.eesz.2M64=2MB (FS:64KB OTA:~992KB)
+esp8285.menu.eesz.2M64.build.flash_size=2M
+esp8285.menu.eesz.2M64.build.flash_ld=eagle.flash.2m64.ld
+esp8285.menu.eesz.2M64.build.spiffs_pagesize=256
+esp8285.menu.eesz.2M64.build.rfcal_addr=0x1FC000
+esp8285.menu.eesz.2M64.build.spiffs_start=0x1F0000
+esp8285.menu.eesz.2M64.build.spiffs_end=0x1FB000
+esp8285.menu.eesz.2M64.build.spiffs_blocksize=4096
+esp8285.menu.eesz.2M128=2MB (FS:128KB OTA:~960KB)
+esp8285.menu.eesz.2M128.build.flash_size=2M
+esp8285.menu.eesz.2M128.build.flash_ld=eagle.flash.2m128.ld
+esp8285.menu.eesz.2M128.build.spiffs_pagesize=256
+esp8285.menu.eesz.2M128.build.rfcal_addr=0x1FC000
+esp8285.menu.eesz.2M128.build.spiffs_start=0x1E0000
+esp8285.menu.eesz.2M128.build.spiffs_end=0x1FB000
+esp8285.menu.eesz.2M128.build.spiffs_blocksize=4096
+esp8285.menu.eesz.2M256=2MB (FS:256KB OTA:~896KB)
+esp8285.menu.eesz.2M256.build.flash_size=2M
+esp8285.menu.eesz.2M256.build.flash_ld=eagle.flash.2m256.ld
+esp8285.menu.eesz.2M256.build.spiffs_pagesize=256
+esp8285.menu.eesz.2M256.build.rfcal_addr=0x1FC000
+esp8285.menu.eesz.2M256.build.spiffs_start=0x1C0000
+esp8285.menu.eesz.2M256.build.spiffs_end=0x1FB000
+esp8285.menu.eesz.2M256.build.spiffs_blocksize=4096
+esp8285.menu.eesz.2M512=2MB (FS:512KB OTA:~768KB)
+esp8285.menu.eesz.2M512.build.flash_size=2M
+esp8285.menu.eesz.2M512.build.flash_ld=eagle.flash.2m512.ld
+esp8285.menu.eesz.2M512.build.spiffs_pagesize=256
+esp8285.menu.eesz.2M512.build.rfcal_addr=0x1FC000
+esp8285.menu.eesz.2M512.build.spiffs_start=0x180000
+esp8285.menu.eesz.2M512.build.spiffs_end=0x1FA000
+esp8285.menu.eesz.2M512.build.spiffs_blocksize=8192
+esp8285.menu.eesz.2M1M=2MB (FS:1MB OTA:~512KB)
+esp8285.menu.eesz.2M1M.build.flash_size=2M
+esp8285.menu.eesz.2M1M.build.flash_ld=eagle.flash.2m1m.ld
+esp8285.menu.eesz.2M1M.build.spiffs_pagesize=256
+esp8285.menu.eesz.2M1M.build.rfcal_addr=0x1FC000
+esp8285.menu.eesz.2M1M.build.spiffs_start=0x100000
+esp8285.menu.eesz.2M1M.build.spiffs_end=0x1FA000
+esp8285.menu.eesz.2M1M.build.spiffs_blocksize=8192
+esp8285.menu.eesz.2M=2MB (FS:none OTA:~1019KB)
+esp8285.menu.eesz.2M.build.flash_size=2M
+esp8285.menu.eesz.2M.build.flash_ld=eagle.flash.2m.ld
+esp8285.menu.eesz.2M.build.spiffs_pagesize=256
+esp8285.menu.eesz.2M.build.rfcal_addr=0x1FC000
+esp8285.menu.led.2=2
+esp8285.menu.led.2.build.led=-DLED_BUILTIN=2
+esp8285.menu.led.0=0
+esp8285.menu.led.0.build.led=-DLED_BUILTIN=0
+esp8285.menu.led.1=1
+esp8285.menu.led.1.build.led=-DLED_BUILTIN=1
+esp8285.menu.led.3=3
+esp8285.menu.led.3.build.led=-DLED_BUILTIN=3
+esp8285.menu.led.4=4
+esp8285.menu.led.4.build.led=-DLED_BUILTIN=4
+esp8285.menu.led.5=5
+esp8285.menu.led.5.build.led=-DLED_BUILTIN=5
+esp8285.menu.led.6=6
+esp8285.menu.led.6.build.led=-DLED_BUILTIN=6
+esp8285.menu.led.7=7
+esp8285.menu.led.7.build.led=-DLED_BUILTIN=7
+esp8285.menu.led.8=8
+esp8285.menu.led.8.build.led=-DLED_BUILTIN=8
+esp8285.menu.led.9=9
+esp8285.menu.led.9.build.led=-DLED_BUILTIN=9
+esp8285.menu.led.10=10
+esp8285.menu.led.10.build.led=-DLED_BUILTIN=10
+esp8285.menu.led.11=11
+esp8285.menu.led.11.build.led=-DLED_BUILTIN=11
+esp8285.menu.led.12=12
+esp8285.menu.led.12.build.led=-DLED_BUILTIN=12
+esp8285.menu.led.13=13
+esp8285.menu.led.13.build.led=-DLED_BUILTIN=13
+esp8285.menu.led.14=14
+esp8285.menu.led.14.build.led=-DLED_BUILTIN=14
+esp8285.menu.led.15=15
+esp8285.menu.led.15.build.led=-DLED_BUILTIN=15
+esp8285.menu.led.16=16
+esp8285.menu.led.16.build.led=-DLED_BUILTIN=16
+esp8285.menu.sdk.nonosdk_190703=nonos-sdk 2.2.1+100 (190703)
+esp8285.menu.sdk.nonosdk_190703.build.sdk=NONOSDK22x_190703
+esp8285.menu.sdk.nonosdk_191122=nonos-sdk 2.2.1+119 (191122)
+esp8285.menu.sdk.nonosdk_191122.build.sdk=NONOSDK22x_191122
+esp8285.menu.sdk.nonosdk_191105=nonos-sdk 2.2.1+113 (191105)
+esp8285.menu.sdk.nonosdk_191105.build.sdk=NONOSDK22x_191105
+esp8285.menu.sdk.nonosdk_191024=nonos-sdk 2.2.1+111 (191024)
+esp8285.menu.sdk.nonosdk_191024.build.sdk=NONOSDK22x_191024
+esp8285.menu.sdk.nonosdk_190313=nonos-sdk 2.2.1+61 (190313)
+esp8285.menu.sdk.nonosdk_190313.build.sdk=NONOSDK22x_190313
+esp8285.menu.sdk.nonosdk221=nonos-sdk 2.2.1 (legacy)
+esp8285.menu.sdk.nonosdk221.build.sdk=NONOSDK221
+esp8285.menu.sdk.nonosdk305=nonos-sdk 3.0.5 (experimental)
+esp8285.menu.sdk.nonosdk305.build.sdk=NONOSDK305
+esp8285.menu.ip.lm2f=v2 Lower Memory
+esp8285.menu.ip.lm2f.build.lwip_include=lwip2/include
+esp8285.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+esp8285.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+esp8285.menu.ip.hb2f=v2 Higher Bandwidth
+esp8285.menu.ip.hb2f.build.lwip_include=lwip2/include
+esp8285.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+esp8285.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+esp8285.menu.ip.lm2n=v2 Lower Memory (no features)
+esp8285.menu.ip.lm2n.build.lwip_include=lwip2/include
+esp8285.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+esp8285.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+esp8285.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+esp8285.menu.ip.hb2n.build.lwip_include=lwip2/include
+esp8285.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+esp8285.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+esp8285.menu.ip.lm6f=v2 IPv6 Lower Memory
+esp8285.menu.ip.lm6f.build.lwip_include=lwip2/include
+esp8285.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+esp8285.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+esp8285.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+esp8285.menu.ip.hb6f.build.lwip_include=lwip2/include
+esp8285.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+esp8285.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+esp8285.menu.dbg.Disabled=Disabled
+esp8285.menu.dbg.Disabled.build.debug_port=
+esp8285.menu.dbg.Serial=Serial
+esp8285.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+esp8285.menu.dbg.Serial1=Serial1
+esp8285.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+esp8285.menu.lvl.None____=None
+esp8285.menu.lvl.None____.build.debug_level=
+esp8285.menu.optim.Smallest=None
+esp8285.menu.optim.Smallest.build.debug_optim=-Os
+esp8285.menu.optim.Lite=Lite
+esp8285.menu.optim.Lite.build.debug_optim=-Os -fno-optimize-sibling-calls
+esp8285.menu.optim.Full=Optimum
+esp8285.menu.optim.Full.build.debug_optim=-Og
+esp8285.menu.lvl.SSL=SSL
+esp8285.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+esp8285.menu.lvl.TLS_MEM=TLS_MEM
+esp8285.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+esp8285.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+esp8285.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+esp8285.menu.lvl.HTTP_SERVER=HTTP_SERVER
+esp8285.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+esp8285.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+esp8285.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+esp8285.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+esp8285.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+esp8285.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+esp8285.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+esp8285.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+esp8285.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+esp8285.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+esp8285.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+esp8285.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+esp8285.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+esp8285.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+esp8285.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+esp8285.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+esp8285.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+esp8285.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+esp8285.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+esp8285.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+esp8285.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+esp8285.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+esp8285.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+esp8285.menu.lvl.CORE=CORE
+esp8285.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+esp8285.menu.lvl.WIFI=WIFI
+esp8285.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+esp8285.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+esp8285.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+esp8285.menu.lvl.UPDATER=UPDATER
+esp8285.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+esp8285.menu.lvl.OTA=OTA
+esp8285.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+esp8285.menu.lvl.OOM=OOM
+esp8285.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+esp8285.menu.lvl.MDNS=MDNS
+esp8285.menu.lvl.MDNS.build.debug_level= -DDEBUG_ESP_MDNS
+esp8285.menu.lvl.HWDT=HWDT
+esp8285.menu.lvl.HWDT.build.debug_level= -DDEBUG_ESP_HWDT
+esp8285.menu.lvl.HWDT_NOEXTRA4K=HWDT_NOEXTRA4K
+esp8285.menu.lvl.HWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_HWDT_NOEXTRA4K
+esp8285.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+esp8285.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+esp8285.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+esp8285.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+esp8285.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+esp8285.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+esp8285.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+esp8285.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+esp8285.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+esp8285.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+esp8285.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+esp8285.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+esp8285.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+esp8285.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+esp8285.menu.wipe.none=Only Sketch
+esp8285.menu.wipe.none.upload.erase_cmd=
+esp8285.menu.wipe.sdk=Sketch + WiFi Settings
+esp8285.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
+esp8285.menu.wipe.all=All Flash Contents
+esp8285.menu.wipe.all.upload.erase_cmd=erase_flash
+esp8285.menu.baud.115200=115200
+esp8285.menu.baud.115200.upload.speed=115200
+esp8285.menu.baud.57600=57600
+esp8285.menu.baud.57600.upload.speed=57600
+esp8285.menu.baud.230400.linux=230400
+esp8285.menu.baud.230400.macosx=230400
+esp8285.menu.baud.230400.upload.speed=230400
+esp8285.menu.baud.256000.windows=256000
+esp8285.menu.baud.256000.upload.speed=256000
+esp8285.menu.baud.460800.linux=460800
+esp8285.menu.baud.460800.macosx=460800
+esp8285.menu.baud.460800.upload.speed=460800
+esp8285.menu.baud.512000.windows=512000
+esp8285.menu.baud.512000.upload.speed=512000
+esp8285.menu.baud.921600=921600
+esp8285.menu.baud.921600.upload.speed=921600
+esp8285.menu.baud.3000000=3000000
+esp8285.menu.baud.3000000.upload.speed=3000000
+esp8285.menu.eesz.autoflash=Mapping defined by Hardware and Sketch
+esp8285.menu.eesz.autoflash.build.flash_size=16M
+esp8285.menu.eesz.autoflash.build.flash_ld=eagle.flash.auto.ld
+esp8285.menu.eesz.autoflash.build.extra_flags=-DFLASH_MAP_SUPPORT=1
+esp8285.menu.eesz.autoflash.upload.maximum_size=1044464
+esp8285.menu.iramfloat.no=in IROM
+esp8285.menu.iramfloat.no.build.iramfloat=-DFP_IN_IROM
+esp8285.menu.iramfloat.yes=allowed in ISR
+esp8285.menu.iramfloat.yes.build.iramfloat=-DFP_IN_IRAM
-generic.menu.FlashSize.4M1M=4M (1M SPIFFS)
-generic.menu.FlashSize.4M1M.build.flash_size=4M
-generic.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-generic.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-generic.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-generic.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-generic.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-generic.menu.FlashSize.4M1M.upload.maximum_size=1044464
+##############################################################
+gen4iod.name=4D Systems gen4 IoD Range
+gen4iod.build.board=GEN4_IOD
+gen4iod.build.f_cpu=160000000L
+gen4iod.build.variant=generic
+gen4iod.upload.tool=esptool
+gen4iod.upload.maximum_data_size=81920
+gen4iod.upload.wait_for_upload_port=true
+gen4iod.upload.erase_cmd=
+gen4iod.serial.disableDTR=true
+gen4iod.serial.disableRTS=true
+gen4iod.build.mcu=esp8266
+gen4iod.build.core=esp8266
+gen4iod.build.spiffs_pagesize=256
+gen4iod.build.debug_optim=
+gen4iod.build.debug_port=
+gen4iod.build.debug_level=
+gen4iod.menu.xtal.80=80 MHz
+gen4iod.menu.xtal.80.build.f_cpu=80000000L
+gen4iod.menu.xtal.160=160 MHz
+gen4iod.menu.xtal.160.build.f_cpu=160000000L
+gen4iod.menu.vt.flash=Flash
+gen4iod.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+gen4iod.menu.vt.heap=Heap
+gen4iod.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+gen4iod.menu.vt.iram=IRAM
+gen4iod.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+gen4iod.menu.exception.disabled=Disabled (new aborts on oom)
+gen4iod.menu.exception.disabled.build.exception_flags=-fno-exceptions
+gen4iod.menu.exception.disabled.build.stdcpp_lib=-lstdc++
+gen4iod.menu.exception.enabled=Enabled
+gen4iod.menu.exception.enabled.build.exception_flags=-fexceptions
+gen4iod.menu.exception.enabled.build.stdcpp_lib=-lstdc++-exc
+gen4iod.menu.stacksmash.disabled=Disabled
+gen4iod.menu.stacksmash.disabled.build.stacksmash_flags=
+gen4iod.menu.stacksmash.enabled=Enabled
+gen4iod.menu.stacksmash.enabled.build.stacksmash_flags=-fstack-protector
+gen4iod.menu.ssl.all=All SSL ciphers (most compatible)
+gen4iod.menu.ssl.all.build.sslflags=
+gen4iod.menu.ssl.basic=Basic SSL ciphers (lower ROM use)
+gen4iod.menu.ssl.basic.build.sslflags=-DBEARSSL_SSL_BASIC
+gen4iod.menu.mmu.3232=32KB cache + 32KB IRAM (balanced)
+gen4iod.menu.mmu.3232.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+gen4iod.menu.mmu.4816=16KB cache + 48KB IRAM (IRAM)
+gen4iod.menu.mmu.4816.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000
+gen4iod.menu.mmu.4816H=16KB cache + 48KB IRAM and 2nd Heap (shared)
+gen4iod.menu.mmu.4816H.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_IRAM_HEAP
+gen4iod.menu.mmu.3216=16KB cache + 32KB IRAM + 16KB 2nd Heap (not shared)
+gen4iod.menu.mmu.3216.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_SEC_HEAP=0x40108000 -DMMU_SEC_HEAP_SIZE=0x4000
+gen4iod.menu.mmu.ext128k=128K Heap External 23LC1024
+gen4iod.menu.mmu.ext128k.build.mmuflags=-DMMU_EXTERNAL_HEAP=128 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+gen4iod.menu.mmu.ext8192k=8M w/256K Heap External 64 MBit PSRAM
+gen4iod.menu.mmu.ext8192k.build.mmuflags=-DMMU_EXTERNAL_HEAP=256 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+gen4iod.menu.non32xfer.fast=Use pgm_read macros for IRAM/PROGMEM
+gen4iod.menu.non32xfer.fast.build.non32xferflags=
+gen4iod.menu.non32xfer.safe=Byte/Word access to IRAM/PROGMEM (very slow)
+gen4iod.menu.non32xfer.safe.build.non32xferflags=-DNON32XFER_HANDLER
+gen4iod.upload.resetmethod=--before default_reset --after hard_reset
+gen4iod.menu.FlashMode.dout=DOUT (compatible)
+gen4iod.menu.FlashMode.dout.build.flash_mode=dout
+gen4iod.menu.FlashMode.dout.build.flash_flags=-DFLASHMODE_DOUT
+gen4iod.menu.FlashMode.dio=DIO
+gen4iod.menu.FlashMode.dio.build.flash_mode=dio
+gen4iod.menu.FlashMode.dio.build.flash_flags=-DFLASHMODE_DIO
+gen4iod.menu.FlashMode.qout=QOUT
+gen4iod.menu.FlashMode.qout.build.flash_mode=qout
+gen4iod.menu.FlashMode.qout.build.flash_flags=-DFLASHMODE_QOUT
+gen4iod.menu.FlashMode.qio=QIO (fast)
+gen4iod.menu.FlashMode.qio.build.flash_mode=qio
+gen4iod.menu.FlashMode.qio.build.flash_flags=-DFLASHMODE_QIO
+gen4iod.build.flash_freq=80
+gen4iod.menu.eesz.2M64=2MB (FS:64KB OTA:~992KB)
+gen4iod.menu.eesz.2M64.build.flash_size=2M
+gen4iod.menu.eesz.2M64.build.flash_ld=eagle.flash.2m64.ld
+gen4iod.menu.eesz.2M64.build.spiffs_pagesize=256
+gen4iod.menu.eesz.2M64.build.rfcal_addr=0x1FC000
+gen4iod.menu.eesz.2M64.build.spiffs_start=0x1F0000
+gen4iod.menu.eesz.2M64.build.spiffs_end=0x1FB000
+gen4iod.menu.eesz.2M64.build.spiffs_blocksize=4096
+gen4iod.menu.eesz.2M128=2MB (FS:128KB OTA:~960KB)
+gen4iod.menu.eesz.2M128.build.flash_size=2M
+gen4iod.menu.eesz.2M128.build.flash_ld=eagle.flash.2m128.ld
+gen4iod.menu.eesz.2M128.build.spiffs_pagesize=256
+gen4iod.menu.eesz.2M128.build.rfcal_addr=0x1FC000
+gen4iod.menu.eesz.2M128.build.spiffs_start=0x1E0000
+gen4iod.menu.eesz.2M128.build.spiffs_end=0x1FB000
+gen4iod.menu.eesz.2M128.build.spiffs_blocksize=4096
+gen4iod.menu.eesz.2M256=2MB (FS:256KB OTA:~896KB)
+gen4iod.menu.eesz.2M256.build.flash_size=2M
+gen4iod.menu.eesz.2M256.build.flash_ld=eagle.flash.2m256.ld
+gen4iod.menu.eesz.2M256.build.spiffs_pagesize=256
+gen4iod.menu.eesz.2M256.build.rfcal_addr=0x1FC000
+gen4iod.menu.eesz.2M256.build.spiffs_start=0x1C0000
+gen4iod.menu.eesz.2M256.build.spiffs_end=0x1FB000
+gen4iod.menu.eesz.2M256.build.spiffs_blocksize=4096
+gen4iod.menu.eesz.2M512=2MB (FS:512KB OTA:~768KB)
+gen4iod.menu.eesz.2M512.build.flash_size=2M
+gen4iod.menu.eesz.2M512.build.flash_ld=eagle.flash.2m512.ld
+gen4iod.menu.eesz.2M512.build.spiffs_pagesize=256
+gen4iod.menu.eesz.2M512.build.rfcal_addr=0x1FC000
+gen4iod.menu.eesz.2M512.build.spiffs_start=0x180000
+gen4iod.menu.eesz.2M512.build.spiffs_end=0x1FA000
+gen4iod.menu.eesz.2M512.build.spiffs_blocksize=8192
+gen4iod.menu.eesz.2M1M=2MB (FS:1MB OTA:~512KB)
+gen4iod.menu.eesz.2M1M.build.flash_size=2M
+gen4iod.menu.eesz.2M1M.build.flash_ld=eagle.flash.2m1m.ld
+gen4iod.menu.eesz.2M1M.build.spiffs_pagesize=256
+gen4iod.menu.eesz.2M1M.build.rfcal_addr=0x1FC000
+gen4iod.menu.eesz.2M1M.build.spiffs_start=0x100000
+gen4iod.menu.eesz.2M1M.build.spiffs_end=0x1FA000
+gen4iod.menu.eesz.2M1M.build.spiffs_blocksize=8192
+gen4iod.menu.eesz.2M=2MB (FS:none OTA:~1019KB)
+gen4iod.menu.eesz.2M.build.flash_size=2M
+gen4iod.menu.eesz.2M.build.flash_ld=eagle.flash.2m.ld
+gen4iod.menu.eesz.2M.build.spiffs_pagesize=256
+gen4iod.menu.eesz.2M.build.rfcal_addr=0x1FC000
+gen4iod.menu.eesz.512K32=512KB (FS:32KB OTA:~230KB)
+gen4iod.menu.eesz.512K32.build.flash_size=512K
+gen4iod.menu.eesz.512K32.build.flash_ld=eagle.flash.512k32.ld
+gen4iod.menu.eesz.512K32.build.spiffs_pagesize=256
+gen4iod.menu.eesz.512K32.build.rfcal_addr=0x7C000
+gen4iod.menu.eesz.512K32.build.spiffs_start=0x73000
+gen4iod.menu.eesz.512K32.build.spiffs_end=0x7B000
+gen4iod.menu.eesz.512K32.build.spiffs_blocksize=4096
+gen4iod.menu.eesz.512K64=512KB (FS:64KB OTA:~214KB)
+gen4iod.menu.eesz.512K64.build.flash_size=512K
+gen4iod.menu.eesz.512K64.build.flash_ld=eagle.flash.512k64.ld
+gen4iod.menu.eesz.512K64.build.spiffs_pagesize=256
+gen4iod.menu.eesz.512K64.build.rfcal_addr=0x7C000
+gen4iod.menu.eesz.512K64.build.spiffs_start=0x6B000
+gen4iod.menu.eesz.512K64.build.spiffs_end=0x7B000
+gen4iod.menu.eesz.512K64.build.spiffs_blocksize=4096
+gen4iod.menu.eesz.512K128=512KB (FS:128KB OTA:~182KB)
+gen4iod.menu.eesz.512K128.build.flash_size=512K
+gen4iod.menu.eesz.512K128.build.flash_ld=eagle.flash.512k128.ld
+gen4iod.menu.eesz.512K128.build.spiffs_pagesize=256
+gen4iod.menu.eesz.512K128.build.rfcal_addr=0x7C000
+gen4iod.menu.eesz.512K128.build.spiffs_start=0x5B000
+gen4iod.menu.eesz.512K128.build.spiffs_end=0x7B000
+gen4iod.menu.eesz.512K128.build.spiffs_blocksize=4096
+gen4iod.menu.eesz.512K=512KB (FS:none OTA:~246KB)
+gen4iod.menu.eesz.512K.build.flash_size=512K
+gen4iod.menu.eesz.512K.build.flash_ld=eagle.flash.512k.ld
+gen4iod.menu.eesz.512K.build.spiffs_pagesize=256
+gen4iod.menu.eesz.512K.build.rfcal_addr=0x7C000
+gen4iod.menu.ip.lm2f=v2 Lower Memory
+gen4iod.menu.ip.lm2f.build.lwip_include=lwip2/include
+gen4iod.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+gen4iod.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+gen4iod.menu.ip.hb2f=v2 Higher Bandwidth
+gen4iod.menu.ip.hb2f.build.lwip_include=lwip2/include
+gen4iod.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+gen4iod.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+gen4iod.menu.ip.lm2n=v2 Lower Memory (no features)
+gen4iod.menu.ip.lm2n.build.lwip_include=lwip2/include
+gen4iod.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+gen4iod.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+gen4iod.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+gen4iod.menu.ip.hb2n.build.lwip_include=lwip2/include
+gen4iod.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+gen4iod.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+gen4iod.menu.ip.lm6f=v2 IPv6 Lower Memory
+gen4iod.menu.ip.lm6f.build.lwip_include=lwip2/include
+gen4iod.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+gen4iod.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+gen4iod.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+gen4iod.menu.ip.hb6f.build.lwip_include=lwip2/include
+gen4iod.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+gen4iod.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+gen4iod.menu.dbg.Disabled=Disabled
+gen4iod.menu.dbg.Disabled.build.debug_port=
+gen4iod.menu.dbg.Serial=Serial
+gen4iod.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+gen4iod.menu.dbg.Serial1=Serial1
+gen4iod.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+gen4iod.menu.lvl.None____=None
+gen4iod.menu.lvl.None____.build.debug_level=
+gen4iod.menu.optim.Smallest=None
+gen4iod.menu.optim.Smallest.build.debug_optim=-Os
+gen4iod.menu.optim.Lite=Lite
+gen4iod.menu.optim.Lite.build.debug_optim=-Os -fno-optimize-sibling-calls
+gen4iod.menu.optim.Full=Optimum
+gen4iod.menu.optim.Full.build.debug_optim=-Og
+gen4iod.menu.lvl.SSL=SSL
+gen4iod.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+gen4iod.menu.lvl.TLS_MEM=TLS_MEM
+gen4iod.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+gen4iod.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+gen4iod.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+gen4iod.menu.lvl.HTTP_SERVER=HTTP_SERVER
+gen4iod.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+gen4iod.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+gen4iod.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+gen4iod.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+gen4iod.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+gen4iod.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+gen4iod.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+gen4iod.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+gen4iod.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+gen4iod.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+gen4iod.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+gen4iod.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+gen4iod.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+gen4iod.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+gen4iod.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+gen4iod.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+gen4iod.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+gen4iod.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+gen4iod.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+gen4iod.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+gen4iod.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+gen4iod.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+gen4iod.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+gen4iod.menu.lvl.CORE=CORE
+gen4iod.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+gen4iod.menu.lvl.WIFI=WIFI
+gen4iod.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+gen4iod.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+gen4iod.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+gen4iod.menu.lvl.UPDATER=UPDATER
+gen4iod.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+gen4iod.menu.lvl.OTA=OTA
+gen4iod.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+gen4iod.menu.lvl.OOM=OOM
+gen4iod.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+gen4iod.menu.lvl.MDNS=MDNS
+gen4iod.menu.lvl.MDNS.build.debug_level= -DDEBUG_ESP_MDNS
+gen4iod.menu.lvl.HWDT=HWDT
+gen4iod.menu.lvl.HWDT.build.debug_level= -DDEBUG_ESP_HWDT
+gen4iod.menu.lvl.HWDT_NOEXTRA4K=HWDT_NOEXTRA4K
+gen4iod.menu.lvl.HWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_HWDT_NOEXTRA4K
+gen4iod.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+gen4iod.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+gen4iod.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+gen4iod.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+gen4iod.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+gen4iod.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+gen4iod.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+gen4iod.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+gen4iod.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+gen4iod.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+gen4iod.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+gen4iod.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+gen4iod.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+gen4iod.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+gen4iod.menu.wipe.none=Only Sketch
+gen4iod.menu.wipe.none.upload.erase_cmd=
+gen4iod.menu.wipe.sdk=Sketch + WiFi Settings
+gen4iod.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
+gen4iod.menu.wipe.all=All Flash Contents
+gen4iod.menu.wipe.all.upload.erase_cmd=erase_flash
+gen4iod.menu.baud.115200=115200
+gen4iod.menu.baud.115200.upload.speed=115200
+gen4iod.menu.baud.57600=57600
+gen4iod.menu.baud.57600.upload.speed=57600
+gen4iod.menu.baud.230400.linux=230400
+gen4iod.menu.baud.230400.macosx=230400
+gen4iod.menu.baud.230400.upload.speed=230400
+gen4iod.menu.baud.256000.windows=256000
+gen4iod.menu.baud.256000.upload.speed=256000
+gen4iod.menu.baud.460800.linux=460800
+gen4iod.menu.baud.460800.macosx=460800
+gen4iod.menu.baud.460800.upload.speed=460800
+gen4iod.menu.baud.512000.windows=512000
+gen4iod.menu.baud.512000.upload.speed=512000
+gen4iod.menu.baud.921600=921600
+gen4iod.menu.baud.921600.upload.speed=921600
+gen4iod.menu.baud.3000000=3000000
+gen4iod.menu.baud.3000000.upload.speed=3000000
+gen4iod.menu.eesz.autoflash=Mapping defined by Hardware and Sketch
+gen4iod.menu.eesz.autoflash.build.flash_size=16M
+gen4iod.menu.eesz.autoflash.build.flash_ld=eagle.flash.auto.ld
+gen4iod.menu.eesz.autoflash.build.extra_flags=-DFLASH_MAP_SUPPORT=1
+gen4iod.menu.eesz.autoflash.upload.maximum_size=1044464
+gen4iod.menu.iramfloat.no=in IROM
+gen4iod.menu.iramfloat.no.build.iramfloat=-DFP_IN_IROM
+gen4iod.menu.iramfloat.yes=allowed in ISR
+gen4iod.menu.iramfloat.yes.build.iramfloat=-DFP_IN_IRAM
-generic.menu.FlashSize.4M3M=4M (3M SPIFFS)
-generic.menu.FlashSize.4M3M.build.flash_size=4M
-generic.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-generic.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-generic.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-generic.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-generic.menu.FlashSize.4M3M.upload.maximum_size=1044464
+##############################################################
+huzzah.name=Adafruit Feather HUZZAH ESP8266
+huzzah.build.board=ESP8266_ADAFRUIT_HUZZAH
+huzzah.build.variant=adafruit
+huzzah.upload.tool=esptool
+huzzah.upload.maximum_data_size=81920
+huzzah.upload.wait_for_upload_port=true
+huzzah.upload.erase_cmd=
+huzzah.serial.disableDTR=true
+huzzah.serial.disableRTS=true
+huzzah.build.mcu=esp8266
+huzzah.build.core=esp8266
+huzzah.build.spiffs_pagesize=256
+huzzah.build.debug_optim=
+huzzah.build.debug_port=
+huzzah.build.debug_level=
+huzzah.menu.xtal.80=80 MHz
+huzzah.menu.xtal.80.build.f_cpu=80000000L
+huzzah.menu.xtal.160=160 MHz
+huzzah.menu.xtal.160.build.f_cpu=160000000L
+huzzah.menu.vt.flash=Flash
+huzzah.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+huzzah.menu.vt.heap=Heap
+huzzah.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+huzzah.menu.vt.iram=IRAM
+huzzah.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+huzzah.menu.exception.disabled=Disabled (new aborts on oom)
+huzzah.menu.exception.disabled.build.exception_flags=-fno-exceptions
+huzzah.menu.exception.disabled.build.stdcpp_lib=-lstdc++
+huzzah.menu.exception.enabled=Enabled
+huzzah.menu.exception.enabled.build.exception_flags=-fexceptions
+huzzah.menu.exception.enabled.build.stdcpp_lib=-lstdc++-exc
+huzzah.menu.stacksmash.disabled=Disabled
+huzzah.menu.stacksmash.disabled.build.stacksmash_flags=
+huzzah.menu.stacksmash.enabled=Enabled
+huzzah.menu.stacksmash.enabled.build.stacksmash_flags=-fstack-protector
+huzzah.menu.ssl.all=All SSL ciphers (most compatible)
+huzzah.menu.ssl.all.build.sslflags=
+huzzah.menu.ssl.basic=Basic SSL ciphers (lower ROM use)
+huzzah.menu.ssl.basic.build.sslflags=-DBEARSSL_SSL_BASIC
+huzzah.menu.mmu.3232=32KB cache + 32KB IRAM (balanced)
+huzzah.menu.mmu.3232.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+huzzah.menu.mmu.4816=16KB cache + 48KB IRAM (IRAM)
+huzzah.menu.mmu.4816.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000
+huzzah.menu.mmu.4816H=16KB cache + 48KB IRAM and 2nd Heap (shared)
+huzzah.menu.mmu.4816H.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_IRAM_HEAP
+huzzah.menu.mmu.3216=16KB cache + 32KB IRAM + 16KB 2nd Heap (not shared)
+huzzah.menu.mmu.3216.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_SEC_HEAP=0x40108000 -DMMU_SEC_HEAP_SIZE=0x4000
+huzzah.menu.mmu.ext128k=128K Heap External 23LC1024
+huzzah.menu.mmu.ext128k.build.mmuflags=-DMMU_EXTERNAL_HEAP=128 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+huzzah.menu.mmu.ext8192k=8M w/256K Heap External 64 MBit PSRAM
+huzzah.menu.mmu.ext8192k.build.mmuflags=-DMMU_EXTERNAL_HEAP=256 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+huzzah.menu.non32xfer.fast=Use pgm_read macros for IRAM/PROGMEM
+huzzah.menu.non32xfer.fast.build.non32xferflags=
+huzzah.menu.non32xfer.safe=Byte/Word access to IRAM/PROGMEM (very slow)
+huzzah.menu.non32xfer.safe.build.non32xferflags=-DNON32XFER_HANDLER
+huzzah.upload.resetmethod=--before default_reset --after hard_reset
+huzzah.build.flash_mode=qio
+huzzah.build.flash_flags=-DFLASHMODE_QIO
+huzzah.build.flash_freq=40
+huzzah.menu.eesz.4M2M=4MB (FS:2MB OTA:~1019KB)
+huzzah.menu.eesz.4M2M.build.flash_size=4M
+huzzah.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
+huzzah.menu.eesz.4M2M.build.spiffs_pagesize=256
+huzzah.menu.eesz.4M2M.build.rfcal_addr=0x3FC000
+huzzah.menu.eesz.4M2M.build.spiffs_start=0x200000
+huzzah.menu.eesz.4M2M.build.spiffs_end=0x3FA000
+huzzah.menu.eesz.4M2M.build.spiffs_blocksize=8192
+huzzah.menu.eesz.4M3M=4MB (FS:3MB OTA:~512KB)
+huzzah.menu.eesz.4M3M.build.flash_size=4M
+huzzah.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
+huzzah.menu.eesz.4M3M.build.spiffs_pagesize=256
+huzzah.menu.eesz.4M3M.build.rfcal_addr=0x3FC000
+huzzah.menu.eesz.4M3M.build.spiffs_start=0x100000
+huzzah.menu.eesz.4M3M.build.spiffs_end=0x3FA000
+huzzah.menu.eesz.4M3M.build.spiffs_blocksize=8192
+huzzah.menu.eesz.4M1M=4MB (FS:1MB OTA:~1019KB)
+huzzah.menu.eesz.4M1M.build.flash_size=4M
+huzzah.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
+huzzah.menu.eesz.4M1M.build.spiffs_pagesize=256
+huzzah.menu.eesz.4M1M.build.rfcal_addr=0x3FC000
+huzzah.menu.eesz.4M1M.build.spiffs_start=0x300000
+huzzah.menu.eesz.4M1M.build.spiffs_end=0x3FA000
+huzzah.menu.eesz.4M1M.build.spiffs_blocksize=8192
+huzzah.menu.eesz.4M=4MB (FS:none OTA:~1019KB)
+huzzah.menu.eesz.4M.build.flash_size=4M
+huzzah.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
+huzzah.menu.eesz.4M.build.spiffs_pagesize=256
+huzzah.menu.eesz.4M.build.rfcal_addr=0x3FC000
+huzzah.menu.ip.lm2f=v2 Lower Memory
+huzzah.menu.ip.lm2f.build.lwip_include=lwip2/include
+huzzah.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+huzzah.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+huzzah.menu.ip.hb2f=v2 Higher Bandwidth
+huzzah.menu.ip.hb2f.build.lwip_include=lwip2/include
+huzzah.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+huzzah.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+huzzah.menu.ip.lm2n=v2 Lower Memory (no features)
+huzzah.menu.ip.lm2n.build.lwip_include=lwip2/include
+huzzah.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+huzzah.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+huzzah.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+huzzah.menu.ip.hb2n.build.lwip_include=lwip2/include
+huzzah.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+huzzah.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+huzzah.menu.ip.lm6f=v2 IPv6 Lower Memory
+huzzah.menu.ip.lm6f.build.lwip_include=lwip2/include
+huzzah.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+huzzah.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+huzzah.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+huzzah.menu.ip.hb6f.build.lwip_include=lwip2/include
+huzzah.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+huzzah.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+huzzah.menu.dbg.Disabled=Disabled
+huzzah.menu.dbg.Disabled.build.debug_port=
+huzzah.menu.dbg.Serial=Serial
+huzzah.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+huzzah.menu.dbg.Serial1=Serial1
+huzzah.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+huzzah.menu.lvl.None____=None
+huzzah.menu.lvl.None____.build.debug_level=
+huzzah.menu.optim.Smallest=None
+huzzah.menu.optim.Smallest.build.debug_optim=-Os
+huzzah.menu.optim.Lite=Lite
+huzzah.menu.optim.Lite.build.debug_optim=-Os -fno-optimize-sibling-calls
+huzzah.menu.optim.Full=Optimum
+huzzah.menu.optim.Full.build.debug_optim=-Og
+huzzah.menu.lvl.SSL=SSL
+huzzah.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+huzzah.menu.lvl.TLS_MEM=TLS_MEM
+huzzah.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+huzzah.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+huzzah.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+huzzah.menu.lvl.HTTP_SERVER=HTTP_SERVER
+huzzah.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+huzzah.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+huzzah.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+huzzah.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+huzzah.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+huzzah.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+huzzah.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+huzzah.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+huzzah.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+huzzah.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+huzzah.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+huzzah.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+huzzah.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+huzzah.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+huzzah.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+huzzah.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+huzzah.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+huzzah.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+huzzah.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+huzzah.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+huzzah.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+huzzah.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+huzzah.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+huzzah.menu.lvl.CORE=CORE
+huzzah.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+huzzah.menu.lvl.WIFI=WIFI
+huzzah.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+huzzah.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+huzzah.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+huzzah.menu.lvl.UPDATER=UPDATER
+huzzah.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+huzzah.menu.lvl.OTA=OTA
+huzzah.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+huzzah.menu.lvl.OOM=OOM
+huzzah.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+huzzah.menu.lvl.MDNS=MDNS
+huzzah.menu.lvl.MDNS.build.debug_level= -DDEBUG_ESP_MDNS
+huzzah.menu.lvl.HWDT=HWDT
+huzzah.menu.lvl.HWDT.build.debug_level= -DDEBUG_ESP_HWDT
+huzzah.menu.lvl.HWDT_NOEXTRA4K=HWDT_NOEXTRA4K
+huzzah.menu.lvl.HWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_HWDT_NOEXTRA4K
+huzzah.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+huzzah.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+huzzah.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+huzzah.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+huzzah.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+huzzah.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+huzzah.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+huzzah.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+huzzah.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+huzzah.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+huzzah.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+huzzah.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+huzzah.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+huzzah.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+huzzah.menu.wipe.none=Only Sketch
+huzzah.menu.wipe.none.upload.erase_cmd=
+huzzah.menu.wipe.sdk=Sketch + WiFi Settings
+huzzah.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
+huzzah.menu.wipe.all=All Flash Contents
+huzzah.menu.wipe.all.upload.erase_cmd=erase_flash
+huzzah.menu.baud.115200=115200
+huzzah.menu.baud.115200.upload.speed=115200
+huzzah.menu.baud.57600=57600
+huzzah.menu.baud.57600.upload.speed=57600
+huzzah.menu.baud.230400.linux=230400
+huzzah.menu.baud.230400.macosx=230400
+huzzah.menu.baud.230400.upload.speed=230400
+huzzah.menu.baud.256000.windows=256000
+huzzah.menu.baud.256000.upload.speed=256000
+huzzah.menu.baud.460800.linux=460800
+huzzah.menu.baud.460800.macosx=460800
+huzzah.menu.baud.460800.upload.speed=460800
+huzzah.menu.baud.512000.windows=512000
+huzzah.menu.baud.512000.upload.speed=512000
+huzzah.menu.baud.921600=921600
+huzzah.menu.baud.921600.upload.speed=921600
+huzzah.menu.baud.3000000=3000000
+huzzah.menu.baud.3000000.upload.speed=3000000
+huzzah.menu.eesz.autoflash=Mapping defined by Hardware and Sketch
+huzzah.menu.eesz.autoflash.build.flash_size=16M
+huzzah.menu.eesz.autoflash.build.flash_ld=eagle.flash.auto.ld
+huzzah.menu.eesz.autoflash.build.extra_flags=-DFLASH_MAP_SUPPORT=1
+huzzah.menu.eesz.autoflash.upload.maximum_size=1044464
+huzzah.menu.iramfloat.no=in IROM
+huzzah.menu.iramfloat.no.build.iramfloat=-DFP_IN_IROM
+huzzah.menu.iramfloat.yes=allowed in ISR
+huzzah.menu.iramfloat.yes.build.iramfloat=-DFP_IN_IRAM
-generic.menu.ResetMethod.ck=ck
-generic.menu.ResetMethod.ck.upload.resetmethod=ck
-generic.menu.ResetMethod.nodemcu=nodemcu
-generic.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu
+##############################################################
+wifi_slot.name=Amperka WiFi Slot
+wifi_slot.build.board=AMPERKA_WIFI_SLOT
+wifi_slot.build.variant=wifi_slot
+wifi_slot.upload.tool=esptool
+wifi_slot.upload.maximum_data_size=81920
+wifi_slot.upload.wait_for_upload_port=true
+wifi_slot.upload.erase_cmd=
+wifi_slot.serial.disableDTR=true
+wifi_slot.serial.disableRTS=true
+wifi_slot.build.mcu=esp8266
+wifi_slot.build.core=esp8266
+wifi_slot.build.spiffs_pagesize=256
+wifi_slot.build.debug_optim=
+wifi_slot.build.debug_port=
+wifi_slot.build.debug_level=
+wifi_slot.menu.xtal.80=80 MHz
+wifi_slot.menu.xtal.80.build.f_cpu=80000000L
+wifi_slot.menu.xtal.160=160 MHz
+wifi_slot.menu.xtal.160.build.f_cpu=160000000L
+wifi_slot.menu.vt.flash=Flash
+wifi_slot.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+wifi_slot.menu.vt.heap=Heap
+wifi_slot.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+wifi_slot.menu.vt.iram=IRAM
+wifi_slot.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+wifi_slot.menu.exception.disabled=Disabled (new aborts on oom)
+wifi_slot.menu.exception.disabled.build.exception_flags=-fno-exceptions
+wifi_slot.menu.exception.disabled.build.stdcpp_lib=-lstdc++
+wifi_slot.menu.exception.enabled=Enabled
+wifi_slot.menu.exception.enabled.build.exception_flags=-fexceptions
+wifi_slot.menu.exception.enabled.build.stdcpp_lib=-lstdc++-exc
+wifi_slot.menu.stacksmash.disabled=Disabled
+wifi_slot.menu.stacksmash.disabled.build.stacksmash_flags=
+wifi_slot.menu.stacksmash.enabled=Enabled
+wifi_slot.menu.stacksmash.enabled.build.stacksmash_flags=-fstack-protector
+wifi_slot.menu.ssl.all=All SSL ciphers (most compatible)
+wifi_slot.menu.ssl.all.build.sslflags=
+wifi_slot.menu.ssl.basic=Basic SSL ciphers (lower ROM use)
+wifi_slot.menu.ssl.basic.build.sslflags=-DBEARSSL_SSL_BASIC
+wifi_slot.menu.mmu.3232=32KB cache + 32KB IRAM (balanced)
+wifi_slot.menu.mmu.3232.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+wifi_slot.menu.mmu.4816=16KB cache + 48KB IRAM (IRAM)
+wifi_slot.menu.mmu.4816.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000
+wifi_slot.menu.mmu.4816H=16KB cache + 48KB IRAM and 2nd Heap (shared)
+wifi_slot.menu.mmu.4816H.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_IRAM_HEAP
+wifi_slot.menu.mmu.3216=16KB cache + 32KB IRAM + 16KB 2nd Heap (not shared)
+wifi_slot.menu.mmu.3216.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_SEC_HEAP=0x40108000 -DMMU_SEC_HEAP_SIZE=0x4000
+wifi_slot.menu.mmu.ext128k=128K Heap External 23LC1024
+wifi_slot.menu.mmu.ext128k.build.mmuflags=-DMMU_EXTERNAL_HEAP=128 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+wifi_slot.menu.mmu.ext8192k=8M w/256K Heap External 64 MBit PSRAM
+wifi_slot.menu.mmu.ext8192k.build.mmuflags=-DMMU_EXTERNAL_HEAP=256 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+wifi_slot.menu.non32xfer.fast=Use pgm_read macros for IRAM/PROGMEM
+wifi_slot.menu.non32xfer.fast.build.non32xferflags=
+wifi_slot.menu.non32xfer.safe=Byte/Word access to IRAM/PROGMEM (very slow)
+wifi_slot.menu.non32xfer.safe.build.non32xferflags=-DNON32XFER_HANDLER
+wifi_slot.upload.resetmethod=--before default_reset --after hard_reset
+wifi_slot.menu.FlashFreq.40=40MHz
+wifi_slot.menu.FlashFreq.40.build.flash_freq=40
+wifi_slot.menu.FlashFreq.80=80MHz
+wifi_slot.menu.FlashFreq.80.build.flash_freq=80
+wifi_slot.menu.FlashFreq.20=20MHz
+wifi_slot.menu.FlashFreq.20.build.flash_freq=20
+wifi_slot.menu.FlashFreq.26=26MHz
+wifi_slot.menu.FlashFreq.26.build.flash_freq=26
+wifi_slot.menu.FlashMode.dout=DOUT (compatible)
+wifi_slot.menu.FlashMode.dout.build.flash_mode=dout
+wifi_slot.menu.FlashMode.dout.build.flash_flags=-DFLASHMODE_DOUT
+wifi_slot.menu.FlashMode.dio=DIO
+wifi_slot.menu.FlashMode.dio.build.flash_mode=dio
+wifi_slot.menu.FlashMode.dio.build.flash_flags=-DFLASHMODE_DIO
+wifi_slot.menu.FlashMode.qout=QOUT
+wifi_slot.menu.FlashMode.qout.build.flash_mode=qout
+wifi_slot.menu.FlashMode.qout.build.flash_flags=-DFLASHMODE_QOUT
+wifi_slot.menu.FlashMode.qio=QIO (fast)
+wifi_slot.menu.FlashMode.qio.build.flash_mode=qio
+wifi_slot.menu.FlashMode.qio.build.flash_flags=-DFLASHMODE_QIO
+wifi_slot.menu.eesz.1M64=1MB (FS:64KB OTA:~470KB)
+wifi_slot.menu.eesz.1M64.build.flash_size=1M
+wifi_slot.menu.eesz.1M64.build.flash_ld=eagle.flash.1m64.ld
+wifi_slot.menu.eesz.1M64.build.spiffs_pagesize=256
+wifi_slot.menu.eesz.1M64.build.rfcal_addr=0xFC000
+wifi_slot.menu.eesz.1M64.build.spiffs_start=0xEB000
+wifi_slot.menu.eesz.1M64.build.spiffs_end=0xFB000
+wifi_slot.menu.eesz.1M64.build.spiffs_blocksize=4096
+wifi_slot.menu.eesz.1M128=1MB (FS:128KB OTA:~438KB)
+wifi_slot.menu.eesz.1M128.build.flash_size=1M
+wifi_slot.menu.eesz.1M128.build.flash_ld=eagle.flash.1m128.ld
+wifi_slot.menu.eesz.1M128.build.spiffs_pagesize=256
+wifi_slot.menu.eesz.1M128.build.rfcal_addr=0xFC000
+wifi_slot.menu.eesz.1M128.build.spiffs_start=0xDB000
+wifi_slot.menu.eesz.1M128.build.spiffs_end=0xFB000
+wifi_slot.menu.eesz.1M128.build.spiffs_blocksize=4096
+wifi_slot.menu.eesz.1M144=1MB (FS:144KB OTA:~430KB)
+wifi_slot.menu.eesz.1M144.build.flash_size=1M
+wifi_slot.menu.eesz.1M144.build.flash_ld=eagle.flash.1m144.ld
+wifi_slot.menu.eesz.1M144.build.spiffs_pagesize=256
+wifi_slot.menu.eesz.1M144.build.rfcal_addr=0xFC000
+wifi_slot.menu.eesz.1M144.build.spiffs_start=0xD7000
+wifi_slot.menu.eesz.1M144.build.spiffs_end=0xFB000
+wifi_slot.menu.eesz.1M144.build.spiffs_blocksize=4096
+wifi_slot.menu.eesz.1M160=1MB (FS:160KB OTA:~422KB)
+wifi_slot.menu.eesz.1M160.build.flash_size=1M
+wifi_slot.menu.eesz.1M160.build.flash_ld=eagle.flash.1m160.ld
+wifi_slot.menu.eesz.1M160.build.spiffs_pagesize=256
+wifi_slot.menu.eesz.1M160.build.rfcal_addr=0xFC000
+wifi_slot.menu.eesz.1M160.build.spiffs_start=0xD3000
+wifi_slot.menu.eesz.1M160.build.spiffs_end=0xFB000
+wifi_slot.menu.eesz.1M160.build.spiffs_blocksize=4096
+wifi_slot.menu.eesz.1M192=1MB (FS:192KB OTA:~406KB)
+wifi_slot.menu.eesz.1M192.build.flash_size=1M
+wifi_slot.menu.eesz.1M192.build.flash_ld=eagle.flash.1m192.ld
+wifi_slot.menu.eesz.1M192.build.spiffs_pagesize=256
+wifi_slot.menu.eesz.1M192.build.rfcal_addr=0xFC000
+wifi_slot.menu.eesz.1M192.build.spiffs_start=0xCB000
+wifi_slot.menu.eesz.1M192.build.spiffs_end=0xFB000
+wifi_slot.menu.eesz.1M192.build.spiffs_blocksize=4096
+wifi_slot.menu.eesz.1M256=1MB (FS:256KB OTA:~374KB)
+wifi_slot.menu.eesz.1M256.build.flash_size=1M
+wifi_slot.menu.eesz.1M256.build.flash_ld=eagle.flash.1m256.ld
+wifi_slot.menu.eesz.1M256.build.spiffs_pagesize=256
+wifi_slot.menu.eesz.1M256.build.rfcal_addr=0xFC000
+wifi_slot.menu.eesz.1M256.build.spiffs_start=0xBB000
+wifi_slot.menu.eesz.1M256.build.spiffs_end=0xFB000
+wifi_slot.menu.eesz.1M256.build.spiffs_blocksize=4096
+wifi_slot.menu.eesz.1M512=1MB (FS:512KB OTA:~246KB)
+wifi_slot.menu.eesz.1M512.build.flash_size=1M
+wifi_slot.menu.eesz.1M512.build.flash_ld=eagle.flash.1m512.ld
+wifi_slot.menu.eesz.1M512.build.spiffs_pagesize=256
+wifi_slot.menu.eesz.1M512.build.rfcal_addr=0xFC000
+wifi_slot.menu.eesz.1M512.build.spiffs_start=0x7B000
+wifi_slot.menu.eesz.1M512.build.spiffs_end=0xFB000
+wifi_slot.menu.eesz.1M512.build.spiffs_blocksize=8192
+wifi_slot.menu.eesz.1M=1MB (FS:none OTA:~502KB)
+wifi_slot.menu.eesz.1M.build.flash_size=1M
+wifi_slot.menu.eesz.1M.build.flash_ld=eagle.flash.1m.ld
+wifi_slot.menu.eesz.1M.build.spiffs_pagesize=256
+wifi_slot.menu.eesz.1M.build.rfcal_addr=0xFC000
+wifi_slot.menu.eesz.2M64=2MB (FS:64KB OTA:~992KB)
+wifi_slot.menu.eesz.2M64.build.flash_size=2M
+wifi_slot.menu.eesz.2M64.build.flash_ld=eagle.flash.2m64.ld
+wifi_slot.menu.eesz.2M64.build.spiffs_pagesize=256
+wifi_slot.menu.eesz.2M64.build.rfcal_addr=0x1FC000
+wifi_slot.menu.eesz.2M64.build.spiffs_start=0x1F0000
+wifi_slot.menu.eesz.2M64.build.spiffs_end=0x1FB000
+wifi_slot.menu.eesz.2M64.build.spiffs_blocksize=4096
+wifi_slot.menu.eesz.2M128=2MB (FS:128KB OTA:~960KB)
+wifi_slot.menu.eesz.2M128.build.flash_size=2M
+wifi_slot.menu.eesz.2M128.build.flash_ld=eagle.flash.2m128.ld
+wifi_slot.menu.eesz.2M128.build.spiffs_pagesize=256
+wifi_slot.menu.eesz.2M128.build.rfcal_addr=0x1FC000
+wifi_slot.menu.eesz.2M128.build.spiffs_start=0x1E0000
+wifi_slot.menu.eesz.2M128.build.spiffs_end=0x1FB000
+wifi_slot.menu.eesz.2M128.build.spiffs_blocksize=4096
+wifi_slot.menu.eesz.2M256=2MB (FS:256KB OTA:~896KB)
+wifi_slot.menu.eesz.2M256.build.flash_size=2M
+wifi_slot.menu.eesz.2M256.build.flash_ld=eagle.flash.2m256.ld
+wifi_slot.menu.eesz.2M256.build.spiffs_pagesize=256
+wifi_slot.menu.eesz.2M256.build.rfcal_addr=0x1FC000
+wifi_slot.menu.eesz.2M256.build.spiffs_start=0x1C0000
+wifi_slot.menu.eesz.2M256.build.spiffs_end=0x1FB000
+wifi_slot.menu.eesz.2M256.build.spiffs_blocksize=4096
+wifi_slot.menu.eesz.2M512=2MB (FS:512KB OTA:~768KB)
+wifi_slot.menu.eesz.2M512.build.flash_size=2M
+wifi_slot.menu.eesz.2M512.build.flash_ld=eagle.flash.2m512.ld
+wifi_slot.menu.eesz.2M512.build.spiffs_pagesize=256
+wifi_slot.menu.eesz.2M512.build.rfcal_addr=0x1FC000
+wifi_slot.menu.eesz.2M512.build.spiffs_start=0x180000
+wifi_slot.menu.eesz.2M512.build.spiffs_end=0x1FA000
+wifi_slot.menu.eesz.2M512.build.spiffs_blocksize=8192
+wifi_slot.menu.eesz.2M1M=2MB (FS:1MB OTA:~512KB)
+wifi_slot.menu.eesz.2M1M.build.flash_size=2M
+wifi_slot.menu.eesz.2M1M.build.flash_ld=eagle.flash.2m1m.ld
+wifi_slot.menu.eesz.2M1M.build.spiffs_pagesize=256
+wifi_slot.menu.eesz.2M1M.build.rfcal_addr=0x1FC000
+wifi_slot.menu.eesz.2M1M.build.spiffs_start=0x100000
+wifi_slot.menu.eesz.2M1M.build.spiffs_end=0x1FA000
+wifi_slot.menu.eesz.2M1M.build.spiffs_blocksize=8192
+wifi_slot.menu.eesz.2M=2MB (FS:none OTA:~1019KB)
+wifi_slot.menu.eesz.2M.build.flash_size=2M
+wifi_slot.menu.eesz.2M.build.flash_ld=eagle.flash.2m.ld
+wifi_slot.menu.eesz.2M.build.spiffs_pagesize=256
+wifi_slot.menu.eesz.2M.build.rfcal_addr=0x1FC000
+wifi_slot.menu.ip.lm2f=v2 Lower Memory
+wifi_slot.menu.ip.lm2f.build.lwip_include=lwip2/include
+wifi_slot.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+wifi_slot.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+wifi_slot.menu.ip.hb2f=v2 Higher Bandwidth
+wifi_slot.menu.ip.hb2f.build.lwip_include=lwip2/include
+wifi_slot.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+wifi_slot.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+wifi_slot.menu.ip.lm2n=v2 Lower Memory (no features)
+wifi_slot.menu.ip.lm2n.build.lwip_include=lwip2/include
+wifi_slot.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+wifi_slot.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+wifi_slot.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+wifi_slot.menu.ip.hb2n.build.lwip_include=lwip2/include
+wifi_slot.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+wifi_slot.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+wifi_slot.menu.ip.lm6f=v2 IPv6 Lower Memory
+wifi_slot.menu.ip.lm6f.build.lwip_include=lwip2/include
+wifi_slot.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+wifi_slot.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+wifi_slot.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+wifi_slot.menu.ip.hb6f.build.lwip_include=lwip2/include
+wifi_slot.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+wifi_slot.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+wifi_slot.menu.dbg.Disabled=Disabled
+wifi_slot.menu.dbg.Disabled.build.debug_port=
+wifi_slot.menu.dbg.Serial=Serial
+wifi_slot.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+wifi_slot.menu.dbg.Serial1=Serial1
+wifi_slot.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+wifi_slot.menu.lvl.None____=None
+wifi_slot.menu.lvl.None____.build.debug_level=
+wifi_slot.menu.optim.Smallest=None
+wifi_slot.menu.optim.Smallest.build.debug_optim=-Os
+wifi_slot.menu.optim.Lite=Lite
+wifi_slot.menu.optim.Lite.build.debug_optim=-Os -fno-optimize-sibling-calls
+wifi_slot.menu.optim.Full=Optimum
+wifi_slot.menu.optim.Full.build.debug_optim=-Og
+wifi_slot.menu.lvl.SSL=SSL
+wifi_slot.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+wifi_slot.menu.lvl.TLS_MEM=TLS_MEM
+wifi_slot.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+wifi_slot.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+wifi_slot.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+wifi_slot.menu.lvl.HTTP_SERVER=HTTP_SERVER
+wifi_slot.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+wifi_slot.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+wifi_slot.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+wifi_slot.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+wifi_slot.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+wifi_slot.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+wifi_slot.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+wifi_slot.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+wifi_slot.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+wifi_slot.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+wifi_slot.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+wifi_slot.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+wifi_slot.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+wifi_slot.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+wifi_slot.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+wifi_slot.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+wifi_slot.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+wifi_slot.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+wifi_slot.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+wifi_slot.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+wifi_slot.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+wifi_slot.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+wifi_slot.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+wifi_slot.menu.lvl.CORE=CORE
+wifi_slot.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+wifi_slot.menu.lvl.WIFI=WIFI
+wifi_slot.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+wifi_slot.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+wifi_slot.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+wifi_slot.menu.lvl.UPDATER=UPDATER
+wifi_slot.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+wifi_slot.menu.lvl.OTA=OTA
+wifi_slot.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+wifi_slot.menu.lvl.OOM=OOM
+wifi_slot.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+wifi_slot.menu.lvl.MDNS=MDNS
+wifi_slot.menu.lvl.MDNS.build.debug_level= -DDEBUG_ESP_MDNS
+wifi_slot.menu.lvl.HWDT=HWDT
+wifi_slot.menu.lvl.HWDT.build.debug_level= -DDEBUG_ESP_HWDT
+wifi_slot.menu.lvl.HWDT_NOEXTRA4K=HWDT_NOEXTRA4K
+wifi_slot.menu.lvl.HWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_HWDT_NOEXTRA4K
+wifi_slot.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+wifi_slot.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+wifi_slot.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+wifi_slot.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+wifi_slot.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+wifi_slot.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+wifi_slot.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+wifi_slot.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+wifi_slot.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+wifi_slot.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+wifi_slot.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+wifi_slot.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+wifi_slot.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+wifi_slot.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+wifi_slot.menu.wipe.none=Only Sketch
+wifi_slot.menu.wipe.none.upload.erase_cmd=
+wifi_slot.menu.wipe.sdk=Sketch + WiFi Settings
+wifi_slot.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
+wifi_slot.menu.wipe.all=All Flash Contents
+wifi_slot.menu.wipe.all.upload.erase_cmd=erase_flash
+wifi_slot.menu.baud.115200=115200
+wifi_slot.menu.baud.115200.upload.speed=115200
+wifi_slot.menu.baud.57600=57600
+wifi_slot.menu.baud.57600.upload.speed=57600
+wifi_slot.menu.baud.230400.linux=230400
+wifi_slot.menu.baud.230400.macosx=230400
+wifi_slot.menu.baud.230400.upload.speed=230400
+wifi_slot.menu.baud.256000.windows=256000
+wifi_slot.menu.baud.256000.upload.speed=256000
+wifi_slot.menu.baud.460800.linux=460800
+wifi_slot.menu.baud.460800.macosx=460800
+wifi_slot.menu.baud.460800.upload.speed=460800
+wifi_slot.menu.baud.512000.windows=512000
+wifi_slot.menu.baud.512000.upload.speed=512000
+wifi_slot.menu.baud.921600=921600
+wifi_slot.menu.baud.921600.upload.speed=921600
+wifi_slot.menu.baud.3000000=3000000
+wifi_slot.menu.baud.3000000.upload.speed=3000000
+wifi_slot.menu.eesz.autoflash=Mapping defined by Hardware and Sketch
+wifi_slot.menu.eesz.autoflash.build.flash_size=16M
+wifi_slot.menu.eesz.autoflash.build.flash_ld=eagle.flash.auto.ld
+wifi_slot.menu.eesz.autoflash.build.extra_flags=-DFLASH_MAP_SUPPORT=1
+wifi_slot.menu.eesz.autoflash.upload.maximum_size=1044464
+wifi_slot.menu.iramfloat.no=in IROM
+wifi_slot.menu.iramfloat.no.build.iramfloat=-DFP_IN_IROM
+wifi_slot.menu.iramfloat.yes=allowed in ISR
+wifi_slot.menu.iramfloat.yes.build.iramfloat=-DFP_IN_IRAM
-generic.menu.Debug.Disabled=Disabled
-generic.menu.Debug.Disabled.build.debug_port=
-generic.menu.Debug.Serial=Serial
-generic.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-generic.menu.Debug.Serial1=Serial1
-generic.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+##############################################################
+arduino-esp8266.name=Arduino
+arduino-esp8266.build.board=ESP8266_ARDUINO
+arduino-esp8266.menu.BoardModel.primo=Primo
+arduino-esp8266.menu.BoardModel.primo.build.board=ESP8266_ARDUINO_PRIMO
+arduino-esp8266.menu.BoardModel.primo.build.extra_flags=-DF_CRYSTAL=40000000
+arduino-esp8266.menu.BoardModel.primo.build.variant=arduino_spi
+arduino-esp8266.menu.BoardModel.starottodeved=Star OTTO
+arduino-esp8266.menu.BoardModel.starottodeved.build.board=ESP8266_ARDUINO_STAR_OTTO
+arduino-esp8266.menu.BoardModel.starottodeved.build.extra_flags=-DF_CRYSTAL=40000000
+arduino-esp8266.menu.BoardModel.starottodeved.build.variant=arduino_uart
+arduino-esp8266.menu.BoardModel.unowifideved=Uno WiFi
+arduino-esp8266.menu.BoardModel.unowifideved.build.board=ESP8266_ARDUINO_UNOWIFI
+arduino-esp8266.menu.BoardModel.unowifideved.build.extra_flags=-DF_CRYSTAL=40000000
+arduino-esp8266.menu.BoardModel.unowifideved.build.variant=arduino_uart
+arduino-esp8266.upload.tool=esptool
+arduino-esp8266.upload.maximum_data_size=81920
+arduino-esp8266.upload.wait_for_upload_port=true
+arduino-esp8266.upload.erase_cmd=
+arduino-esp8266.serial.disableDTR=true
+arduino-esp8266.serial.disableRTS=true
+arduino-esp8266.build.mcu=esp8266
+arduino-esp8266.build.core=esp8266
+arduino-esp8266.build.variant=generic
+arduino-esp8266.build.spiffs_pagesize=256
+arduino-esp8266.build.debug_optim=
+arduino-esp8266.build.debug_port=
+arduino-esp8266.build.debug_level=
+arduino-esp8266.menu.xtal.80=80 MHz
+arduino-esp8266.menu.xtal.80.build.f_cpu=80000000L
+arduino-esp8266.menu.xtal.160=160 MHz
+arduino-esp8266.menu.xtal.160.build.f_cpu=160000000L
+arduino-esp8266.menu.vt.flash=Flash
+arduino-esp8266.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+arduino-esp8266.menu.vt.heap=Heap
+arduino-esp8266.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+arduino-esp8266.menu.vt.iram=IRAM
+arduino-esp8266.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+arduino-esp8266.menu.exception.disabled=Disabled (new aborts on oom)
+arduino-esp8266.menu.exception.disabled.build.exception_flags=-fno-exceptions
+arduino-esp8266.menu.exception.disabled.build.stdcpp_lib=-lstdc++
+arduino-esp8266.menu.exception.enabled=Enabled
+arduino-esp8266.menu.exception.enabled.build.exception_flags=-fexceptions
+arduino-esp8266.menu.exception.enabled.build.stdcpp_lib=-lstdc++-exc
+arduino-esp8266.menu.stacksmash.disabled=Disabled
+arduino-esp8266.menu.stacksmash.disabled.build.stacksmash_flags=
+arduino-esp8266.menu.stacksmash.enabled=Enabled
+arduino-esp8266.menu.stacksmash.enabled.build.stacksmash_flags=-fstack-protector
+arduino-esp8266.menu.ssl.all=All SSL ciphers (most compatible)
+arduino-esp8266.menu.ssl.all.build.sslflags=
+arduino-esp8266.menu.ssl.basic=Basic SSL ciphers (lower ROM use)
+arduino-esp8266.menu.ssl.basic.build.sslflags=-DBEARSSL_SSL_BASIC
+arduino-esp8266.menu.mmu.3232=32KB cache + 32KB IRAM (balanced)
+arduino-esp8266.menu.mmu.3232.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+arduino-esp8266.menu.mmu.4816=16KB cache + 48KB IRAM (IRAM)
+arduino-esp8266.menu.mmu.4816.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000
+arduino-esp8266.menu.mmu.4816H=16KB cache + 48KB IRAM and 2nd Heap (shared)
+arduino-esp8266.menu.mmu.4816H.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_IRAM_HEAP
+arduino-esp8266.menu.mmu.3216=16KB cache + 32KB IRAM + 16KB 2nd Heap (not shared)
+arduino-esp8266.menu.mmu.3216.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_SEC_HEAP=0x40108000 -DMMU_SEC_HEAP_SIZE=0x4000
+arduino-esp8266.menu.mmu.ext128k=128K Heap External 23LC1024
+arduino-esp8266.menu.mmu.ext128k.build.mmuflags=-DMMU_EXTERNAL_HEAP=128 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+arduino-esp8266.menu.mmu.ext8192k=8M w/256K Heap External 64 MBit PSRAM
+arduino-esp8266.menu.mmu.ext8192k.build.mmuflags=-DMMU_EXTERNAL_HEAP=256 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+arduino-esp8266.menu.non32xfer.fast=Use pgm_read macros for IRAM/PROGMEM
+arduino-esp8266.menu.non32xfer.fast.build.non32xferflags=
+arduino-esp8266.menu.non32xfer.safe=Byte/Word access to IRAM/PROGMEM (very slow)
+arduino-esp8266.menu.non32xfer.safe.build.non32xferflags=-DNON32XFER_HANDLER
+arduino-esp8266.upload.resetmethod=--before no_reset --after soft_reset
+arduino-esp8266.build.flash_mode=qio
+arduino-esp8266.build.flash_flags=-DFLASHMODE_QIO
+arduino-esp8266.build.flash_freq=40
+arduino-esp8266.menu.eesz.4M2M=4MB (FS:2MB OTA:~1019KB)
+arduino-esp8266.menu.eesz.4M2M.build.flash_size=4M
+arduino-esp8266.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
+arduino-esp8266.menu.eesz.4M2M.build.spiffs_pagesize=256
+arduino-esp8266.menu.eesz.4M2M.build.rfcal_addr=0x3FC000
+arduino-esp8266.menu.eesz.4M2M.build.spiffs_start=0x200000
+arduino-esp8266.menu.eesz.4M2M.build.spiffs_end=0x3FA000
+arduino-esp8266.menu.eesz.4M2M.build.spiffs_blocksize=8192
+arduino-esp8266.menu.eesz.4M3M=4MB (FS:3MB OTA:~512KB)
+arduino-esp8266.menu.eesz.4M3M.build.flash_size=4M
+arduino-esp8266.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
+arduino-esp8266.menu.eesz.4M3M.build.spiffs_pagesize=256
+arduino-esp8266.menu.eesz.4M3M.build.rfcal_addr=0x3FC000
+arduino-esp8266.menu.eesz.4M3M.build.spiffs_start=0x100000
+arduino-esp8266.menu.eesz.4M3M.build.spiffs_end=0x3FA000
+arduino-esp8266.menu.eesz.4M3M.build.spiffs_blocksize=8192
+arduino-esp8266.menu.eesz.4M1M=4MB (FS:1MB OTA:~1019KB)
+arduino-esp8266.menu.eesz.4M1M.build.flash_size=4M
+arduino-esp8266.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
+arduino-esp8266.menu.eesz.4M1M.build.spiffs_pagesize=256
+arduino-esp8266.menu.eesz.4M1M.build.rfcal_addr=0x3FC000
+arduino-esp8266.menu.eesz.4M1M.build.spiffs_start=0x300000
+arduino-esp8266.menu.eesz.4M1M.build.spiffs_end=0x3FA000
+arduino-esp8266.menu.eesz.4M1M.build.spiffs_blocksize=8192
+arduino-esp8266.menu.eesz.4M=4MB (FS:none OTA:~1019KB)
+arduino-esp8266.menu.eesz.4M.build.flash_size=4M
+arduino-esp8266.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
+arduino-esp8266.menu.eesz.4M.build.spiffs_pagesize=256
+arduino-esp8266.menu.eesz.4M.build.rfcal_addr=0x3FC000
+arduino-esp8266.menu.ip.lm2f=v2 Lower Memory
+arduino-esp8266.menu.ip.lm2f.build.lwip_include=lwip2/include
+arduino-esp8266.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+arduino-esp8266.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+arduino-esp8266.menu.ip.hb2f=v2 Higher Bandwidth
+arduino-esp8266.menu.ip.hb2f.build.lwip_include=lwip2/include
+arduino-esp8266.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+arduino-esp8266.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+arduino-esp8266.menu.ip.lm2n=v2 Lower Memory (no features)
+arduino-esp8266.menu.ip.lm2n.build.lwip_include=lwip2/include
+arduino-esp8266.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+arduino-esp8266.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+arduino-esp8266.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+arduino-esp8266.menu.ip.hb2n.build.lwip_include=lwip2/include
+arduino-esp8266.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+arduino-esp8266.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+arduino-esp8266.menu.ip.lm6f=v2 IPv6 Lower Memory
+arduino-esp8266.menu.ip.lm6f.build.lwip_include=lwip2/include
+arduino-esp8266.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+arduino-esp8266.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+arduino-esp8266.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+arduino-esp8266.menu.ip.hb6f.build.lwip_include=lwip2/include
+arduino-esp8266.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+arduino-esp8266.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+arduino-esp8266.menu.dbg.Disabled=Disabled
+arduino-esp8266.menu.dbg.Disabled.build.debug_port=
+arduino-esp8266.menu.dbg.Serial=Serial
+arduino-esp8266.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+arduino-esp8266.menu.dbg.Serial1=Serial1
+arduino-esp8266.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+arduino-esp8266.menu.lvl.None____=None
+arduino-esp8266.menu.lvl.None____.build.debug_level=
+arduino-esp8266.menu.optim.Smallest=None
+arduino-esp8266.menu.optim.Smallest.build.debug_optim=-Os
+arduino-esp8266.menu.optim.Lite=Lite
+arduino-esp8266.menu.optim.Lite.build.debug_optim=-Os -fno-optimize-sibling-calls
+arduino-esp8266.menu.optim.Full=Optimum
+arduino-esp8266.menu.optim.Full.build.debug_optim=-Og
+arduino-esp8266.menu.lvl.SSL=SSL
+arduino-esp8266.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+arduino-esp8266.menu.lvl.TLS_MEM=TLS_MEM
+arduino-esp8266.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+arduino-esp8266.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+arduino-esp8266.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+arduino-esp8266.menu.lvl.HTTP_SERVER=HTTP_SERVER
+arduino-esp8266.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+arduino-esp8266.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+arduino-esp8266.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+arduino-esp8266.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+arduino-esp8266.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+arduino-esp8266.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+arduino-esp8266.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+arduino-esp8266.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+arduino-esp8266.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+arduino-esp8266.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+arduino-esp8266.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+arduino-esp8266.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+arduino-esp8266.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+arduino-esp8266.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+arduino-esp8266.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+arduino-esp8266.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+arduino-esp8266.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+arduino-esp8266.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+arduino-esp8266.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+arduino-esp8266.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+arduino-esp8266.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+arduino-esp8266.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+arduino-esp8266.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+arduino-esp8266.menu.lvl.CORE=CORE
+arduino-esp8266.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+arduino-esp8266.menu.lvl.WIFI=WIFI
+arduino-esp8266.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+arduino-esp8266.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+arduino-esp8266.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+arduino-esp8266.menu.lvl.UPDATER=UPDATER
+arduino-esp8266.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+arduino-esp8266.menu.lvl.OTA=OTA
+arduino-esp8266.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+arduino-esp8266.menu.lvl.OOM=OOM
+arduino-esp8266.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+arduino-esp8266.menu.lvl.MDNS=MDNS
+arduino-esp8266.menu.lvl.MDNS.build.debug_level= -DDEBUG_ESP_MDNS
+arduino-esp8266.menu.lvl.HWDT=HWDT
+arduino-esp8266.menu.lvl.HWDT.build.debug_level= -DDEBUG_ESP_HWDT
+arduino-esp8266.menu.lvl.HWDT_NOEXTRA4K=HWDT_NOEXTRA4K
+arduino-esp8266.menu.lvl.HWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_HWDT_NOEXTRA4K
+arduino-esp8266.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+arduino-esp8266.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+arduino-esp8266.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+arduino-esp8266.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+arduino-esp8266.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+arduino-esp8266.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+arduino-esp8266.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+arduino-esp8266.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+arduino-esp8266.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+arduino-esp8266.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+arduino-esp8266.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+arduino-esp8266.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+arduino-esp8266.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+arduino-esp8266.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+arduino-esp8266.menu.wipe.none=Only Sketch
+arduino-esp8266.menu.wipe.none.upload.erase_cmd=
+arduino-esp8266.menu.wipe.sdk=Sketch + WiFi Settings
+arduino-esp8266.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
+arduino-esp8266.menu.wipe.all=All Flash Contents
+arduino-esp8266.menu.wipe.all.upload.erase_cmd=erase_flash
+arduino-esp8266.menu.baud.115200=115200
+arduino-esp8266.menu.baud.115200.upload.speed=115200
+arduino-esp8266.menu.baud.57600=57600
+arduino-esp8266.menu.baud.57600.upload.speed=57600
+arduino-esp8266.menu.baud.230400.linux=230400
+arduino-esp8266.menu.baud.230400.macosx=230400
+arduino-esp8266.menu.baud.230400.upload.speed=230400
+arduino-esp8266.menu.baud.256000.windows=256000
+arduino-esp8266.menu.baud.256000.upload.speed=256000
+arduino-esp8266.menu.baud.460800.linux=460800
+arduino-esp8266.menu.baud.460800.macosx=460800
+arduino-esp8266.menu.baud.460800.upload.speed=460800
+arduino-esp8266.menu.baud.512000.windows=512000
+arduino-esp8266.menu.baud.512000.upload.speed=512000
+arduino-esp8266.menu.baud.921600=921600
+arduino-esp8266.menu.baud.921600.upload.speed=921600
+arduino-esp8266.menu.baud.3000000=3000000
+arduino-esp8266.menu.baud.3000000.upload.speed=3000000
+arduino-esp8266.menu.eesz.autoflash=Mapping defined by Hardware and Sketch
+arduino-esp8266.menu.eesz.autoflash.build.flash_size=16M
+arduino-esp8266.menu.eesz.autoflash.build.flash_ld=eagle.flash.auto.ld
+arduino-esp8266.menu.eesz.autoflash.build.extra_flags=-DFLASH_MAP_SUPPORT=1
+arduino-esp8266.menu.eesz.autoflash.upload.maximum_size=1044464
+arduino-esp8266.menu.iramfloat.no=in IROM
+arduino-esp8266.menu.iramfloat.no.build.iramfloat=-DFP_IN_IROM
+arduino-esp8266.menu.iramfloat.yes=allowed in ISR
+arduino-esp8266.menu.iramfloat.yes.build.iramfloat=-DFP_IN_IRAM
-generic.menu.DebugLevel.None____=None
-generic.menu.DebugLevel.None____.build.debug_level=
-generic.menu.DebugLevel.Core____=Core
-generic.menu.DebugLevel.Core____.build.debug_level=-DDEBUG_ESP_CORE
-generic.menu.DebugLevel.SSL_____=Core + SSL
-generic.menu.DebugLevel.SSL_____.build.debug_level=-DDEBUG_ESP_CORE -DDEBUG_ESP_SSL
-generic.menu.DebugLevel.SSL_MEM_=Core + SSL + TLS Mem
-generic.menu.DebugLevel.SSL_MEM_.build.debug_level=-DDEBUG_ESP_CORE -DDEBUG_ESP_SSL -DDEBUG_TLS_MEM
-generic.menu.DebugLevel.WiFic___=Core + WiFi
-generic.menu.DebugLevel.WiFic___.build.debug_level=-DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI
-generic.menu.DebugLevel.WiFi____=WiFi
-generic.menu.DebugLevel.WiFi____.build.debug_level=-DDEBUG_ESP_WIFI
-generic.menu.DebugLevel.HTTPClient=HTTPClient
-generic.menu.DebugLevel.HTTPClient.build.debug_level=-DDEBUG_ESP_HTTP_CLIENT
-generic.menu.DebugLevel.HTTPClient2=HTTPClient + SSL
-generic.menu.DebugLevel.HTTPClient2.build.debug_level=-DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_SSL
-generic.menu.DebugLevel.HTTPUpdate=HTTPUpdate
-generic.menu.DebugLevel.HTTPUpdate.build.debug_level=-DDEBUG_ESP_HTTP_UPDATE
-generic.menu.DebugLevel.HTTPUpdate2=HTTPClient + HTTPUpdate
-generic.menu.DebugLevel.HTTPUpdate2.build.debug_level=-DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_HTTP_UPDATE
-generic.menu.DebugLevel.HTTPUpdate3=HTTPClient + HTTPUpdate + Updater
-generic.menu.DebugLevel.HTTPUpdate3.build.debug_level=-DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER
-generic.menu.DebugLevel.HTTPServer=HTTPServer
-generic.menu.DebugLevel.HTTPServer.build.debug_level=-DDEBUG_ESP_HTTP_SERVER
-generic.menu.DebugLevel.UPDATER=Updater
-generic.menu.DebugLevel.UPDATER.build.debug_level=-DDEBUG_ESP_UPDATER
-generic.menu.DebugLevel.OTA_____=OTA
-generic.menu.DebugLevel.OTA_____.build.debug_level=-DDEBUG_ESP_OTA
-generic.menu.DebugLevel.OTA2____=OTA + Updater
-generic.menu.DebugLevel.OTA2____.build.debug_level=-DDEBUG_ESP_OTA -DDEBUG_ESP_UPDATER
-generic.menu.DebugLevel.all_____=All
-generic.menu.DebugLevel.all_____.build.debug_level=-DDEBUG_ESP_CORE -DDEBUG_ESP_SSL -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_TLS_MEM
+##############################################################
+espmxdevkit.name=DOIT ESP-Mx DevKit (ESP8285)
+espmxdevkit.build.board=ESP8266_ESP01
+espmxdevkit.build.led=-DLED_BUILTIN=16
+espmxdevkit.build.variant=esp8285
+espmxdevkit.upload.tool=esptool
+espmxdevkit.upload.maximum_data_size=81920
+espmxdevkit.upload.wait_for_upload_port=true
+espmxdevkit.upload.erase_cmd=
+espmxdevkit.serial.disableDTR=true
+espmxdevkit.serial.disableRTS=true
+espmxdevkit.build.mcu=esp8266
+espmxdevkit.build.core=esp8266
+espmxdevkit.build.spiffs_pagesize=256
+espmxdevkit.build.debug_optim=
+espmxdevkit.build.debug_port=
+espmxdevkit.build.debug_level=
+espmxdevkit.menu.xtal.80=80 MHz
+espmxdevkit.menu.xtal.80.build.f_cpu=80000000L
+espmxdevkit.menu.xtal.160=160 MHz
+espmxdevkit.menu.xtal.160.build.f_cpu=160000000L
+espmxdevkit.menu.vt.flash=Flash
+espmxdevkit.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+espmxdevkit.menu.vt.heap=Heap
+espmxdevkit.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+espmxdevkit.menu.vt.iram=IRAM
+espmxdevkit.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+espmxdevkit.menu.exception.disabled=Disabled (new aborts on oom)
+espmxdevkit.menu.exception.disabled.build.exception_flags=-fno-exceptions
+espmxdevkit.menu.exception.disabled.build.stdcpp_lib=-lstdc++
+espmxdevkit.menu.exception.enabled=Enabled
+espmxdevkit.menu.exception.enabled.build.exception_flags=-fexceptions
+espmxdevkit.menu.exception.enabled.build.stdcpp_lib=-lstdc++-exc
+espmxdevkit.menu.stacksmash.disabled=Disabled
+espmxdevkit.menu.stacksmash.disabled.build.stacksmash_flags=
+espmxdevkit.menu.stacksmash.enabled=Enabled
+espmxdevkit.menu.stacksmash.enabled.build.stacksmash_flags=-fstack-protector
+espmxdevkit.menu.ssl.all=All SSL ciphers (most compatible)
+espmxdevkit.menu.ssl.all.build.sslflags=
+espmxdevkit.menu.ssl.basic=Basic SSL ciphers (lower ROM use)
+espmxdevkit.menu.ssl.basic.build.sslflags=-DBEARSSL_SSL_BASIC
+espmxdevkit.menu.mmu.3232=32KB cache + 32KB IRAM (balanced)
+espmxdevkit.menu.mmu.3232.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+espmxdevkit.menu.mmu.4816=16KB cache + 48KB IRAM (IRAM)
+espmxdevkit.menu.mmu.4816.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000
+espmxdevkit.menu.mmu.4816H=16KB cache + 48KB IRAM and 2nd Heap (shared)
+espmxdevkit.menu.mmu.4816H.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_IRAM_HEAP
+espmxdevkit.menu.mmu.3216=16KB cache + 32KB IRAM + 16KB 2nd Heap (not shared)
+espmxdevkit.menu.mmu.3216.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_SEC_HEAP=0x40108000 -DMMU_SEC_HEAP_SIZE=0x4000
+espmxdevkit.menu.mmu.ext128k=128K Heap External 23LC1024
+espmxdevkit.menu.mmu.ext128k.build.mmuflags=-DMMU_EXTERNAL_HEAP=128 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+espmxdevkit.menu.mmu.ext8192k=8M w/256K Heap External 64 MBit PSRAM
+espmxdevkit.menu.mmu.ext8192k.build.mmuflags=-DMMU_EXTERNAL_HEAP=256 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+espmxdevkit.menu.non32xfer.fast=Use pgm_read macros for IRAM/PROGMEM
+espmxdevkit.menu.non32xfer.fast.build.non32xferflags=
+espmxdevkit.menu.non32xfer.safe=Byte/Word access to IRAM/PROGMEM (very slow)
+espmxdevkit.menu.non32xfer.safe.build.non32xferflags=-DNON32XFER_HANDLER
+espmxdevkit.upload.resetmethod=--before default_reset --after hard_reset
+espmxdevkit.build.flash_mode=dout
+espmxdevkit.build.flash_flags=-DFLASHMODE_DOUT
+espmxdevkit.build.flash_freq=40
+espmxdevkit.menu.eesz.1M64=1MB (FS:64KB OTA:~470KB)
+espmxdevkit.menu.eesz.1M64.build.flash_size=1M
+espmxdevkit.menu.eesz.1M64.build.flash_ld=eagle.flash.1m64.ld
+espmxdevkit.menu.eesz.1M64.build.spiffs_pagesize=256
+espmxdevkit.menu.eesz.1M64.build.rfcal_addr=0xFC000
+espmxdevkit.menu.eesz.1M64.build.spiffs_start=0xEB000
+espmxdevkit.menu.eesz.1M64.build.spiffs_end=0xFB000
+espmxdevkit.menu.eesz.1M64.build.spiffs_blocksize=4096
+espmxdevkit.menu.eesz.1M128=1MB (FS:128KB OTA:~438KB)
+espmxdevkit.menu.eesz.1M128.build.flash_size=1M
+espmxdevkit.menu.eesz.1M128.build.flash_ld=eagle.flash.1m128.ld
+espmxdevkit.menu.eesz.1M128.build.spiffs_pagesize=256
+espmxdevkit.menu.eesz.1M128.build.rfcal_addr=0xFC000
+espmxdevkit.menu.eesz.1M128.build.spiffs_start=0xDB000
+espmxdevkit.menu.eesz.1M128.build.spiffs_end=0xFB000
+espmxdevkit.menu.eesz.1M128.build.spiffs_blocksize=4096
+espmxdevkit.menu.eesz.1M144=1MB (FS:144KB OTA:~430KB)
+espmxdevkit.menu.eesz.1M144.build.flash_size=1M
+espmxdevkit.menu.eesz.1M144.build.flash_ld=eagle.flash.1m144.ld
+espmxdevkit.menu.eesz.1M144.build.spiffs_pagesize=256
+espmxdevkit.menu.eesz.1M144.build.rfcal_addr=0xFC000
+espmxdevkit.menu.eesz.1M144.build.spiffs_start=0xD7000
+espmxdevkit.menu.eesz.1M144.build.spiffs_end=0xFB000
+espmxdevkit.menu.eesz.1M144.build.spiffs_blocksize=4096
+espmxdevkit.menu.eesz.1M160=1MB (FS:160KB OTA:~422KB)
+espmxdevkit.menu.eesz.1M160.build.flash_size=1M
+espmxdevkit.menu.eesz.1M160.build.flash_ld=eagle.flash.1m160.ld
+espmxdevkit.menu.eesz.1M160.build.spiffs_pagesize=256
+espmxdevkit.menu.eesz.1M160.build.rfcal_addr=0xFC000
+espmxdevkit.menu.eesz.1M160.build.spiffs_start=0xD3000
+espmxdevkit.menu.eesz.1M160.build.spiffs_end=0xFB000
+espmxdevkit.menu.eesz.1M160.build.spiffs_blocksize=4096
+espmxdevkit.menu.eesz.1M192=1MB (FS:192KB OTA:~406KB)
+espmxdevkit.menu.eesz.1M192.build.flash_size=1M
+espmxdevkit.menu.eesz.1M192.build.flash_ld=eagle.flash.1m192.ld
+espmxdevkit.menu.eesz.1M192.build.spiffs_pagesize=256
+espmxdevkit.menu.eesz.1M192.build.rfcal_addr=0xFC000
+espmxdevkit.menu.eesz.1M192.build.spiffs_start=0xCB000
+espmxdevkit.menu.eesz.1M192.build.spiffs_end=0xFB000
+espmxdevkit.menu.eesz.1M192.build.spiffs_blocksize=4096
+espmxdevkit.menu.eesz.1M256=1MB (FS:256KB OTA:~374KB)
+espmxdevkit.menu.eesz.1M256.build.flash_size=1M
+espmxdevkit.menu.eesz.1M256.build.flash_ld=eagle.flash.1m256.ld
+espmxdevkit.menu.eesz.1M256.build.spiffs_pagesize=256
+espmxdevkit.menu.eesz.1M256.build.rfcal_addr=0xFC000
+espmxdevkit.menu.eesz.1M256.build.spiffs_start=0xBB000
+espmxdevkit.menu.eesz.1M256.build.spiffs_end=0xFB000
+espmxdevkit.menu.eesz.1M256.build.spiffs_blocksize=4096
+espmxdevkit.menu.eesz.1M512=1MB (FS:512KB OTA:~246KB)
+espmxdevkit.menu.eesz.1M512.build.flash_size=1M
+espmxdevkit.menu.eesz.1M512.build.flash_ld=eagle.flash.1m512.ld
+espmxdevkit.menu.eesz.1M512.build.spiffs_pagesize=256
+espmxdevkit.menu.eesz.1M512.build.rfcal_addr=0xFC000
+espmxdevkit.menu.eesz.1M512.build.spiffs_start=0x7B000
+espmxdevkit.menu.eesz.1M512.build.spiffs_end=0xFB000
+espmxdevkit.menu.eesz.1M512.build.spiffs_blocksize=8192
+espmxdevkit.menu.eesz.1M=1MB (FS:none OTA:~502KB)
+espmxdevkit.menu.eesz.1M.build.flash_size=1M
+espmxdevkit.menu.eesz.1M.build.flash_ld=eagle.flash.1m.ld
+espmxdevkit.menu.eesz.1M.build.spiffs_pagesize=256
+espmxdevkit.menu.eesz.1M.build.rfcal_addr=0xFC000
+espmxdevkit.menu.ip.lm2f=v2 Lower Memory
+espmxdevkit.menu.ip.lm2f.build.lwip_include=lwip2/include
+espmxdevkit.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+espmxdevkit.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+espmxdevkit.menu.ip.hb2f=v2 Higher Bandwidth
+espmxdevkit.menu.ip.hb2f.build.lwip_include=lwip2/include
+espmxdevkit.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+espmxdevkit.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+espmxdevkit.menu.ip.lm2n=v2 Lower Memory (no features)
+espmxdevkit.menu.ip.lm2n.build.lwip_include=lwip2/include
+espmxdevkit.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+espmxdevkit.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+espmxdevkit.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+espmxdevkit.menu.ip.hb2n.build.lwip_include=lwip2/include
+espmxdevkit.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+espmxdevkit.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+espmxdevkit.menu.ip.lm6f=v2 IPv6 Lower Memory
+espmxdevkit.menu.ip.lm6f.build.lwip_include=lwip2/include
+espmxdevkit.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+espmxdevkit.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+espmxdevkit.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+espmxdevkit.menu.ip.hb6f.build.lwip_include=lwip2/include
+espmxdevkit.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+espmxdevkit.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+espmxdevkit.menu.dbg.Disabled=Disabled
+espmxdevkit.menu.dbg.Disabled.build.debug_port=
+espmxdevkit.menu.dbg.Serial=Serial
+espmxdevkit.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+espmxdevkit.menu.dbg.Serial1=Serial1
+espmxdevkit.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+espmxdevkit.menu.lvl.None____=None
+espmxdevkit.menu.lvl.None____.build.debug_level=
+espmxdevkit.menu.optim.Smallest=None
+espmxdevkit.menu.optim.Smallest.build.debug_optim=-Os
+espmxdevkit.menu.optim.Lite=Lite
+espmxdevkit.menu.optim.Lite.build.debug_optim=-Os -fno-optimize-sibling-calls
+espmxdevkit.menu.optim.Full=Optimum
+espmxdevkit.menu.optim.Full.build.debug_optim=-Og
+espmxdevkit.menu.lvl.SSL=SSL
+espmxdevkit.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+espmxdevkit.menu.lvl.TLS_MEM=TLS_MEM
+espmxdevkit.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+espmxdevkit.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+espmxdevkit.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+espmxdevkit.menu.lvl.HTTP_SERVER=HTTP_SERVER
+espmxdevkit.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+espmxdevkit.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+espmxdevkit.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+espmxdevkit.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+espmxdevkit.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+espmxdevkit.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+espmxdevkit.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+espmxdevkit.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+espmxdevkit.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+espmxdevkit.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+espmxdevkit.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+espmxdevkit.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+espmxdevkit.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+espmxdevkit.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+espmxdevkit.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+espmxdevkit.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+espmxdevkit.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+espmxdevkit.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+espmxdevkit.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+espmxdevkit.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+espmxdevkit.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+espmxdevkit.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+espmxdevkit.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+espmxdevkit.menu.lvl.CORE=CORE
+espmxdevkit.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+espmxdevkit.menu.lvl.WIFI=WIFI
+espmxdevkit.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+espmxdevkit.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+espmxdevkit.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+espmxdevkit.menu.lvl.UPDATER=UPDATER
+espmxdevkit.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+espmxdevkit.menu.lvl.OTA=OTA
+espmxdevkit.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+espmxdevkit.menu.lvl.OOM=OOM
+espmxdevkit.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+espmxdevkit.menu.lvl.MDNS=MDNS
+espmxdevkit.menu.lvl.MDNS.build.debug_level= -DDEBUG_ESP_MDNS
+espmxdevkit.menu.lvl.HWDT=HWDT
+espmxdevkit.menu.lvl.HWDT.build.debug_level= -DDEBUG_ESP_HWDT
+espmxdevkit.menu.lvl.HWDT_NOEXTRA4K=HWDT_NOEXTRA4K
+espmxdevkit.menu.lvl.HWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_HWDT_NOEXTRA4K
+espmxdevkit.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+espmxdevkit.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+espmxdevkit.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+espmxdevkit.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+espmxdevkit.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+espmxdevkit.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+espmxdevkit.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+espmxdevkit.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+espmxdevkit.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+espmxdevkit.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+espmxdevkit.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+espmxdevkit.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+espmxdevkit.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+espmxdevkit.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+espmxdevkit.menu.wipe.none=Only Sketch
+espmxdevkit.menu.wipe.none.upload.erase_cmd=
+espmxdevkit.menu.wipe.sdk=Sketch + WiFi Settings
+espmxdevkit.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
+espmxdevkit.menu.wipe.all=All Flash Contents
+espmxdevkit.menu.wipe.all.upload.erase_cmd=erase_flash
+espmxdevkit.menu.baud.115200=115200
+espmxdevkit.menu.baud.115200.upload.speed=115200
+espmxdevkit.menu.baud.57600=57600
+espmxdevkit.menu.baud.57600.upload.speed=57600
+espmxdevkit.menu.baud.230400.linux=230400
+espmxdevkit.menu.baud.230400.macosx=230400
+espmxdevkit.menu.baud.230400.upload.speed=230400
+espmxdevkit.menu.baud.256000.windows=256000
+espmxdevkit.menu.baud.256000.upload.speed=256000
+espmxdevkit.menu.baud.460800.linux=460800
+espmxdevkit.menu.baud.460800.macosx=460800
+espmxdevkit.menu.baud.460800.upload.speed=460800
+espmxdevkit.menu.baud.512000.windows=512000
+espmxdevkit.menu.baud.512000.upload.speed=512000
+espmxdevkit.menu.baud.921600=921600
+espmxdevkit.menu.baud.921600.upload.speed=921600
+espmxdevkit.menu.baud.3000000=3000000
+espmxdevkit.menu.baud.3000000.upload.speed=3000000
+espmxdevkit.menu.eesz.autoflash=Mapping defined by Hardware and Sketch
+espmxdevkit.menu.eesz.autoflash.build.flash_size=16M
+espmxdevkit.menu.eesz.autoflash.build.flash_ld=eagle.flash.auto.ld
+espmxdevkit.menu.eesz.autoflash.build.extra_flags=-DFLASH_MAP_SUPPORT=1
+espmxdevkit.menu.eesz.autoflash.upload.maximum_size=1044464
+espmxdevkit.menu.iramfloat.no=in IROM
+espmxdevkit.menu.iramfloat.no.build.iramfloat=-DFP_IN_IROM
+espmxdevkit.menu.iramfloat.yes=allowed in ISR
+espmxdevkit.menu.iramfloat.yes.build.iramfloat=-DFP_IN_IRAM
-# disabled because espressif's bootloader refuses to write above 4M
-# generic.menu.FlashSize.8M=8M (7M SPIFFS)
-# generic.menu.FlashSize.8M.build.flash_size=1M
-# generic.menu.FlashSize.8M.build.flash_ld=eagle.flash.8m.ld
-# generic.menu.FlashSize.8M.build.spiffs_start=0x100000
-# generic.menu.FlashSize.8M.build.spiffs_end=0x800000
-# generic.menu.FlashSize.8M.build.spiffs_blocksize=8192
-# generic.menu.FlashSize.16M=16M (15M SPIFFS)
-# generic.menu.FlashSize.16M.build.flash_size=1M
-# generic.menu.FlashSize.16M.build.flash_ld=eagle.flash.16m.ld
-# generic.menu.FlashSize.16M.build.spiffs_start=0x100000
-# generic.menu.FlashSize.16M.build.spiffs_end=0x1000000
-# generic.menu.FlashSize.16M.build.spiffs_blocksize=8192
+##############################################################
+oak.name=Digistump Oak
+oak.build.board=ESP8266_OAK
+oak.build.variant=oak
+oak.upload.maximum_size=1040368
+oak.upload.tool=esptool
+oak.upload.maximum_data_size=81920
+oak.upload.wait_for_upload_port=true
+oak.upload.erase_cmd=
+oak.serial.disableDTR=true
+oak.serial.disableRTS=true
+oak.build.mcu=esp8266
+oak.build.core=esp8266
+oak.build.spiffs_pagesize=256
+oak.build.debug_optim=
+oak.build.debug_port=
+oak.build.debug_level=
+oak.menu.xtal.80=80 MHz
+oak.menu.xtal.80.build.f_cpu=80000000L
+oak.menu.xtal.160=160 MHz
+oak.menu.xtal.160.build.f_cpu=160000000L
+oak.menu.vt.flash=Flash
+oak.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+oak.menu.vt.heap=Heap
+oak.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+oak.menu.vt.iram=IRAM
+oak.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+oak.menu.exception.disabled=Disabled (new aborts on oom)
+oak.menu.exception.disabled.build.exception_flags=-fno-exceptions
+oak.menu.exception.disabled.build.stdcpp_lib=-lstdc++
+oak.menu.exception.enabled=Enabled
+oak.menu.exception.enabled.build.exception_flags=-fexceptions
+oak.menu.exception.enabled.build.stdcpp_lib=-lstdc++-exc
+oak.menu.stacksmash.disabled=Disabled
+oak.menu.stacksmash.disabled.build.stacksmash_flags=
+oak.menu.stacksmash.enabled=Enabled
+oak.menu.stacksmash.enabled.build.stacksmash_flags=-fstack-protector
+oak.menu.ssl.all=All SSL ciphers (most compatible)
+oak.menu.ssl.all.build.sslflags=
+oak.menu.ssl.basic=Basic SSL ciphers (lower ROM use)
+oak.menu.ssl.basic.build.sslflags=-DBEARSSL_SSL_BASIC
+oak.menu.mmu.3232=32KB cache + 32KB IRAM (balanced)
+oak.menu.mmu.3232.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+oak.menu.mmu.4816=16KB cache + 48KB IRAM (IRAM)
+oak.menu.mmu.4816.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000
+oak.menu.mmu.4816H=16KB cache + 48KB IRAM and 2nd Heap (shared)
+oak.menu.mmu.4816H.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_IRAM_HEAP
+oak.menu.mmu.3216=16KB cache + 32KB IRAM + 16KB 2nd Heap (not shared)
+oak.menu.mmu.3216.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_SEC_HEAP=0x40108000 -DMMU_SEC_HEAP_SIZE=0x4000
+oak.menu.mmu.ext128k=128K Heap External 23LC1024
+oak.menu.mmu.ext128k.build.mmuflags=-DMMU_EXTERNAL_HEAP=128 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+oak.menu.mmu.ext8192k=8M w/256K Heap External 64 MBit PSRAM
+oak.menu.mmu.ext8192k.build.mmuflags=-DMMU_EXTERNAL_HEAP=256 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+oak.menu.non32xfer.fast=Use pgm_read macros for IRAM/PROGMEM
+oak.menu.non32xfer.fast.build.non32xferflags=
+oak.menu.non32xfer.safe=Byte/Word access to IRAM/PROGMEM (very slow)
+oak.menu.non32xfer.safe.build.non32xferflags=-DNON32XFER_HANDLER
+oak.upload.resetmethod=--before no_reset --after soft_reset
+oak.build.flash_mode=dio
+oak.build.flash_flags=-DFLASHMODE_DIO
+oak.build.flash_freq=40
+oak.menu.eesz.4M2M=4MB (FS:2MB OTA:~1019KB)
+oak.menu.eesz.4M2M.build.flash_size=4M
+oak.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
+oak.menu.eesz.4M2M.build.spiffs_pagesize=256
+oak.menu.eesz.4M2M.build.rfcal_addr=0x3FC000
+oak.menu.eesz.4M2M.build.spiffs_start=0x200000
+oak.menu.eesz.4M2M.build.spiffs_end=0x3FA000
+oak.menu.eesz.4M2M.build.spiffs_blocksize=8192
+oak.menu.eesz.4M3M=4MB (FS:3MB OTA:~512KB)
+oak.menu.eesz.4M3M.build.flash_size=4M
+oak.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
+oak.menu.eesz.4M3M.build.spiffs_pagesize=256
+oak.menu.eesz.4M3M.build.rfcal_addr=0x3FC000
+oak.menu.eesz.4M3M.build.spiffs_start=0x100000
+oak.menu.eesz.4M3M.build.spiffs_end=0x3FA000
+oak.menu.eesz.4M3M.build.spiffs_blocksize=8192
+oak.menu.eesz.4M1M=4MB (FS:1MB OTA:~1019KB)
+oak.menu.eesz.4M1M.build.flash_size=4M
+oak.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
+oak.menu.eesz.4M1M.build.spiffs_pagesize=256
+oak.menu.eesz.4M1M.build.rfcal_addr=0x3FC000
+oak.menu.eesz.4M1M.build.spiffs_start=0x300000
+oak.menu.eesz.4M1M.build.spiffs_end=0x3FA000
+oak.menu.eesz.4M1M.build.spiffs_blocksize=8192
+oak.menu.eesz.4M=4MB (FS:none OTA:~1019KB)
+oak.menu.eesz.4M.build.flash_size=4M
+oak.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
+oak.menu.eesz.4M.build.spiffs_pagesize=256
+oak.menu.eesz.4M.build.rfcal_addr=0x3FC000
+oak.menu.ip.lm2f=v2 Lower Memory
+oak.menu.ip.lm2f.build.lwip_include=lwip2/include
+oak.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+oak.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+oak.menu.ip.hb2f=v2 Higher Bandwidth
+oak.menu.ip.hb2f.build.lwip_include=lwip2/include
+oak.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+oak.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+oak.menu.ip.lm2n=v2 Lower Memory (no features)
+oak.menu.ip.lm2n.build.lwip_include=lwip2/include
+oak.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+oak.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+oak.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+oak.menu.ip.hb2n.build.lwip_include=lwip2/include
+oak.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+oak.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+oak.menu.ip.lm6f=v2 IPv6 Lower Memory
+oak.menu.ip.lm6f.build.lwip_include=lwip2/include
+oak.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+oak.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+oak.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+oak.menu.ip.hb6f.build.lwip_include=lwip2/include
+oak.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+oak.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+oak.menu.dbg.Disabled=Disabled
+oak.menu.dbg.Disabled.build.debug_port=
+oak.menu.dbg.Serial=Serial
+oak.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+oak.menu.dbg.Serial1=Serial1
+oak.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+oak.menu.lvl.None____=None
+oak.menu.lvl.None____.build.debug_level=
+oak.menu.optim.Smallest=None
+oak.menu.optim.Smallest.build.debug_optim=-Os
+oak.menu.optim.Lite=Lite
+oak.menu.optim.Lite.build.debug_optim=-Os -fno-optimize-sibling-calls
+oak.menu.optim.Full=Optimum
+oak.menu.optim.Full.build.debug_optim=-Og
+oak.menu.lvl.SSL=SSL
+oak.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+oak.menu.lvl.TLS_MEM=TLS_MEM
+oak.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+oak.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+oak.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+oak.menu.lvl.HTTP_SERVER=HTTP_SERVER
+oak.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+oak.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+oak.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+oak.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+oak.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+oak.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+oak.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+oak.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+oak.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+oak.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+oak.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+oak.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+oak.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+oak.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+oak.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+oak.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+oak.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+oak.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+oak.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+oak.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+oak.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+oak.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+oak.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+oak.menu.lvl.CORE=CORE
+oak.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+oak.menu.lvl.WIFI=WIFI
+oak.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+oak.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+oak.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+oak.menu.lvl.UPDATER=UPDATER
+oak.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+oak.menu.lvl.OTA=OTA
+oak.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+oak.menu.lvl.OOM=OOM
+oak.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+oak.menu.lvl.MDNS=MDNS
+oak.menu.lvl.MDNS.build.debug_level= -DDEBUG_ESP_MDNS
+oak.menu.lvl.HWDT=HWDT
+oak.menu.lvl.HWDT.build.debug_level= -DDEBUG_ESP_HWDT
+oak.menu.lvl.HWDT_NOEXTRA4K=HWDT_NOEXTRA4K
+oak.menu.lvl.HWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_HWDT_NOEXTRA4K
+oak.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+oak.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+oak.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+oak.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+oak.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+oak.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+oak.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+oak.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+oak.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+oak.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+oak.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+oak.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+oak.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+oak.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+oak.menu.wipe.none=Only Sketch
+oak.menu.wipe.none.upload.erase_cmd=
+oak.menu.wipe.sdk=Sketch + WiFi Settings
+oak.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
+oak.menu.wipe.all=All Flash Contents
+oak.menu.wipe.all.upload.erase_cmd=erase_flash
+oak.menu.baud.921600=921600
+oak.menu.baud.921600.upload.speed=921600
+oak.menu.baud.57600=57600
+oak.menu.baud.57600.upload.speed=57600
+oak.menu.baud.115200=115200
+oak.menu.baud.115200.upload.speed=115200
+oak.menu.baud.230400.linux=230400
+oak.menu.baud.230400.macosx=230400
+oak.menu.baud.230400.upload.speed=230400
+oak.menu.baud.256000.windows=256000
+oak.menu.baud.256000.upload.speed=256000
+oak.menu.baud.460800.linux=460800
+oak.menu.baud.460800.macosx=460800
+oak.menu.baud.460800.upload.speed=460800
+oak.menu.baud.512000.windows=512000
+oak.menu.baud.512000.upload.speed=512000
+oak.menu.baud.3000000=3000000
+oak.menu.baud.3000000.upload.speed=3000000
+oak.menu.eesz.autoflash=Mapping defined by Hardware and Sketch
+oak.menu.eesz.autoflash.build.flash_size=16M
+oak.menu.eesz.autoflash.build.flash_ld=eagle.flash.auto.ld
+oak.menu.eesz.autoflash.build.extra_flags=-DFLASH_MAP_SUPPORT=1
+oak.menu.eesz.autoflash.upload.maximum_size=1044464
+oak.menu.iramfloat.no=in IROM
+oak.menu.iramfloat.no.build.iramfloat=-DFP_IN_IROM
+oak.menu.iramfloat.yes=allowed in ISR
+oak.menu.iramfloat.yes.build.iramfloat=-DFP_IN_IRAM
##############################################################
espduino.name=ESPDuino (ESP-13 Module)
-
+espduino.build.board=ESP8266_ESP13
+espduino.build.variant=ESPDuino
+espduino.menu.ResetMethod.v1=ESPduino-V1
+espduino.menu.ResetMethod.v1.upload.resetmethod=--before no_reset --after soft_reset
+espduino.menu.ResetMethod.v2=ESPduino-V2
+espduino.menu.ResetMethod.v2.upload.resetmethod=--before default_reset --after hard_reset
+espduino.menu.UploadTool.espota=OTA
+espduino.menu.UploadTool.espota.upload.tool=espota
+espduino.menu.UploadTool.esptool=Serial
+espduino.menu.UploadTool.esptool.upload.tool=esptool
+espduino.menu.UploadTool.esptool.upload.verbose=--trace
espduino.upload.tool=esptool
-espduino.upload.speed=115200
-espduino.upload.resetmethod=ck
-espduino.upload.maximum_size=1044464
espduino.upload.maximum_data_size=81920
espduino.upload.wait_for_upload_port=true
+espduino.upload.erase_cmd=
espduino.serial.disableDTR=true
espduino.serial.disableRTS=true
-
espduino.build.mcu=esp8266
-espduino.build.f_cpu=80000000L
-espduino.build.board=ESP8266_ESP13
espduino.build.core=esp8266
-espduino.build.variant=ESPDuino
-espduino.build.flash_mode=dio
-espduino.build.flash_size=4M
-espduino.build.flash_freq=40
+espduino.build.spiffs_pagesize=256
+espduino.build.debug_optim=
espduino.build.debug_port=
espduino.build.debug_level=
+espduino.menu.xtal.80=80 MHz
+espduino.menu.xtal.80.build.f_cpu=80000000L
+espduino.menu.xtal.160=160 MHz
+espduino.menu.xtal.160.build.f_cpu=160000000L
+espduino.menu.vt.flash=Flash
+espduino.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+espduino.menu.vt.heap=Heap
+espduino.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+espduino.menu.vt.iram=IRAM
+espduino.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+espduino.menu.exception.disabled=Disabled (new aborts on oom)
+espduino.menu.exception.disabled.build.exception_flags=-fno-exceptions
+espduino.menu.exception.disabled.build.stdcpp_lib=-lstdc++
+espduino.menu.exception.enabled=Enabled
+espduino.menu.exception.enabled.build.exception_flags=-fexceptions
+espduino.menu.exception.enabled.build.stdcpp_lib=-lstdc++-exc
+espduino.menu.stacksmash.disabled=Disabled
+espduino.menu.stacksmash.disabled.build.stacksmash_flags=
+espduino.menu.stacksmash.enabled=Enabled
+espduino.menu.stacksmash.enabled.build.stacksmash_flags=-fstack-protector
+espduino.menu.ssl.all=All SSL ciphers (most compatible)
+espduino.menu.ssl.all.build.sslflags=
+espduino.menu.ssl.basic=Basic SSL ciphers (lower ROM use)
+espduino.menu.ssl.basic.build.sslflags=-DBEARSSL_SSL_BASIC
+espduino.menu.mmu.3232=32KB cache + 32KB IRAM (balanced)
+espduino.menu.mmu.3232.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+espduino.menu.mmu.4816=16KB cache + 48KB IRAM (IRAM)
+espduino.menu.mmu.4816.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000
+espduino.menu.mmu.4816H=16KB cache + 48KB IRAM and 2nd Heap (shared)
+espduino.menu.mmu.4816H.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_IRAM_HEAP
+espduino.menu.mmu.3216=16KB cache + 32KB IRAM + 16KB 2nd Heap (not shared)
+espduino.menu.mmu.3216.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_SEC_HEAP=0x40108000 -DMMU_SEC_HEAP_SIZE=0x4000
+espduino.menu.mmu.ext128k=128K Heap External 23LC1024
+espduino.menu.mmu.ext128k.build.mmuflags=-DMMU_EXTERNAL_HEAP=128 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+espduino.menu.mmu.ext8192k=8M w/256K Heap External 64 MBit PSRAM
+espduino.menu.mmu.ext8192k.build.mmuflags=-DMMU_EXTERNAL_HEAP=256 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+espduino.menu.non32xfer.fast=Use pgm_read macros for IRAM/PROGMEM
+espduino.menu.non32xfer.fast.build.non32xferflags=
+espduino.menu.non32xfer.safe=Byte/Word access to IRAM/PROGMEM (very slow)
+espduino.menu.non32xfer.safe.build.non32xferflags=-DNON32XFER_HANDLER
+espduino.build.flash_mode=dio
+espduino.build.flash_flags=-DFLASHMODE_DIO
+espduino.build.flash_freq=40
+espduino.menu.eesz.4M2M=4MB (FS:2MB OTA:~1019KB)
+espduino.menu.eesz.4M2M.build.flash_size=4M
+espduino.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
+espduino.menu.eesz.4M2M.build.spiffs_pagesize=256
+espduino.menu.eesz.4M2M.build.rfcal_addr=0x3FC000
+espduino.menu.eesz.4M2M.build.spiffs_start=0x200000
+espduino.menu.eesz.4M2M.build.spiffs_end=0x3FA000
+espduino.menu.eesz.4M2M.build.spiffs_blocksize=8192
+espduino.menu.eesz.4M3M=4MB (FS:3MB OTA:~512KB)
+espduino.menu.eesz.4M3M.build.flash_size=4M
+espduino.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
+espduino.menu.eesz.4M3M.build.spiffs_pagesize=256
+espduino.menu.eesz.4M3M.build.rfcal_addr=0x3FC000
+espduino.menu.eesz.4M3M.build.spiffs_start=0x100000
+espduino.menu.eesz.4M3M.build.spiffs_end=0x3FA000
+espduino.menu.eesz.4M3M.build.spiffs_blocksize=8192
+espduino.menu.eesz.4M1M=4MB (FS:1MB OTA:~1019KB)
+espduino.menu.eesz.4M1M.build.flash_size=4M
+espduino.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
+espduino.menu.eesz.4M1M.build.spiffs_pagesize=256
+espduino.menu.eesz.4M1M.build.rfcal_addr=0x3FC000
+espduino.menu.eesz.4M1M.build.spiffs_start=0x300000
+espduino.menu.eesz.4M1M.build.spiffs_end=0x3FA000
+espduino.menu.eesz.4M1M.build.spiffs_blocksize=8192
+espduino.menu.eesz.4M=4MB (FS:none OTA:~1019KB)
+espduino.menu.eesz.4M.build.flash_size=4M
+espduino.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
+espduino.menu.eesz.4M.build.spiffs_pagesize=256
+espduino.menu.eesz.4M.build.rfcal_addr=0x3FC000
+espduino.menu.ip.lm2f=v2 Lower Memory
+espduino.menu.ip.lm2f.build.lwip_include=lwip2/include
+espduino.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+espduino.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+espduino.menu.ip.hb2f=v2 Higher Bandwidth
+espduino.menu.ip.hb2f.build.lwip_include=lwip2/include
+espduino.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+espduino.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+espduino.menu.ip.lm2n=v2 Lower Memory (no features)
+espduino.menu.ip.lm2n.build.lwip_include=lwip2/include
+espduino.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+espduino.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+espduino.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+espduino.menu.ip.hb2n.build.lwip_include=lwip2/include
+espduino.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+espduino.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+espduino.menu.ip.lm6f=v2 IPv6 Lower Memory
+espduino.menu.ip.lm6f.build.lwip_include=lwip2/include
+espduino.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+espduino.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+espduino.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+espduino.menu.ip.hb6f.build.lwip_include=lwip2/include
+espduino.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+espduino.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+espduino.menu.dbg.Disabled=Disabled
+espduino.menu.dbg.Disabled.build.debug_port=
+espduino.menu.dbg.Serial=Serial
+espduino.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+espduino.menu.dbg.Serial1=Serial1
+espduino.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+espduino.menu.lvl.None____=None
+espduino.menu.lvl.None____.build.debug_level=
+espduino.menu.optim.Smallest=None
+espduino.menu.optim.Smallest.build.debug_optim=-Os
+espduino.menu.optim.Lite=Lite
+espduino.menu.optim.Lite.build.debug_optim=-Os -fno-optimize-sibling-calls
+espduino.menu.optim.Full=Optimum
+espduino.menu.optim.Full.build.debug_optim=-Og
+espduino.menu.lvl.SSL=SSL
+espduino.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+espduino.menu.lvl.TLS_MEM=TLS_MEM
+espduino.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+espduino.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+espduino.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+espduino.menu.lvl.HTTP_SERVER=HTTP_SERVER
+espduino.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+espduino.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+espduino.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+espduino.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+espduino.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+espduino.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+espduino.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+espduino.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+espduino.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+espduino.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+espduino.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+espduino.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+espduino.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+espduino.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+espduino.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+espduino.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+espduino.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+espduino.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+espduino.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+espduino.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+espduino.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+espduino.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+espduino.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+espduino.menu.lvl.CORE=CORE
+espduino.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+espduino.menu.lvl.WIFI=WIFI
+espduino.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+espduino.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+espduino.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+espduino.menu.lvl.UPDATER=UPDATER
+espduino.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+espduino.menu.lvl.OTA=OTA
+espduino.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+espduino.menu.lvl.OOM=OOM
+espduino.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+espduino.menu.lvl.MDNS=MDNS
+espduino.menu.lvl.MDNS.build.debug_level= -DDEBUG_ESP_MDNS
+espduino.menu.lvl.HWDT=HWDT
+espduino.menu.lvl.HWDT.build.debug_level= -DDEBUG_ESP_HWDT
+espduino.menu.lvl.HWDT_NOEXTRA4K=HWDT_NOEXTRA4K
+espduino.menu.lvl.HWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_HWDT_NOEXTRA4K
+espduino.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+espduino.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+espduino.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+espduino.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+espduino.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+espduino.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+espduino.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+espduino.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+espduino.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+espduino.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+espduino.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+espduino.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+espduino.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+espduino.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+espduino.menu.wipe.none=Only Sketch
+espduino.menu.wipe.none.upload.erase_cmd=
+espduino.menu.wipe.sdk=Sketch + WiFi Settings
+espduino.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
+espduino.menu.wipe.all=All Flash Contents
+espduino.menu.wipe.all.upload.erase_cmd=erase_flash
+espduino.menu.baud.115200=115200
+espduino.menu.baud.115200.upload.speed=115200
+espduino.menu.baud.57600=57600
+espduino.menu.baud.57600.upload.speed=57600
+espduino.menu.baud.230400.linux=230400
+espduino.menu.baud.230400.macosx=230400
+espduino.menu.baud.230400.upload.speed=230400
+espduino.menu.baud.256000.windows=256000
+espduino.menu.baud.256000.upload.speed=256000
+espduino.menu.baud.460800.linux=460800
+espduino.menu.baud.460800.macosx=460800
+espduino.menu.baud.460800.upload.speed=460800
+espduino.menu.baud.512000.windows=512000
+espduino.menu.baud.512000.upload.speed=512000
+espduino.menu.baud.921600=921600
+espduino.menu.baud.921600.upload.speed=921600
+espduino.menu.baud.3000000=3000000
+espduino.menu.baud.3000000.upload.speed=3000000
+espduino.menu.eesz.autoflash=Mapping defined by Hardware and Sketch
+espduino.menu.eesz.autoflash.build.flash_size=16M
+espduino.menu.eesz.autoflash.build.flash_ld=eagle.flash.auto.ld
+espduino.menu.eesz.autoflash.build.extra_flags=-DFLASH_MAP_SUPPORT=1
+espduino.menu.eesz.autoflash.upload.maximum_size=1044464
+espduino.menu.iramfloat.no=in IROM
+espduino.menu.iramfloat.no.build.iramfloat=-DFP_IN_IROM
+espduino.menu.iramfloat.yes=allowed in ISR
+espduino.menu.iramfloat.yes.build.iramfloat=-DFP_IN_IRAM
-espduino.menu.CpuFrequency.80=80 MHz
-espduino.menu.CpuFrequency.80.build.f_cpu=80000000L
-espduino.menu.CpuFrequency.160=160 MHz
-espduino.menu.CpuFrequency.160.build.f_cpu=160000000L
-
-espduino.menu.UploadSpeed.115200=115200
-espduino.menu.UploadSpeed.115200.upload.speed=115200
-espduino.menu.UploadSpeed.9600=9600
-espduino.menu.UploadSpeed.9600.upload.speed=9600
-espduino.menu.UploadSpeed.57600=57600
-espduino.menu.UploadSpeed.57600.upload.speed=57600
-espduino.menu.UploadSpeed.256000.windows=256000
-espduino.menu.UploadSpeed.256000.upload.speed=256000
-espduino.menu.UploadSpeed.230400.linux=230400
-espduino.menu.UploadSpeed.230400.macosx=230400
-espduino.menu.UploadSpeed.230400.macosx=230400
-espduino.menu.UploadSpeed.230400.upload.speed=230400
-espduino.menu.UploadSpeed.460800.linux=460800
-espduino.menu.UploadSpeed.460800.macosx=460800
-espduino.menu.UploadSpeed.460800.upload.speed=460800
-espduino.menu.UploadSpeed.512000.windows=512000
-espduino.menu.UploadSpeed.512000.upload.speed=512000
-espduino.menu.UploadSpeed.921600=921600
-espduino.menu.UploadSpeed.921600.upload.speed=921600
-
-espduino.menu.FlashSize.4M3M=4M (3M SPIFFS)
-espduino.menu.FlashSize.4M3M.build.flash_size=4M
-espduino.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-espduino.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-espduino.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-espduino.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-espduino.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-
-espduino.menu.FlashSize.4M1M=4M (1M SPIFFS)
-espduino.menu.FlashSize.4M1M.build.flash_size=4M
-espduino.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-espduino.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-espduino.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-espduino.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-espduino.menu.FlashSize.4M1M.build.spiffs_pagesize=256
##############################################################
-huzzah.name=Adafruit HUZZAH ESP8266
-
-huzzah.upload.tool=esptool
-huzzah.upload.speed=115200
-huzzah.upload.resetmethod=nodemcu
-huzzah.upload.maximum_size=1044464
-huzzah.upload.maximum_data_size=81920
-huzzah.upload.wait_for_upload_port=true
-huzzah.serial.disableDTR=true
-huzzah.serial.disableRTS=true
-
-huzzah.build.mcu=esp8266
-huzzah.build.f_cpu=80000000L
-huzzah.build.board=ESP8266_ESP12
-huzzah.build.core=esp8266
-huzzah.build.variant=adafruit
-huzzah.build.flash_mode=qio
-huzzah.build.flash_size=4M
-huzzah.build.flash_freq=40
-huzzah.build.debug_port=
-huzzah.build.debug_level=
+espectro.name=ESPectro Core
+espectro.build.board=ESP8266_ESPECTRO_CORE
+espectro.build.variant=espectro
+espectro.upload.tool=esptool
+espectro.upload.maximum_data_size=81920
+espectro.upload.wait_for_upload_port=true
+espectro.upload.erase_cmd=
+espectro.serial.disableDTR=true
+espectro.serial.disableRTS=true
+espectro.build.mcu=esp8266
+espectro.build.core=esp8266
+espectro.build.spiffs_pagesize=256
+espectro.build.debug_optim=
+espectro.build.debug_port=
+espectro.build.debug_level=
+espectro.menu.xtal.80=80 MHz
+espectro.menu.xtal.80.build.f_cpu=80000000L
+espectro.menu.xtal.160=160 MHz
+espectro.menu.xtal.160.build.f_cpu=160000000L
+espectro.menu.vt.flash=Flash
+espectro.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+espectro.menu.vt.heap=Heap
+espectro.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+espectro.menu.vt.iram=IRAM
+espectro.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+espectro.menu.exception.disabled=Disabled (new aborts on oom)
+espectro.menu.exception.disabled.build.exception_flags=-fno-exceptions
+espectro.menu.exception.disabled.build.stdcpp_lib=-lstdc++
+espectro.menu.exception.enabled=Enabled
+espectro.menu.exception.enabled.build.exception_flags=-fexceptions
+espectro.menu.exception.enabled.build.stdcpp_lib=-lstdc++-exc
+espectro.menu.stacksmash.disabled=Disabled
+espectro.menu.stacksmash.disabled.build.stacksmash_flags=
+espectro.menu.stacksmash.enabled=Enabled
+espectro.menu.stacksmash.enabled.build.stacksmash_flags=-fstack-protector
+espectro.menu.ssl.all=All SSL ciphers (most compatible)
+espectro.menu.ssl.all.build.sslflags=
+espectro.menu.ssl.basic=Basic SSL ciphers (lower ROM use)
+espectro.menu.ssl.basic.build.sslflags=-DBEARSSL_SSL_BASIC
+espectro.menu.mmu.3232=32KB cache + 32KB IRAM (balanced)
+espectro.menu.mmu.3232.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+espectro.menu.mmu.4816=16KB cache + 48KB IRAM (IRAM)
+espectro.menu.mmu.4816.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000
+espectro.menu.mmu.4816H=16KB cache + 48KB IRAM and 2nd Heap (shared)
+espectro.menu.mmu.4816H.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_IRAM_HEAP
+espectro.menu.mmu.3216=16KB cache + 32KB IRAM + 16KB 2nd Heap (not shared)
+espectro.menu.mmu.3216.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_SEC_HEAP=0x40108000 -DMMU_SEC_HEAP_SIZE=0x4000
+espectro.menu.mmu.ext128k=128K Heap External 23LC1024
+espectro.menu.mmu.ext128k.build.mmuflags=-DMMU_EXTERNAL_HEAP=128 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+espectro.menu.mmu.ext8192k=8M w/256K Heap External 64 MBit PSRAM
+espectro.menu.mmu.ext8192k.build.mmuflags=-DMMU_EXTERNAL_HEAP=256 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+espectro.menu.non32xfer.fast=Use pgm_read macros for IRAM/PROGMEM
+espectro.menu.non32xfer.fast.build.non32xferflags=
+espectro.menu.non32xfer.safe=Byte/Word access to IRAM/PROGMEM (very slow)
+espectro.menu.non32xfer.safe.build.non32xferflags=-DNON32XFER_HANDLER
+espectro.upload.resetmethod=--before default_reset --after hard_reset
+espectro.build.flash_mode=dio
+espectro.build.flash_flags=-DFLASHMODE_DIO
+espectro.build.flash_freq=40
+espectro.menu.eesz.4M2M=4MB (FS:2MB OTA:~1019KB)
+espectro.menu.eesz.4M2M.build.flash_size=4M
+espectro.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
+espectro.menu.eesz.4M2M.build.spiffs_pagesize=256
+espectro.menu.eesz.4M2M.build.rfcal_addr=0x3FC000
+espectro.menu.eesz.4M2M.build.spiffs_start=0x200000
+espectro.menu.eesz.4M2M.build.spiffs_end=0x3FA000
+espectro.menu.eesz.4M2M.build.spiffs_blocksize=8192
+espectro.menu.eesz.4M3M=4MB (FS:3MB OTA:~512KB)
+espectro.menu.eesz.4M3M.build.flash_size=4M
+espectro.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
+espectro.menu.eesz.4M3M.build.spiffs_pagesize=256
+espectro.menu.eesz.4M3M.build.rfcal_addr=0x3FC000
+espectro.menu.eesz.4M3M.build.spiffs_start=0x100000
+espectro.menu.eesz.4M3M.build.spiffs_end=0x3FA000
+espectro.menu.eesz.4M3M.build.spiffs_blocksize=8192
+espectro.menu.eesz.4M1M=4MB (FS:1MB OTA:~1019KB)
+espectro.menu.eesz.4M1M.build.flash_size=4M
+espectro.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
+espectro.menu.eesz.4M1M.build.spiffs_pagesize=256
+espectro.menu.eesz.4M1M.build.rfcal_addr=0x3FC000
+espectro.menu.eesz.4M1M.build.spiffs_start=0x300000
+espectro.menu.eesz.4M1M.build.spiffs_end=0x3FA000
+espectro.menu.eesz.4M1M.build.spiffs_blocksize=8192
+espectro.menu.eesz.4M=4MB (FS:none OTA:~1019KB)
+espectro.menu.eesz.4M.build.flash_size=4M
+espectro.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
+espectro.menu.eesz.4M.build.spiffs_pagesize=256
+espectro.menu.eesz.4M.build.rfcal_addr=0x3FC000
+espectro.menu.ip.lm2f=v2 Lower Memory
+espectro.menu.ip.lm2f.build.lwip_include=lwip2/include
+espectro.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+espectro.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+espectro.menu.ip.hb2f=v2 Higher Bandwidth
+espectro.menu.ip.hb2f.build.lwip_include=lwip2/include
+espectro.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+espectro.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+espectro.menu.ip.lm2n=v2 Lower Memory (no features)
+espectro.menu.ip.lm2n.build.lwip_include=lwip2/include
+espectro.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+espectro.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+espectro.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+espectro.menu.ip.hb2n.build.lwip_include=lwip2/include
+espectro.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+espectro.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+espectro.menu.ip.lm6f=v2 IPv6 Lower Memory
+espectro.menu.ip.lm6f.build.lwip_include=lwip2/include
+espectro.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+espectro.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+espectro.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+espectro.menu.ip.hb6f.build.lwip_include=lwip2/include
+espectro.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+espectro.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+espectro.menu.dbg.Disabled=Disabled
+espectro.menu.dbg.Disabled.build.debug_port=
+espectro.menu.dbg.Serial=Serial
+espectro.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+espectro.menu.dbg.Serial1=Serial1
+espectro.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+espectro.menu.lvl.None____=None
+espectro.menu.lvl.None____.build.debug_level=
+espectro.menu.optim.Smallest=None
+espectro.menu.optim.Smallest.build.debug_optim=-Os
+espectro.menu.optim.Lite=Lite
+espectro.menu.optim.Lite.build.debug_optim=-Os -fno-optimize-sibling-calls
+espectro.menu.optim.Full=Optimum
+espectro.menu.optim.Full.build.debug_optim=-Og
+espectro.menu.lvl.SSL=SSL
+espectro.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+espectro.menu.lvl.TLS_MEM=TLS_MEM
+espectro.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+espectro.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+espectro.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+espectro.menu.lvl.HTTP_SERVER=HTTP_SERVER
+espectro.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+espectro.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+espectro.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+espectro.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+espectro.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+espectro.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+espectro.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+espectro.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+espectro.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+espectro.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+espectro.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+espectro.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+espectro.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+espectro.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+espectro.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+espectro.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+espectro.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+espectro.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+espectro.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+espectro.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+espectro.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+espectro.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+espectro.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+espectro.menu.lvl.CORE=CORE
+espectro.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+espectro.menu.lvl.WIFI=WIFI
+espectro.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+espectro.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+espectro.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+espectro.menu.lvl.UPDATER=UPDATER
+espectro.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+espectro.menu.lvl.OTA=OTA
+espectro.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+espectro.menu.lvl.OOM=OOM
+espectro.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+espectro.menu.lvl.MDNS=MDNS
+espectro.menu.lvl.MDNS.build.debug_level= -DDEBUG_ESP_MDNS
+espectro.menu.lvl.HWDT=HWDT
+espectro.menu.lvl.HWDT.build.debug_level= -DDEBUG_ESP_HWDT
+espectro.menu.lvl.HWDT_NOEXTRA4K=HWDT_NOEXTRA4K
+espectro.menu.lvl.HWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_HWDT_NOEXTRA4K
+espectro.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+espectro.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+espectro.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+espectro.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+espectro.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+espectro.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+espectro.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+espectro.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+espectro.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+espectro.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+espectro.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+espectro.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+espectro.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+espectro.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+espectro.menu.wipe.none=Only Sketch
+espectro.menu.wipe.none.upload.erase_cmd=
+espectro.menu.wipe.sdk=Sketch + WiFi Settings
+espectro.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
+espectro.menu.wipe.all=All Flash Contents
+espectro.menu.wipe.all.upload.erase_cmd=erase_flash
+espectro.menu.baud.115200=115200
+espectro.menu.baud.115200.upload.speed=115200
+espectro.menu.baud.57600=57600
+espectro.menu.baud.57600.upload.speed=57600
+espectro.menu.baud.230400.linux=230400
+espectro.menu.baud.230400.macosx=230400
+espectro.menu.baud.230400.upload.speed=230400
+espectro.menu.baud.256000.windows=256000
+espectro.menu.baud.256000.upload.speed=256000
+espectro.menu.baud.460800.linux=460800
+espectro.menu.baud.460800.macosx=460800
+espectro.menu.baud.460800.upload.speed=460800
+espectro.menu.baud.512000.windows=512000
+espectro.menu.baud.512000.upload.speed=512000
+espectro.menu.baud.921600=921600
+espectro.menu.baud.921600.upload.speed=921600
+espectro.menu.baud.3000000=3000000
+espectro.menu.baud.3000000.upload.speed=3000000
+espectro.menu.eesz.autoflash=Mapping defined by Hardware and Sketch
+espectro.menu.eesz.autoflash.build.flash_size=16M
+espectro.menu.eesz.autoflash.build.flash_ld=eagle.flash.auto.ld
+espectro.menu.eesz.autoflash.build.extra_flags=-DFLASH_MAP_SUPPORT=1
+espectro.menu.eesz.autoflash.upload.maximum_size=1044464
+espectro.menu.iramfloat.no=in IROM
+espectro.menu.iramfloat.no.build.iramfloat=-DFP_IN_IROM
+espectro.menu.iramfloat.yes=allowed in ISR
+espectro.menu.iramfloat.yes.build.iramfloat=-DFP_IN_IRAM
-huzzah.menu.CpuFrequency.80=80 MHz
-huzzah.menu.CpuFrequency.80.build.f_cpu=80000000L
-huzzah.menu.CpuFrequency.160=160 MHz
-huzzah.menu.CpuFrequency.160.build.f_cpu=160000000L
-
-huzzah.menu.UploadSpeed.115200=115200
-huzzah.menu.UploadSpeed.115200.upload.speed=115200
-huzzah.menu.UploadSpeed.9600=9600
-huzzah.menu.UploadSpeed.9600.upload.speed=9600
-huzzah.menu.UploadSpeed.57600=57600
-huzzah.menu.UploadSpeed.57600.upload.speed=57600
-huzzah.menu.UploadSpeed.256000=256000
-huzzah.menu.UploadSpeed.256000.upload.speed=256000
-huzzah.menu.UploadSpeed.921600=921600
-huzzah.menu.UploadSpeed.921600.upload.speed=921600
-
-huzzah.menu.FlashSize.4M3M=4M (3M SPIFFS)
-huzzah.menu.FlashSize.4M3M.build.flash_size=4M
-huzzah.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-huzzah.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-huzzah.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-huzzah.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-huzzah.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-
-huzzah.menu.FlashSize.4M1M=4M (1M SPIFFS)
-huzzah.menu.FlashSize.4M1M.build.flash_size=4M
-huzzah.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-huzzah.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-huzzah.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-huzzah.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-huzzah.menu.FlashSize.4M1M.build.spiffs_pagesize=256
+##############################################################
+espino.name=ESPino (ESP-12 Module)
+espino.build.board=ESP8266_ESPINO_ESP12
+espino.build.variant=espino
+espino.upload.tool=esptool
+espino.upload.maximum_data_size=81920
+espino.upload.wait_for_upload_port=true
+espino.upload.erase_cmd=
+espino.serial.disableDTR=true
+espino.serial.disableRTS=true
+espino.build.mcu=esp8266
+espino.build.core=esp8266
+espino.build.spiffs_pagesize=256
+espino.build.debug_optim=
+espino.build.debug_port=
+espino.build.debug_level=
+espino.menu.xtal.80=80 MHz
+espino.menu.xtal.80.build.f_cpu=80000000L
+espino.menu.xtal.160=160 MHz
+espino.menu.xtal.160.build.f_cpu=160000000L
+espino.menu.vt.flash=Flash
+espino.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+espino.menu.vt.heap=Heap
+espino.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+espino.menu.vt.iram=IRAM
+espino.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+espino.menu.exception.disabled=Disabled (new aborts on oom)
+espino.menu.exception.disabled.build.exception_flags=-fno-exceptions
+espino.menu.exception.disabled.build.stdcpp_lib=-lstdc++
+espino.menu.exception.enabled=Enabled
+espino.menu.exception.enabled.build.exception_flags=-fexceptions
+espino.menu.exception.enabled.build.stdcpp_lib=-lstdc++-exc
+espino.menu.stacksmash.disabled=Disabled
+espino.menu.stacksmash.disabled.build.stacksmash_flags=
+espino.menu.stacksmash.enabled=Enabled
+espino.menu.stacksmash.enabled.build.stacksmash_flags=-fstack-protector
+espino.menu.ssl.all=All SSL ciphers (most compatible)
+espino.menu.ssl.all.build.sslflags=
+espino.menu.ssl.basic=Basic SSL ciphers (lower ROM use)
+espino.menu.ssl.basic.build.sslflags=-DBEARSSL_SSL_BASIC
+espino.menu.mmu.3232=32KB cache + 32KB IRAM (balanced)
+espino.menu.mmu.3232.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+espino.menu.mmu.4816=16KB cache + 48KB IRAM (IRAM)
+espino.menu.mmu.4816.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000
+espino.menu.mmu.4816H=16KB cache + 48KB IRAM and 2nd Heap (shared)
+espino.menu.mmu.4816H.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_IRAM_HEAP
+espino.menu.mmu.3216=16KB cache + 32KB IRAM + 16KB 2nd Heap (not shared)
+espino.menu.mmu.3216.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_SEC_HEAP=0x40108000 -DMMU_SEC_HEAP_SIZE=0x4000
+espino.menu.mmu.ext128k=128K Heap External 23LC1024
+espino.menu.mmu.ext128k.build.mmuflags=-DMMU_EXTERNAL_HEAP=128 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+espino.menu.mmu.ext8192k=8M w/256K Heap External 64 MBit PSRAM
+espino.menu.mmu.ext8192k.build.mmuflags=-DMMU_EXTERNAL_HEAP=256 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+espino.menu.non32xfer.fast=Use pgm_read macros for IRAM/PROGMEM
+espino.menu.non32xfer.fast.build.non32xferflags=
+espino.menu.non32xfer.safe=Byte/Word access to IRAM/PROGMEM (very slow)
+espino.menu.non32xfer.safe.build.non32xferflags=-DNON32XFER_HANDLER
+espino.menu.ResetMethod.nodemcu=dtr (aka nodemcu)
+espino.menu.ResetMethod.nodemcu.upload.resetmethod=--before default_reset --after hard_reset
+espino.menu.ResetMethod.ck=no dtr (aka ck)
+espino.menu.ResetMethod.ck.upload.resetmethod=--before no_reset --after soft_reset
+espino.build.flash_mode=qio
+espino.build.flash_flags=-DFLASHMODE_QIO
+espino.build.flash_freq=40
+espino.menu.eesz.4M2M=4MB (FS:2MB OTA:~1019KB)
+espino.menu.eesz.4M2M.build.flash_size=4M
+espino.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
+espino.menu.eesz.4M2M.build.spiffs_pagesize=256
+espino.menu.eesz.4M2M.build.rfcal_addr=0x3FC000
+espino.menu.eesz.4M2M.build.spiffs_start=0x200000
+espino.menu.eesz.4M2M.build.spiffs_end=0x3FA000
+espino.menu.eesz.4M2M.build.spiffs_blocksize=8192
+espino.menu.eesz.4M3M=4MB (FS:3MB OTA:~512KB)
+espino.menu.eesz.4M3M.build.flash_size=4M
+espino.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
+espino.menu.eesz.4M3M.build.spiffs_pagesize=256
+espino.menu.eesz.4M3M.build.rfcal_addr=0x3FC000
+espino.menu.eesz.4M3M.build.spiffs_start=0x100000
+espino.menu.eesz.4M3M.build.spiffs_end=0x3FA000
+espino.menu.eesz.4M3M.build.spiffs_blocksize=8192
+espino.menu.eesz.4M1M=4MB (FS:1MB OTA:~1019KB)
+espino.menu.eesz.4M1M.build.flash_size=4M
+espino.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
+espino.menu.eesz.4M1M.build.spiffs_pagesize=256
+espino.menu.eesz.4M1M.build.rfcal_addr=0x3FC000
+espino.menu.eesz.4M1M.build.spiffs_start=0x300000
+espino.menu.eesz.4M1M.build.spiffs_end=0x3FA000
+espino.menu.eesz.4M1M.build.spiffs_blocksize=8192
+espino.menu.eesz.4M=4MB (FS:none OTA:~1019KB)
+espino.menu.eesz.4M.build.flash_size=4M
+espino.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
+espino.menu.eesz.4M.build.spiffs_pagesize=256
+espino.menu.eesz.4M.build.rfcal_addr=0x3FC000
+espino.menu.ip.lm2f=v2 Lower Memory
+espino.menu.ip.lm2f.build.lwip_include=lwip2/include
+espino.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+espino.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+espino.menu.ip.hb2f=v2 Higher Bandwidth
+espino.menu.ip.hb2f.build.lwip_include=lwip2/include
+espino.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+espino.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+espino.menu.ip.lm2n=v2 Lower Memory (no features)
+espino.menu.ip.lm2n.build.lwip_include=lwip2/include
+espino.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+espino.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+espino.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+espino.menu.ip.hb2n.build.lwip_include=lwip2/include
+espino.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+espino.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+espino.menu.ip.lm6f=v2 IPv6 Lower Memory
+espino.menu.ip.lm6f.build.lwip_include=lwip2/include
+espino.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+espino.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+espino.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+espino.menu.ip.hb6f.build.lwip_include=lwip2/include
+espino.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+espino.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+espino.menu.dbg.Disabled=Disabled
+espino.menu.dbg.Disabled.build.debug_port=
+espino.menu.dbg.Serial=Serial
+espino.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+espino.menu.dbg.Serial1=Serial1
+espino.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+espino.menu.lvl.None____=None
+espino.menu.lvl.None____.build.debug_level=
+espino.menu.optim.Smallest=None
+espino.menu.optim.Smallest.build.debug_optim=-Os
+espino.menu.optim.Lite=Lite
+espino.menu.optim.Lite.build.debug_optim=-Os -fno-optimize-sibling-calls
+espino.menu.optim.Full=Optimum
+espino.menu.optim.Full.build.debug_optim=-Og
+espino.menu.lvl.SSL=SSL
+espino.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+espino.menu.lvl.TLS_MEM=TLS_MEM
+espino.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+espino.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+espino.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+espino.menu.lvl.HTTP_SERVER=HTTP_SERVER
+espino.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+espino.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+espino.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+espino.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+espino.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+espino.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+espino.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+espino.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+espino.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+espino.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+espino.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+espino.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+espino.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+espino.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+espino.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+espino.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+espino.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+espino.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+espino.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+espino.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+espino.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+espino.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+espino.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+espino.menu.lvl.CORE=CORE
+espino.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+espino.menu.lvl.WIFI=WIFI
+espino.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+espino.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+espino.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+espino.menu.lvl.UPDATER=UPDATER
+espino.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+espino.menu.lvl.OTA=OTA
+espino.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+espino.menu.lvl.OOM=OOM
+espino.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+espino.menu.lvl.MDNS=MDNS
+espino.menu.lvl.MDNS.build.debug_level= -DDEBUG_ESP_MDNS
+espino.menu.lvl.HWDT=HWDT
+espino.menu.lvl.HWDT.build.debug_level= -DDEBUG_ESP_HWDT
+espino.menu.lvl.HWDT_NOEXTRA4K=HWDT_NOEXTRA4K
+espino.menu.lvl.HWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_HWDT_NOEXTRA4K
+espino.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+espino.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+espino.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+espino.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+espino.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+espino.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+espino.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+espino.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+espino.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+espino.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+espino.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+espino.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+espino.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+espino.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+espino.menu.wipe.none=Only Sketch
+espino.menu.wipe.none.upload.erase_cmd=
+espino.menu.wipe.sdk=Sketch + WiFi Settings
+espino.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
+espino.menu.wipe.all=All Flash Contents
+espino.menu.wipe.all.upload.erase_cmd=erase_flash
+espino.menu.baud.115200=115200
+espino.menu.baud.115200.upload.speed=115200
+espino.menu.baud.57600=57600
+espino.menu.baud.57600.upload.speed=57600
+espino.menu.baud.230400.linux=230400
+espino.menu.baud.230400.macosx=230400
+espino.menu.baud.230400.upload.speed=230400
+espino.menu.baud.256000.windows=256000
+espino.menu.baud.256000.upload.speed=256000
+espino.menu.baud.460800.linux=460800
+espino.menu.baud.460800.macosx=460800
+espino.menu.baud.460800.upload.speed=460800
+espino.menu.baud.512000.windows=512000
+espino.menu.baud.512000.upload.speed=512000
+espino.menu.baud.921600=921600
+espino.menu.baud.921600.upload.speed=921600
+espino.menu.baud.3000000=3000000
+espino.menu.baud.3000000.upload.speed=3000000
+espino.menu.eesz.autoflash=Mapping defined by Hardware and Sketch
+espino.menu.eesz.autoflash.build.flash_size=16M
+espino.menu.eesz.autoflash.build.flash_ld=eagle.flash.auto.ld
+espino.menu.eesz.autoflash.build.extra_flags=-DFLASH_MAP_SUPPORT=1
+espino.menu.eesz.autoflash.upload.maximum_size=1044464
+espino.menu.iramfloat.no=in IROM
+espino.menu.iramfloat.no.build.iramfloat=-DFP_IN_IROM
+espino.menu.iramfloat.yes=allowed in ISR
+espino.menu.iramfloat.yes.build.iramfloat=-DFP_IN_IRAM
##############################################################
espresso_lite_v1.name=ESPresso Lite 1.0
+espresso_lite_v1.build.board=ESP8266_ESPRESSO_LITE_V1
+espresso_lite_v1.build.variant=espresso_lite_v1
espresso_lite_v1.upload.tool=esptool
-espresso_lite_v1.upload.speed=115200
-espresso_lite_v1.upload.maximum_size=1044464
espresso_lite_v1.upload.maximum_data_size=81920
espresso_lite_v1.upload.wait_for_upload_port=true
-
+espresso_lite_v1.upload.erase_cmd=
+espresso_lite_v1.serial.disableDTR=true
+espresso_lite_v1.serial.disableRTS=true
espresso_lite_v1.build.mcu=esp8266
-espresso_lite_v1.build.f_cpu=80000000L
-espresso_lite_v1.build.board=ESP8266_ESPRESSO_LITE_V1
espresso_lite_v1.build.core=esp8266
-espresso_lite_v1.build.variant=espresso_lite_v1
-espresso_lite_v1.build.flash_mode=dio
-espresso_lite_v1.build.flash_size=4M
-espresso_lite_v1.build.flash_freq=40
-
-espresso_lite_v1.menu.CpuFrequency.80=80 MHz
-espresso_lite_v1.menu.CpuFrequency.80.build.f_cpu=80000000L
-espresso_lite_v1.menu.CpuFrequency.160=160 MHz
-espresso_lite_v1.menu.CpuFrequency.160.build.f_cpu=160000000L
-
-espresso_lite_v1.menu.UploadSpeed.115200=115200
-espresso_lite_v1.menu.UploadSpeed.115200.upload.speed=115200
-espresso_lite_v1.menu.UploadSpeed.57600=57600
-espresso_lite_v1.menu.UploadSpeed.57600.upload.speed=57600
-espresso_lite_v1.menu.UploadSpeed.256000.windows=256000
-espresso_lite_v1.menu.UploadSpeed.256000.upload.speed=256000
-espresso_lite_v1.menu.UploadSpeed.230400.linux=230400
-espresso_lite_v1.menu.UploadSpeed.230400.macosx=230400
-espresso_lite_v1.menu.UploadSpeed.230400.macosx=230400
-espresso_lite_v1.menu.UploadSpeed.230400.upload.speed=230400
-espresso_lite_v1.menu.UploadSpeed.460800.linux=460800
-espresso_lite_v1.menu.UploadSpeed.460800.macosx=460800
-espresso_lite_v1.menu.UploadSpeed.460800.upload.speed=460800
-espresso_lite_v1.menu.UploadSpeed.512000.windows=512000
-espresso_lite_v1.menu.UploadSpeed.512000.upload.speed=512000
-espresso_lite_v1.menu.UploadSpeed.921600=921600
-espresso_lite_v1.menu.UploadSpeed.921600.upload.speed=921600
-
-espresso_lite_v1.menu.FlashSize.4M3M=4M (3M SPIFFS)
-espresso_lite_v1.menu.FlashSize.4M3M.build.flash_size=4M
-espresso_lite_v1.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-espresso_lite_v1.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-espresso_lite_v1.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-espresso_lite_v1.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-espresso_lite_v1.menu.FlashSize.4M3M.upload.maximum_size=1044464
-
-espresso_lite_v1.menu.FlashSize.4M1M=4M (1M SPIFFS)
-espresso_lite_v1.menu.FlashSize.4M1M.build.flash_size=4M
-espresso_lite_v1.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-espresso_lite_v1.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-espresso_lite_v1.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-espresso_lite_v1.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-espresso_lite_v1.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-espresso_lite_v1.menu.FlashSize.4M1M.upload.maximum_size=1044464
-
-espresso_lite_v1.menu.ResetMethod.nodemcu=nodemcu
-espresso_lite_v1.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu
-espresso_lite_v1.menu.ResetMethod.ck=ck
-espresso_lite_v1.menu.ResetMethod.ck.upload.resetmethod=ck
-
-espresso_lite_v1.menu.Debug.Disabled=Disabled
-espresso_lite_v1.menu.Debug.Disabled.build.debug_port=
-espresso_lite_v1.menu.Debug.Serial=Serial
-espresso_lite_v1.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-espresso_lite_v1.menu.Debug.Serial1=Serial1
-espresso_lite_v1.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-
-espresso_lite_v1.menu.DebugLevel.None____=None
-espresso_lite_v1.menu.DebugLevel.None____.build.debug_level=
-espresso_lite_v1.menu.DebugLevel.Core____=Core
-espresso_lite_v1.menu.DebugLevel.Core____.build.debug_level=-DDEBUG_ESP_CORE
-espresso_lite_v1.menu.DebugLevel.SSL_____=Core + SSL
-espresso_lite_v1.menu.DebugLevel.SSL_____.build.debug_level=-DDEBUG_ESP_CORE -DDEBUG_ESP_SSL
-espresso_lite_v1.menu.DebugLevel.SSL_MEM_=Core + SSL + TLS Mem
-espresso_lite_v1.menu.DebugLevel.SSL_MEM_.build.debug_level=-DDEBUG_ESP_CORE -DDEBUG_ESP_SSL -DDEBUG_TLS_MEM
-espresso_lite_v1.menu.DebugLevel.WiFic___=Core + WiFi
-espresso_lite_v1.menu.DebugLevel.WiFic___.build.debug_level=-DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI
-espresso_lite_v1.menu.DebugLevel.WiFi____=WiFi
-espresso_lite_v1.menu.DebugLevel.WiFi____.build.debug_level=-DDEBUG_ESP_WIFI
-espresso_lite_v1.menu.DebugLevel.HTTPClient=HTTPClient
-espresso_lite_v1.menu.DebugLevel.HTTPClient.build.debug_level=-DDEBUG_ESP_HTTP_CLIENT
-espresso_lite_v1.menu.DebugLevel.HTTPClient2=HTTPClient + SSL
-espresso_lite_v1.menu.DebugLevel.HTTPClient2.build.debug_level=-DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_SSL
-espresso_lite_v1.menu.DebugLevel.HTTPUpdate=HTTPUpdate
-espresso_lite_v1.menu.DebugLevel.HTTPUpdate.build.debug_level=-DDEBUG_ESP_HTTP_UPDATE
-espresso_lite_v1.menu.DebugLevel.HTTPUpdate2=HTTPClient + HTTPUpdate
-espresso_lite_v1.menu.DebugLevel.HTTPUpdate2.build.debug_level=-DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_HTTP_UPDATE
-espresso_lite_v1.menu.DebugLevel.HTTPUpdate3=HTTPClient + HTTPUpdate + Updater
-espresso_lite_v1.menu.DebugLevel.HTTPUpdate3.build.debug_level=-DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER
-espresso_lite_v1.menu.DebugLevel.HTTPServer=HTTPServer
-espresso_lite_v1.menu.DebugLevel.HTTPServer.build.debug_level=-DDEBUG_ESP_HTTP_SERVER
-espresso_lite_v1.menu.DebugLevel.UPDATER=Updater
-espresso_lite_v1.menu.DebugLevel.UPDATER.build.debug_level=-DDEBUG_ESP_UPDATER
-espresso_lite_v1.menu.DebugLevel.OTA_____=OTA
-espresso_lite_v1.menu.DebugLevel.OTA_____.build.debug_level=-DDEBUG_ESP_OTA
-espresso_lite_v1.menu.DebugLevel.OTA2____=OTA + Updater
-espresso_lite_v1.menu.DebugLevel.OTA2____.build.debug_level=-DDEBUG_ESP_OTA -DDEBUG_ESP_UPDATER
-espresso_lite_v1.menu.DebugLevel.all_____=All
-espresso_lite_v1.menu.DebugLevel.all_____.build.debug_level=-DDEBUG_ESP_CORE -DDEBUG_ESP_SSL -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_TLS_MEM
-
+espresso_lite_v1.build.spiffs_pagesize=256
+espresso_lite_v1.build.debug_optim=
espresso_lite_v1.build.debug_port=
espresso_lite_v1.build.debug_level=
+espresso_lite_v1.menu.xtal.80=80 MHz
+espresso_lite_v1.menu.xtal.80.build.f_cpu=80000000L
+espresso_lite_v1.menu.xtal.160=160 MHz
+espresso_lite_v1.menu.xtal.160.build.f_cpu=160000000L
+espresso_lite_v1.menu.vt.flash=Flash
+espresso_lite_v1.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+espresso_lite_v1.menu.vt.heap=Heap
+espresso_lite_v1.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+espresso_lite_v1.menu.vt.iram=IRAM
+espresso_lite_v1.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+espresso_lite_v1.menu.exception.disabled=Disabled (new aborts on oom)
+espresso_lite_v1.menu.exception.disabled.build.exception_flags=-fno-exceptions
+espresso_lite_v1.menu.exception.disabled.build.stdcpp_lib=-lstdc++
+espresso_lite_v1.menu.exception.enabled=Enabled
+espresso_lite_v1.menu.exception.enabled.build.exception_flags=-fexceptions
+espresso_lite_v1.menu.exception.enabled.build.stdcpp_lib=-lstdc++-exc
+espresso_lite_v1.menu.stacksmash.disabled=Disabled
+espresso_lite_v1.menu.stacksmash.disabled.build.stacksmash_flags=
+espresso_lite_v1.menu.stacksmash.enabled=Enabled
+espresso_lite_v1.menu.stacksmash.enabled.build.stacksmash_flags=-fstack-protector
+espresso_lite_v1.menu.ssl.all=All SSL ciphers (most compatible)
+espresso_lite_v1.menu.ssl.all.build.sslflags=
+espresso_lite_v1.menu.ssl.basic=Basic SSL ciphers (lower ROM use)
+espresso_lite_v1.menu.ssl.basic.build.sslflags=-DBEARSSL_SSL_BASIC
+espresso_lite_v1.menu.mmu.3232=32KB cache + 32KB IRAM (balanced)
+espresso_lite_v1.menu.mmu.3232.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+espresso_lite_v1.menu.mmu.4816=16KB cache + 48KB IRAM (IRAM)
+espresso_lite_v1.menu.mmu.4816.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000
+espresso_lite_v1.menu.mmu.4816H=16KB cache + 48KB IRAM and 2nd Heap (shared)
+espresso_lite_v1.menu.mmu.4816H.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_IRAM_HEAP
+espresso_lite_v1.menu.mmu.3216=16KB cache + 32KB IRAM + 16KB 2nd Heap (not shared)
+espresso_lite_v1.menu.mmu.3216.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_SEC_HEAP=0x40108000 -DMMU_SEC_HEAP_SIZE=0x4000
+espresso_lite_v1.menu.mmu.ext128k=128K Heap External 23LC1024
+espresso_lite_v1.menu.mmu.ext128k.build.mmuflags=-DMMU_EXTERNAL_HEAP=128 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+espresso_lite_v1.menu.mmu.ext8192k=8M w/256K Heap External 64 MBit PSRAM
+espresso_lite_v1.menu.mmu.ext8192k.build.mmuflags=-DMMU_EXTERNAL_HEAP=256 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+espresso_lite_v1.menu.non32xfer.fast=Use pgm_read macros for IRAM/PROGMEM
+espresso_lite_v1.menu.non32xfer.fast.build.non32xferflags=
+espresso_lite_v1.menu.non32xfer.safe=Byte/Word access to IRAM/PROGMEM (very slow)
+espresso_lite_v1.menu.non32xfer.safe.build.non32xferflags=-DNON32XFER_HANDLER
+espresso_lite_v1.build.flash_mode=dio
+espresso_lite_v1.build.flash_flags=-DFLASHMODE_DIO
+espresso_lite_v1.build.flash_freq=40
+espresso_lite_v1.menu.eesz.4M2M=4MB (FS:2MB OTA:~1019KB)
+espresso_lite_v1.menu.eesz.4M2M.build.flash_size=4M
+espresso_lite_v1.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
+espresso_lite_v1.menu.eesz.4M2M.build.spiffs_pagesize=256
+espresso_lite_v1.menu.eesz.4M2M.build.rfcal_addr=0x3FC000
+espresso_lite_v1.menu.eesz.4M2M.build.spiffs_start=0x200000
+espresso_lite_v1.menu.eesz.4M2M.build.spiffs_end=0x3FA000
+espresso_lite_v1.menu.eesz.4M2M.build.spiffs_blocksize=8192
+espresso_lite_v1.menu.eesz.4M3M=4MB (FS:3MB OTA:~512KB)
+espresso_lite_v1.menu.eesz.4M3M.build.flash_size=4M
+espresso_lite_v1.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
+espresso_lite_v1.menu.eesz.4M3M.build.spiffs_pagesize=256
+espresso_lite_v1.menu.eesz.4M3M.build.rfcal_addr=0x3FC000
+espresso_lite_v1.menu.eesz.4M3M.build.spiffs_start=0x100000
+espresso_lite_v1.menu.eesz.4M3M.build.spiffs_end=0x3FA000
+espresso_lite_v1.menu.eesz.4M3M.build.spiffs_blocksize=8192
+espresso_lite_v1.menu.eesz.4M1M=4MB (FS:1MB OTA:~1019KB)
+espresso_lite_v1.menu.eesz.4M1M.build.flash_size=4M
+espresso_lite_v1.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
+espresso_lite_v1.menu.eesz.4M1M.build.spiffs_pagesize=256
+espresso_lite_v1.menu.eesz.4M1M.build.rfcal_addr=0x3FC000
+espresso_lite_v1.menu.eesz.4M1M.build.spiffs_start=0x300000
+espresso_lite_v1.menu.eesz.4M1M.build.spiffs_end=0x3FA000
+espresso_lite_v1.menu.eesz.4M1M.build.spiffs_blocksize=8192
+espresso_lite_v1.menu.eesz.4M=4MB (FS:none OTA:~1019KB)
+espresso_lite_v1.menu.eesz.4M.build.flash_size=4M
+espresso_lite_v1.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
+espresso_lite_v1.menu.eesz.4M.build.spiffs_pagesize=256
+espresso_lite_v1.menu.eesz.4M.build.rfcal_addr=0x3FC000
+espresso_lite_v1.menu.ResetMethod.nodemcu=dtr (aka nodemcu)
+espresso_lite_v1.menu.ResetMethod.nodemcu.upload.resetmethod=--before default_reset --after hard_reset
+espresso_lite_v1.menu.ResetMethod.ck=no dtr (aka ck)
+espresso_lite_v1.menu.ResetMethod.ck.upload.resetmethod=--before no_reset --after soft_reset
+espresso_lite_v1.menu.ip.lm2f=v2 Lower Memory
+espresso_lite_v1.menu.ip.lm2f.build.lwip_include=lwip2/include
+espresso_lite_v1.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+espresso_lite_v1.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+espresso_lite_v1.menu.ip.hb2f=v2 Higher Bandwidth
+espresso_lite_v1.menu.ip.hb2f.build.lwip_include=lwip2/include
+espresso_lite_v1.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+espresso_lite_v1.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+espresso_lite_v1.menu.ip.lm2n=v2 Lower Memory (no features)
+espresso_lite_v1.menu.ip.lm2n.build.lwip_include=lwip2/include
+espresso_lite_v1.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+espresso_lite_v1.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+espresso_lite_v1.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+espresso_lite_v1.menu.ip.hb2n.build.lwip_include=lwip2/include
+espresso_lite_v1.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+espresso_lite_v1.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+espresso_lite_v1.menu.ip.lm6f=v2 IPv6 Lower Memory
+espresso_lite_v1.menu.ip.lm6f.build.lwip_include=lwip2/include
+espresso_lite_v1.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+espresso_lite_v1.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+espresso_lite_v1.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+espresso_lite_v1.menu.ip.hb6f.build.lwip_include=lwip2/include
+espresso_lite_v1.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+espresso_lite_v1.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+espresso_lite_v1.menu.dbg.Disabled=Disabled
+espresso_lite_v1.menu.dbg.Disabled.build.debug_port=
+espresso_lite_v1.menu.dbg.Serial=Serial
+espresso_lite_v1.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+espresso_lite_v1.menu.dbg.Serial1=Serial1
+espresso_lite_v1.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+espresso_lite_v1.menu.lvl.None____=None
+espresso_lite_v1.menu.lvl.None____.build.debug_level=
+espresso_lite_v1.menu.optim.Smallest=None
+espresso_lite_v1.menu.optim.Smallest.build.debug_optim=-Os
+espresso_lite_v1.menu.optim.Lite=Lite
+espresso_lite_v1.menu.optim.Lite.build.debug_optim=-Os -fno-optimize-sibling-calls
+espresso_lite_v1.menu.optim.Full=Optimum
+espresso_lite_v1.menu.optim.Full.build.debug_optim=-Og
+espresso_lite_v1.menu.lvl.SSL=SSL
+espresso_lite_v1.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+espresso_lite_v1.menu.lvl.TLS_MEM=TLS_MEM
+espresso_lite_v1.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+espresso_lite_v1.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+espresso_lite_v1.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+espresso_lite_v1.menu.lvl.HTTP_SERVER=HTTP_SERVER
+espresso_lite_v1.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+espresso_lite_v1.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+espresso_lite_v1.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+espresso_lite_v1.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+espresso_lite_v1.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+espresso_lite_v1.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+espresso_lite_v1.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+espresso_lite_v1.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+espresso_lite_v1.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+espresso_lite_v1.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+espresso_lite_v1.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+espresso_lite_v1.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+espresso_lite_v1.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+espresso_lite_v1.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+espresso_lite_v1.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+espresso_lite_v1.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+espresso_lite_v1.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+espresso_lite_v1.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+espresso_lite_v1.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+espresso_lite_v1.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+espresso_lite_v1.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+espresso_lite_v1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+espresso_lite_v1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+espresso_lite_v1.menu.lvl.CORE=CORE
+espresso_lite_v1.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+espresso_lite_v1.menu.lvl.WIFI=WIFI
+espresso_lite_v1.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+espresso_lite_v1.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+espresso_lite_v1.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+espresso_lite_v1.menu.lvl.UPDATER=UPDATER
+espresso_lite_v1.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+espresso_lite_v1.menu.lvl.OTA=OTA
+espresso_lite_v1.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+espresso_lite_v1.menu.lvl.OOM=OOM
+espresso_lite_v1.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+espresso_lite_v1.menu.lvl.MDNS=MDNS
+espresso_lite_v1.menu.lvl.MDNS.build.debug_level= -DDEBUG_ESP_MDNS
+espresso_lite_v1.menu.lvl.HWDT=HWDT
+espresso_lite_v1.menu.lvl.HWDT.build.debug_level= -DDEBUG_ESP_HWDT
+espresso_lite_v1.menu.lvl.HWDT_NOEXTRA4K=HWDT_NOEXTRA4K
+espresso_lite_v1.menu.lvl.HWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_HWDT_NOEXTRA4K
+espresso_lite_v1.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+espresso_lite_v1.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+espresso_lite_v1.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+espresso_lite_v1.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+espresso_lite_v1.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+espresso_lite_v1.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+espresso_lite_v1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+espresso_lite_v1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+espresso_lite_v1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+espresso_lite_v1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+espresso_lite_v1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+espresso_lite_v1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+espresso_lite_v1.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+espresso_lite_v1.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+espresso_lite_v1.menu.wipe.none=Only Sketch
+espresso_lite_v1.menu.wipe.none.upload.erase_cmd=
+espresso_lite_v1.menu.wipe.sdk=Sketch + WiFi Settings
+espresso_lite_v1.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
+espresso_lite_v1.menu.wipe.all=All Flash Contents
+espresso_lite_v1.menu.wipe.all.upload.erase_cmd=erase_flash
+espresso_lite_v1.menu.baud.115200=115200
+espresso_lite_v1.menu.baud.115200.upload.speed=115200
+espresso_lite_v1.menu.baud.57600=57600
+espresso_lite_v1.menu.baud.57600.upload.speed=57600
+espresso_lite_v1.menu.baud.230400.linux=230400
+espresso_lite_v1.menu.baud.230400.macosx=230400
+espresso_lite_v1.menu.baud.230400.upload.speed=230400
+espresso_lite_v1.menu.baud.256000.windows=256000
+espresso_lite_v1.menu.baud.256000.upload.speed=256000
+espresso_lite_v1.menu.baud.460800.linux=460800
+espresso_lite_v1.menu.baud.460800.macosx=460800
+espresso_lite_v1.menu.baud.460800.upload.speed=460800
+espresso_lite_v1.menu.baud.512000.windows=512000
+espresso_lite_v1.menu.baud.512000.upload.speed=512000
+espresso_lite_v1.menu.baud.921600=921600
+espresso_lite_v1.menu.baud.921600.upload.speed=921600
+espresso_lite_v1.menu.baud.3000000=3000000
+espresso_lite_v1.menu.baud.3000000.upload.speed=3000000
+espresso_lite_v1.menu.eesz.autoflash=Mapping defined by Hardware and Sketch
+espresso_lite_v1.menu.eesz.autoflash.build.flash_size=16M
+espresso_lite_v1.menu.eesz.autoflash.build.flash_ld=eagle.flash.auto.ld
+espresso_lite_v1.menu.eesz.autoflash.build.extra_flags=-DFLASH_MAP_SUPPORT=1
+espresso_lite_v1.menu.eesz.autoflash.upload.maximum_size=1044464
+espresso_lite_v1.menu.iramfloat.no=in IROM
+espresso_lite_v1.menu.iramfloat.no.build.iramfloat=-DFP_IN_IROM
+espresso_lite_v1.menu.iramfloat.yes=allowed in ISR
+espresso_lite_v1.menu.iramfloat.yes.build.iramfloat=-DFP_IN_IRAM
##############################################################
espresso_lite_v2.name=ESPresso Lite 2.0
+espresso_lite_v2.build.board=ESP8266_ESPRESSO_LITE_V2
+espresso_lite_v2.build.variant=espresso_lite_v2
espresso_lite_v2.upload.tool=esptool
-espresso_lite_v2.upload.speed=115200
-espresso_lite_v2.upload.maximum_size=1044464
espresso_lite_v2.upload.maximum_data_size=81920
espresso_lite_v2.upload.wait_for_upload_port=true
-
+espresso_lite_v2.upload.erase_cmd=
+espresso_lite_v2.serial.disableDTR=true
+espresso_lite_v2.serial.disableRTS=true
espresso_lite_v2.build.mcu=esp8266
-espresso_lite_v2.build.f_cpu=80000000L
-espresso_lite_v2.build.board=ESP8266_ESPRESSO_LITE_V2
espresso_lite_v2.build.core=esp8266
-espresso_lite_v2.build.variant=espresso_lite_v2
+espresso_lite_v2.build.spiffs_pagesize=256
+espresso_lite_v2.build.debug_optim=
+espresso_lite_v2.build.debug_port=
+espresso_lite_v2.build.debug_level=
+espresso_lite_v2.menu.xtal.80=80 MHz
+espresso_lite_v2.menu.xtal.80.build.f_cpu=80000000L
+espresso_lite_v2.menu.xtal.160=160 MHz
+espresso_lite_v2.menu.xtal.160.build.f_cpu=160000000L
+espresso_lite_v2.menu.vt.flash=Flash
+espresso_lite_v2.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+espresso_lite_v2.menu.vt.heap=Heap
+espresso_lite_v2.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+espresso_lite_v2.menu.vt.iram=IRAM
+espresso_lite_v2.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+espresso_lite_v2.menu.exception.disabled=Disabled (new aborts on oom)
+espresso_lite_v2.menu.exception.disabled.build.exception_flags=-fno-exceptions
+espresso_lite_v2.menu.exception.disabled.build.stdcpp_lib=-lstdc++
+espresso_lite_v2.menu.exception.enabled=Enabled
+espresso_lite_v2.menu.exception.enabled.build.exception_flags=-fexceptions
+espresso_lite_v2.menu.exception.enabled.build.stdcpp_lib=-lstdc++-exc
+espresso_lite_v2.menu.stacksmash.disabled=Disabled
+espresso_lite_v2.menu.stacksmash.disabled.build.stacksmash_flags=
+espresso_lite_v2.menu.stacksmash.enabled=Enabled
+espresso_lite_v2.menu.stacksmash.enabled.build.stacksmash_flags=-fstack-protector
+espresso_lite_v2.menu.ssl.all=All SSL ciphers (most compatible)
+espresso_lite_v2.menu.ssl.all.build.sslflags=
+espresso_lite_v2.menu.ssl.basic=Basic SSL ciphers (lower ROM use)
+espresso_lite_v2.menu.ssl.basic.build.sslflags=-DBEARSSL_SSL_BASIC
+espresso_lite_v2.menu.mmu.3232=32KB cache + 32KB IRAM (balanced)
+espresso_lite_v2.menu.mmu.3232.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+espresso_lite_v2.menu.mmu.4816=16KB cache + 48KB IRAM (IRAM)
+espresso_lite_v2.menu.mmu.4816.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000
+espresso_lite_v2.menu.mmu.4816H=16KB cache + 48KB IRAM and 2nd Heap (shared)
+espresso_lite_v2.menu.mmu.4816H.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_IRAM_HEAP
+espresso_lite_v2.menu.mmu.3216=16KB cache + 32KB IRAM + 16KB 2nd Heap (not shared)
+espresso_lite_v2.menu.mmu.3216.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_SEC_HEAP=0x40108000 -DMMU_SEC_HEAP_SIZE=0x4000
+espresso_lite_v2.menu.mmu.ext128k=128K Heap External 23LC1024
+espresso_lite_v2.menu.mmu.ext128k.build.mmuflags=-DMMU_EXTERNAL_HEAP=128 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+espresso_lite_v2.menu.mmu.ext8192k=8M w/256K Heap External 64 MBit PSRAM
+espresso_lite_v2.menu.mmu.ext8192k.build.mmuflags=-DMMU_EXTERNAL_HEAP=256 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+espresso_lite_v2.menu.non32xfer.fast=Use pgm_read macros for IRAM/PROGMEM
+espresso_lite_v2.menu.non32xfer.fast.build.non32xferflags=
+espresso_lite_v2.menu.non32xfer.safe=Byte/Word access to IRAM/PROGMEM (very slow)
+espresso_lite_v2.menu.non32xfer.safe.build.non32xferflags=-DNON32XFER_HANDLER
espresso_lite_v2.build.flash_mode=dio
-espresso_lite_v2.build.flash_size=4M
+espresso_lite_v2.build.flash_flags=-DFLASHMODE_DIO
espresso_lite_v2.build.flash_freq=40
+espresso_lite_v2.menu.eesz.4M2M=4MB (FS:2MB OTA:~1019KB)
+espresso_lite_v2.menu.eesz.4M2M.build.flash_size=4M
+espresso_lite_v2.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
+espresso_lite_v2.menu.eesz.4M2M.build.spiffs_pagesize=256
+espresso_lite_v2.menu.eesz.4M2M.build.rfcal_addr=0x3FC000
+espresso_lite_v2.menu.eesz.4M2M.build.spiffs_start=0x200000
+espresso_lite_v2.menu.eesz.4M2M.build.spiffs_end=0x3FA000
+espresso_lite_v2.menu.eesz.4M2M.build.spiffs_blocksize=8192
+espresso_lite_v2.menu.eesz.4M3M=4MB (FS:3MB OTA:~512KB)
+espresso_lite_v2.menu.eesz.4M3M.build.flash_size=4M
+espresso_lite_v2.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
+espresso_lite_v2.menu.eesz.4M3M.build.spiffs_pagesize=256
+espresso_lite_v2.menu.eesz.4M3M.build.rfcal_addr=0x3FC000
+espresso_lite_v2.menu.eesz.4M3M.build.spiffs_start=0x100000
+espresso_lite_v2.menu.eesz.4M3M.build.spiffs_end=0x3FA000
+espresso_lite_v2.menu.eesz.4M3M.build.spiffs_blocksize=8192
+espresso_lite_v2.menu.eesz.4M1M=4MB (FS:1MB OTA:~1019KB)
+espresso_lite_v2.menu.eesz.4M1M.build.flash_size=4M
+espresso_lite_v2.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
+espresso_lite_v2.menu.eesz.4M1M.build.spiffs_pagesize=256
+espresso_lite_v2.menu.eesz.4M1M.build.rfcal_addr=0x3FC000
+espresso_lite_v2.menu.eesz.4M1M.build.spiffs_start=0x300000
+espresso_lite_v2.menu.eesz.4M1M.build.spiffs_end=0x3FA000
+espresso_lite_v2.menu.eesz.4M1M.build.spiffs_blocksize=8192
+espresso_lite_v2.menu.eesz.4M=4MB (FS:none OTA:~1019KB)
+espresso_lite_v2.menu.eesz.4M.build.flash_size=4M
+espresso_lite_v2.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
+espresso_lite_v2.menu.eesz.4M.build.spiffs_pagesize=256
+espresso_lite_v2.menu.eesz.4M.build.rfcal_addr=0x3FC000
+espresso_lite_v2.menu.ResetMethod.nodemcu=dtr (aka nodemcu)
+espresso_lite_v2.menu.ResetMethod.nodemcu.upload.resetmethod=--before default_reset --after hard_reset
+espresso_lite_v2.menu.ResetMethod.ck=no dtr (aka ck)
+espresso_lite_v2.menu.ResetMethod.ck.upload.resetmethod=--before no_reset --after soft_reset
+espresso_lite_v2.menu.ip.lm2f=v2 Lower Memory
+espresso_lite_v2.menu.ip.lm2f.build.lwip_include=lwip2/include
+espresso_lite_v2.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+espresso_lite_v2.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+espresso_lite_v2.menu.ip.hb2f=v2 Higher Bandwidth
+espresso_lite_v2.menu.ip.hb2f.build.lwip_include=lwip2/include
+espresso_lite_v2.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+espresso_lite_v2.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+espresso_lite_v2.menu.ip.lm2n=v2 Lower Memory (no features)
+espresso_lite_v2.menu.ip.lm2n.build.lwip_include=lwip2/include
+espresso_lite_v2.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+espresso_lite_v2.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+espresso_lite_v2.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+espresso_lite_v2.menu.ip.hb2n.build.lwip_include=lwip2/include
+espresso_lite_v2.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+espresso_lite_v2.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+espresso_lite_v2.menu.ip.lm6f=v2 IPv6 Lower Memory
+espresso_lite_v2.menu.ip.lm6f.build.lwip_include=lwip2/include
+espresso_lite_v2.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+espresso_lite_v2.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+espresso_lite_v2.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+espresso_lite_v2.menu.ip.hb6f.build.lwip_include=lwip2/include
+espresso_lite_v2.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+espresso_lite_v2.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+espresso_lite_v2.menu.dbg.Disabled=Disabled
+espresso_lite_v2.menu.dbg.Disabled.build.debug_port=
+espresso_lite_v2.menu.dbg.Serial=Serial
+espresso_lite_v2.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+espresso_lite_v2.menu.dbg.Serial1=Serial1
+espresso_lite_v2.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+espresso_lite_v2.menu.lvl.None____=None
+espresso_lite_v2.menu.lvl.None____.build.debug_level=
+espresso_lite_v2.menu.optim.Smallest=None
+espresso_lite_v2.menu.optim.Smallest.build.debug_optim=-Os
+espresso_lite_v2.menu.optim.Lite=Lite
+espresso_lite_v2.menu.optim.Lite.build.debug_optim=-Os -fno-optimize-sibling-calls
+espresso_lite_v2.menu.optim.Full=Optimum
+espresso_lite_v2.menu.optim.Full.build.debug_optim=-Og
+espresso_lite_v2.menu.lvl.SSL=SSL
+espresso_lite_v2.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+espresso_lite_v2.menu.lvl.TLS_MEM=TLS_MEM
+espresso_lite_v2.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+espresso_lite_v2.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+espresso_lite_v2.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+espresso_lite_v2.menu.lvl.HTTP_SERVER=HTTP_SERVER
+espresso_lite_v2.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+espresso_lite_v2.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+espresso_lite_v2.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+espresso_lite_v2.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+espresso_lite_v2.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+espresso_lite_v2.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+espresso_lite_v2.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+espresso_lite_v2.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+espresso_lite_v2.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+espresso_lite_v2.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+espresso_lite_v2.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+espresso_lite_v2.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+espresso_lite_v2.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+espresso_lite_v2.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+espresso_lite_v2.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+espresso_lite_v2.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+espresso_lite_v2.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+espresso_lite_v2.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+espresso_lite_v2.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+espresso_lite_v2.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+espresso_lite_v2.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+espresso_lite_v2.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+espresso_lite_v2.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+espresso_lite_v2.menu.lvl.CORE=CORE
+espresso_lite_v2.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+espresso_lite_v2.menu.lvl.WIFI=WIFI
+espresso_lite_v2.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+espresso_lite_v2.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+espresso_lite_v2.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+espresso_lite_v2.menu.lvl.UPDATER=UPDATER
+espresso_lite_v2.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+espresso_lite_v2.menu.lvl.OTA=OTA
+espresso_lite_v2.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+espresso_lite_v2.menu.lvl.OOM=OOM
+espresso_lite_v2.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+espresso_lite_v2.menu.lvl.MDNS=MDNS
+espresso_lite_v2.menu.lvl.MDNS.build.debug_level= -DDEBUG_ESP_MDNS
+espresso_lite_v2.menu.lvl.HWDT=HWDT
+espresso_lite_v2.menu.lvl.HWDT.build.debug_level= -DDEBUG_ESP_HWDT
+espresso_lite_v2.menu.lvl.HWDT_NOEXTRA4K=HWDT_NOEXTRA4K
+espresso_lite_v2.menu.lvl.HWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_HWDT_NOEXTRA4K
+espresso_lite_v2.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+espresso_lite_v2.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+espresso_lite_v2.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+espresso_lite_v2.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+espresso_lite_v2.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+espresso_lite_v2.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+espresso_lite_v2.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+espresso_lite_v2.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+espresso_lite_v2.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+espresso_lite_v2.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+espresso_lite_v2.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+espresso_lite_v2.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+espresso_lite_v2.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+espresso_lite_v2.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+espresso_lite_v2.menu.wipe.none=Only Sketch
+espresso_lite_v2.menu.wipe.none.upload.erase_cmd=
+espresso_lite_v2.menu.wipe.sdk=Sketch + WiFi Settings
+espresso_lite_v2.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
+espresso_lite_v2.menu.wipe.all=All Flash Contents
+espresso_lite_v2.menu.wipe.all.upload.erase_cmd=erase_flash
+espresso_lite_v2.menu.baud.115200=115200
+espresso_lite_v2.menu.baud.115200.upload.speed=115200
+espresso_lite_v2.menu.baud.57600=57600
+espresso_lite_v2.menu.baud.57600.upload.speed=57600
+espresso_lite_v2.menu.baud.230400.linux=230400
+espresso_lite_v2.menu.baud.230400.macosx=230400
+espresso_lite_v2.menu.baud.230400.upload.speed=230400
+espresso_lite_v2.menu.baud.256000.windows=256000
+espresso_lite_v2.menu.baud.256000.upload.speed=256000
+espresso_lite_v2.menu.baud.460800.linux=460800
+espresso_lite_v2.menu.baud.460800.macosx=460800
+espresso_lite_v2.menu.baud.460800.upload.speed=460800
+espresso_lite_v2.menu.baud.512000.windows=512000
+espresso_lite_v2.menu.baud.512000.upload.speed=512000
+espresso_lite_v2.menu.baud.921600=921600
+espresso_lite_v2.menu.baud.921600.upload.speed=921600
+espresso_lite_v2.menu.baud.3000000=3000000
+espresso_lite_v2.menu.baud.3000000.upload.speed=3000000
+espresso_lite_v2.menu.eesz.autoflash=Mapping defined by Hardware and Sketch
+espresso_lite_v2.menu.eesz.autoflash.build.flash_size=16M
+espresso_lite_v2.menu.eesz.autoflash.build.flash_ld=eagle.flash.auto.ld
+espresso_lite_v2.menu.eesz.autoflash.build.extra_flags=-DFLASH_MAP_SUPPORT=1
+espresso_lite_v2.menu.eesz.autoflash.upload.maximum_size=1044464
+espresso_lite_v2.menu.iramfloat.no=in IROM
+espresso_lite_v2.menu.iramfloat.no.build.iramfloat=-DFP_IN_IROM
+espresso_lite_v2.menu.iramfloat.yes=allowed in ISR
+espresso_lite_v2.menu.iramfloat.yes.build.iramfloat=-DFP_IN_IRAM
-espresso_lite_v2.menu.CpuFrequency.80=80 MHz
-espresso_lite_v2.menu.CpuFrequency.80.build.f_cpu=80000000L
-espresso_lite_v2.menu.CpuFrequency.160=160 MHz
-espresso_lite_v2.menu.CpuFrequency.160.build.f_cpu=160000000L
+##############################################################
+sonoff.name=ITEAD Sonoff
+sonoff.build.board=ESP8266_SONOFF_SV
+sonoff.build.flash_size=1M
+sonoff.build.variant=itead
+sonoff.menu.BoardModel.sonoffBasic=ITEAD Sonoff Basic
+sonoff.menu.BoardModel.sonoffBasic.build.board=ESP8266_SONOFF_BASIC
+sonoff.menu.BoardModel.sonoffS20=ITEAD Sonoff S20
+sonoff.menu.BoardModel.sonoffS20.build.board=ESP8266_SONOFF_S20
+sonoff.menu.BoardModel.sonoffSV=ITEAD Sonoff SV
+sonoff.menu.BoardModel.sonoffSV.build.board=ESP8266_SONOFF_SV
+sonoff.menu.BoardModel.sonoffTH=ITEAD Sonoff TH
+sonoff.menu.BoardModel.sonoffTH.build.board=ESP8266_SONOFF_TH
+sonoff.upload.tool=esptool
+sonoff.upload.maximum_data_size=81920
+sonoff.upload.wait_for_upload_port=true
+sonoff.upload.erase_cmd=
+sonoff.serial.disableDTR=true
+sonoff.serial.disableRTS=true
+sonoff.build.mcu=esp8266
+sonoff.build.core=esp8266
+sonoff.build.spiffs_pagesize=256
+sonoff.build.debug_optim=
+sonoff.build.debug_port=
+sonoff.build.debug_level=
+sonoff.menu.xtal.80=80 MHz
+sonoff.menu.xtal.80.build.f_cpu=80000000L
+sonoff.menu.xtal.160=160 MHz
+sonoff.menu.xtal.160.build.f_cpu=160000000L
+sonoff.menu.vt.flash=Flash
+sonoff.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+sonoff.menu.vt.heap=Heap
+sonoff.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+sonoff.menu.vt.iram=IRAM
+sonoff.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+sonoff.menu.exception.disabled=Disabled (new aborts on oom)
+sonoff.menu.exception.disabled.build.exception_flags=-fno-exceptions
+sonoff.menu.exception.disabled.build.stdcpp_lib=-lstdc++
+sonoff.menu.exception.enabled=Enabled
+sonoff.menu.exception.enabled.build.exception_flags=-fexceptions
+sonoff.menu.exception.enabled.build.stdcpp_lib=-lstdc++-exc
+sonoff.menu.stacksmash.disabled=Disabled
+sonoff.menu.stacksmash.disabled.build.stacksmash_flags=
+sonoff.menu.stacksmash.enabled=Enabled
+sonoff.menu.stacksmash.enabled.build.stacksmash_flags=-fstack-protector
+sonoff.menu.ssl.all=All SSL ciphers (most compatible)
+sonoff.menu.ssl.all.build.sslflags=
+sonoff.menu.ssl.basic=Basic SSL ciphers (lower ROM use)
+sonoff.menu.ssl.basic.build.sslflags=-DBEARSSL_SSL_BASIC
+sonoff.menu.mmu.3232=32KB cache + 32KB IRAM (balanced)
+sonoff.menu.mmu.3232.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+sonoff.menu.mmu.4816=16KB cache + 48KB IRAM (IRAM)
+sonoff.menu.mmu.4816.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000
+sonoff.menu.mmu.4816H=16KB cache + 48KB IRAM and 2nd Heap (shared)
+sonoff.menu.mmu.4816H.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_IRAM_HEAP
+sonoff.menu.mmu.3216=16KB cache + 32KB IRAM + 16KB 2nd Heap (not shared)
+sonoff.menu.mmu.3216.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_SEC_HEAP=0x40108000 -DMMU_SEC_HEAP_SIZE=0x4000
+sonoff.menu.mmu.ext128k=128K Heap External 23LC1024
+sonoff.menu.mmu.ext128k.build.mmuflags=-DMMU_EXTERNAL_HEAP=128 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+sonoff.menu.mmu.ext8192k=8M w/256K Heap External 64 MBit PSRAM
+sonoff.menu.mmu.ext8192k.build.mmuflags=-DMMU_EXTERNAL_HEAP=256 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+sonoff.menu.non32xfer.fast=Use pgm_read macros for IRAM/PROGMEM
+sonoff.menu.non32xfer.fast.build.non32xferflags=
+sonoff.menu.non32xfer.safe=Byte/Word access to IRAM/PROGMEM (very slow)
+sonoff.menu.non32xfer.safe.build.non32xferflags=-DNON32XFER_HANDLER
+sonoff.upload.resetmethod=--before no_reset --after soft_reset
+sonoff.build.flash_mode=dout
+sonoff.build.flash_flags=-DFLASHMODE_DOUT
+sonoff.build.flash_freq=40
+sonoff.menu.eesz.1M64=1MB (FS:64KB OTA:~470KB)
+sonoff.menu.eesz.1M64.build.flash_size=1M
+sonoff.menu.eesz.1M64.build.flash_ld=eagle.flash.1m64.ld
+sonoff.menu.eesz.1M64.build.spiffs_pagesize=256
+sonoff.menu.eesz.1M64.build.rfcal_addr=0xFC000
+sonoff.menu.eesz.1M64.build.spiffs_start=0xEB000
+sonoff.menu.eesz.1M64.build.spiffs_end=0xFB000
+sonoff.menu.eesz.1M64.build.spiffs_blocksize=4096
+sonoff.menu.eesz.1M128=1MB (FS:128KB OTA:~438KB)
+sonoff.menu.eesz.1M128.build.flash_size=1M
+sonoff.menu.eesz.1M128.build.flash_ld=eagle.flash.1m128.ld
+sonoff.menu.eesz.1M128.build.spiffs_pagesize=256
+sonoff.menu.eesz.1M128.build.rfcal_addr=0xFC000
+sonoff.menu.eesz.1M128.build.spiffs_start=0xDB000
+sonoff.menu.eesz.1M128.build.spiffs_end=0xFB000
+sonoff.menu.eesz.1M128.build.spiffs_blocksize=4096
+sonoff.menu.eesz.1M144=1MB (FS:144KB OTA:~430KB)
+sonoff.menu.eesz.1M144.build.flash_size=1M
+sonoff.menu.eesz.1M144.build.flash_ld=eagle.flash.1m144.ld
+sonoff.menu.eesz.1M144.build.spiffs_pagesize=256
+sonoff.menu.eesz.1M144.build.rfcal_addr=0xFC000
+sonoff.menu.eesz.1M144.build.spiffs_start=0xD7000
+sonoff.menu.eesz.1M144.build.spiffs_end=0xFB000
+sonoff.menu.eesz.1M144.build.spiffs_blocksize=4096
+sonoff.menu.eesz.1M160=1MB (FS:160KB OTA:~422KB)
+sonoff.menu.eesz.1M160.build.flash_size=1M
+sonoff.menu.eesz.1M160.build.flash_ld=eagle.flash.1m160.ld
+sonoff.menu.eesz.1M160.build.spiffs_pagesize=256
+sonoff.menu.eesz.1M160.build.rfcal_addr=0xFC000
+sonoff.menu.eesz.1M160.build.spiffs_start=0xD3000
+sonoff.menu.eesz.1M160.build.spiffs_end=0xFB000
+sonoff.menu.eesz.1M160.build.spiffs_blocksize=4096
+sonoff.menu.eesz.1M192=1MB (FS:192KB OTA:~406KB)
+sonoff.menu.eesz.1M192.build.flash_size=1M
+sonoff.menu.eesz.1M192.build.flash_ld=eagle.flash.1m192.ld
+sonoff.menu.eesz.1M192.build.spiffs_pagesize=256
+sonoff.menu.eesz.1M192.build.rfcal_addr=0xFC000
+sonoff.menu.eesz.1M192.build.spiffs_start=0xCB000
+sonoff.menu.eesz.1M192.build.spiffs_end=0xFB000
+sonoff.menu.eesz.1M192.build.spiffs_blocksize=4096
+sonoff.menu.eesz.1M256=1MB (FS:256KB OTA:~374KB)
+sonoff.menu.eesz.1M256.build.flash_size=1M
+sonoff.menu.eesz.1M256.build.flash_ld=eagle.flash.1m256.ld
+sonoff.menu.eesz.1M256.build.spiffs_pagesize=256
+sonoff.menu.eesz.1M256.build.rfcal_addr=0xFC000
+sonoff.menu.eesz.1M256.build.spiffs_start=0xBB000
+sonoff.menu.eesz.1M256.build.spiffs_end=0xFB000
+sonoff.menu.eesz.1M256.build.spiffs_blocksize=4096
+sonoff.menu.eesz.1M512=1MB (FS:512KB OTA:~246KB)
+sonoff.menu.eesz.1M512.build.flash_size=1M
+sonoff.menu.eesz.1M512.build.flash_ld=eagle.flash.1m512.ld
+sonoff.menu.eesz.1M512.build.spiffs_pagesize=256
+sonoff.menu.eesz.1M512.build.rfcal_addr=0xFC000
+sonoff.menu.eesz.1M512.build.spiffs_start=0x7B000
+sonoff.menu.eesz.1M512.build.spiffs_end=0xFB000
+sonoff.menu.eesz.1M512.build.spiffs_blocksize=8192
+sonoff.menu.eesz.1M=1MB (FS:none OTA:~502KB)
+sonoff.menu.eesz.1M.build.flash_size=1M
+sonoff.menu.eesz.1M.build.flash_ld=eagle.flash.1m.ld
+sonoff.menu.eesz.1M.build.spiffs_pagesize=256
+sonoff.menu.eesz.1M.build.rfcal_addr=0xFC000
+sonoff.menu.ip.lm2f=v2 Lower Memory
+sonoff.menu.ip.lm2f.build.lwip_include=lwip2/include
+sonoff.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+sonoff.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+sonoff.menu.ip.hb2f=v2 Higher Bandwidth
+sonoff.menu.ip.hb2f.build.lwip_include=lwip2/include
+sonoff.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+sonoff.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+sonoff.menu.ip.lm2n=v2 Lower Memory (no features)
+sonoff.menu.ip.lm2n.build.lwip_include=lwip2/include
+sonoff.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+sonoff.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+sonoff.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+sonoff.menu.ip.hb2n.build.lwip_include=lwip2/include
+sonoff.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+sonoff.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+sonoff.menu.ip.lm6f=v2 IPv6 Lower Memory
+sonoff.menu.ip.lm6f.build.lwip_include=lwip2/include
+sonoff.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+sonoff.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+sonoff.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+sonoff.menu.ip.hb6f.build.lwip_include=lwip2/include
+sonoff.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+sonoff.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+sonoff.menu.dbg.Disabled=Disabled
+sonoff.menu.dbg.Disabled.build.debug_port=
+sonoff.menu.dbg.Serial=Serial
+sonoff.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+sonoff.menu.dbg.Serial1=Serial1
+sonoff.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+sonoff.menu.lvl.None____=None
+sonoff.menu.lvl.None____.build.debug_level=
+sonoff.menu.optim.Smallest=None
+sonoff.menu.optim.Smallest.build.debug_optim=-Os
+sonoff.menu.optim.Lite=Lite
+sonoff.menu.optim.Lite.build.debug_optim=-Os -fno-optimize-sibling-calls
+sonoff.menu.optim.Full=Optimum
+sonoff.menu.optim.Full.build.debug_optim=-Og
+sonoff.menu.lvl.SSL=SSL
+sonoff.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+sonoff.menu.lvl.TLS_MEM=TLS_MEM
+sonoff.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+sonoff.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+sonoff.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+sonoff.menu.lvl.HTTP_SERVER=HTTP_SERVER
+sonoff.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+sonoff.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+sonoff.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+sonoff.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+sonoff.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+sonoff.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+sonoff.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+sonoff.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+sonoff.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+sonoff.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+sonoff.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+sonoff.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+sonoff.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+sonoff.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+sonoff.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+sonoff.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+sonoff.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+sonoff.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+sonoff.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+sonoff.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+sonoff.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+sonoff.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+sonoff.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+sonoff.menu.lvl.CORE=CORE
+sonoff.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+sonoff.menu.lvl.WIFI=WIFI
+sonoff.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+sonoff.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+sonoff.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+sonoff.menu.lvl.UPDATER=UPDATER
+sonoff.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+sonoff.menu.lvl.OTA=OTA
+sonoff.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+sonoff.menu.lvl.OOM=OOM
+sonoff.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+sonoff.menu.lvl.MDNS=MDNS
+sonoff.menu.lvl.MDNS.build.debug_level= -DDEBUG_ESP_MDNS
+sonoff.menu.lvl.HWDT=HWDT
+sonoff.menu.lvl.HWDT.build.debug_level= -DDEBUG_ESP_HWDT
+sonoff.menu.lvl.HWDT_NOEXTRA4K=HWDT_NOEXTRA4K
+sonoff.menu.lvl.HWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_HWDT_NOEXTRA4K
+sonoff.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+sonoff.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+sonoff.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+sonoff.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+sonoff.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+sonoff.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+sonoff.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+sonoff.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+sonoff.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+sonoff.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+sonoff.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+sonoff.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+sonoff.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+sonoff.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+sonoff.menu.wipe.none=Only Sketch
+sonoff.menu.wipe.none.upload.erase_cmd=
+sonoff.menu.wipe.sdk=Sketch + WiFi Settings
+sonoff.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
+sonoff.menu.wipe.all=All Flash Contents
+sonoff.menu.wipe.all.upload.erase_cmd=erase_flash
+sonoff.menu.baud.115200=115200
+sonoff.menu.baud.115200.upload.speed=115200
+sonoff.menu.baud.57600=57600
+sonoff.menu.baud.57600.upload.speed=57600
+sonoff.menu.baud.230400.linux=230400
+sonoff.menu.baud.230400.macosx=230400
+sonoff.menu.baud.230400.upload.speed=230400
+sonoff.menu.baud.256000.windows=256000
+sonoff.menu.baud.256000.upload.speed=256000
+sonoff.menu.baud.460800.linux=460800
+sonoff.menu.baud.460800.macosx=460800
+sonoff.menu.baud.460800.upload.speed=460800
+sonoff.menu.baud.512000.windows=512000
+sonoff.menu.baud.512000.upload.speed=512000
+sonoff.menu.baud.921600=921600
+sonoff.menu.baud.921600.upload.speed=921600
+sonoff.menu.baud.3000000=3000000
+sonoff.menu.baud.3000000.upload.speed=3000000
+sonoff.menu.eesz.autoflash=Mapping defined by Hardware and Sketch
+sonoff.menu.eesz.autoflash.build.flash_size=16M
+sonoff.menu.eesz.autoflash.build.flash_ld=eagle.flash.auto.ld
+sonoff.menu.eesz.autoflash.build.extra_flags=-DFLASH_MAP_SUPPORT=1
+sonoff.menu.eesz.autoflash.upload.maximum_size=1044464
+sonoff.menu.iramfloat.no=in IROM
+sonoff.menu.iramfloat.no.build.iramfloat=-DFP_IN_IROM
+sonoff.menu.iramfloat.yes=allowed in ISR
+sonoff.menu.iramfloat.yes.build.iramfloat=-DFP_IN_IRAM
-espresso_lite_v2.menu.UploadSpeed.115200=115200
-espresso_lite_v2.menu.UploadSpeed.115200.upload.speed=115200
-espresso_lite_v2.menu.UploadSpeed.57600=57600
-espresso_lite_v2.menu.UploadSpeed.57600.upload.speed=57600
-espresso_lite_v2.menu.UploadSpeed.256000.windows=256000
-espresso_lite_v2.menu.UploadSpeed.256000.upload.speed=256000
-espresso_lite_v2.menu.UploadSpeed.230400.linux=230400
-espresso_lite_v2.menu.UploadSpeed.230400.macosx=230400
-espresso_lite_v2.menu.UploadSpeed.230400.macosx=230400
-espresso_lite_v2.menu.UploadSpeed.230400.upload.speed=230400
-espresso_lite_v2.menu.UploadSpeed.460800.linux=460800
-espresso_lite_v2.menu.UploadSpeed.460800.macosx=460800
-espresso_lite_v2.menu.UploadSpeed.460800.upload.speed=460800
-espresso_lite_v2.menu.UploadSpeed.512000.windows=512000
-espresso_lite_v2.menu.UploadSpeed.512000.upload.speed=512000
-espresso_lite_v2.menu.UploadSpeed.921600=921600
-espresso_lite_v2.menu.UploadSpeed.921600.upload.speed=921600
+##############################################################
+inventone.name=Invent One
+inventone.build.board=ESP8266_INVENT_ONE
+inventone.build.variant=inventone
+inventone.upload.tool=esptool
+inventone.upload.maximum_data_size=81920
+inventone.upload.wait_for_upload_port=true
+inventone.upload.erase_cmd=
+inventone.serial.disableDTR=true
+inventone.serial.disableRTS=true
+inventone.build.mcu=esp8266
+inventone.build.core=esp8266
+inventone.build.spiffs_pagesize=256
+inventone.build.debug_optim=
+inventone.build.debug_port=
+inventone.build.debug_level=
+inventone.menu.xtal.80=80 MHz
+inventone.menu.xtal.80.build.f_cpu=80000000L
+inventone.menu.xtal.160=160 MHz
+inventone.menu.xtal.160.build.f_cpu=160000000L
+inventone.menu.vt.flash=Flash
+inventone.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+inventone.menu.vt.heap=Heap
+inventone.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+inventone.menu.vt.iram=IRAM
+inventone.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+inventone.menu.exception.disabled=Disabled (new aborts on oom)
+inventone.menu.exception.disabled.build.exception_flags=-fno-exceptions
+inventone.menu.exception.disabled.build.stdcpp_lib=-lstdc++
+inventone.menu.exception.enabled=Enabled
+inventone.menu.exception.enabled.build.exception_flags=-fexceptions
+inventone.menu.exception.enabled.build.stdcpp_lib=-lstdc++-exc
+inventone.menu.stacksmash.disabled=Disabled
+inventone.menu.stacksmash.disabled.build.stacksmash_flags=
+inventone.menu.stacksmash.enabled=Enabled
+inventone.menu.stacksmash.enabled.build.stacksmash_flags=-fstack-protector
+inventone.menu.ssl.all=All SSL ciphers (most compatible)
+inventone.menu.ssl.all.build.sslflags=
+inventone.menu.ssl.basic=Basic SSL ciphers (lower ROM use)
+inventone.menu.ssl.basic.build.sslflags=-DBEARSSL_SSL_BASIC
+inventone.menu.mmu.3232=32KB cache + 32KB IRAM (balanced)
+inventone.menu.mmu.3232.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+inventone.menu.mmu.4816=16KB cache + 48KB IRAM (IRAM)
+inventone.menu.mmu.4816.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000
+inventone.menu.mmu.4816H=16KB cache + 48KB IRAM and 2nd Heap (shared)
+inventone.menu.mmu.4816H.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_IRAM_HEAP
+inventone.menu.mmu.3216=16KB cache + 32KB IRAM + 16KB 2nd Heap (not shared)
+inventone.menu.mmu.3216.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_SEC_HEAP=0x40108000 -DMMU_SEC_HEAP_SIZE=0x4000
+inventone.menu.mmu.ext128k=128K Heap External 23LC1024
+inventone.menu.mmu.ext128k.build.mmuflags=-DMMU_EXTERNAL_HEAP=128 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+inventone.menu.mmu.ext8192k=8M w/256K Heap External 64 MBit PSRAM
+inventone.menu.mmu.ext8192k.build.mmuflags=-DMMU_EXTERNAL_HEAP=256 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+inventone.menu.non32xfer.fast=Use pgm_read macros for IRAM/PROGMEM
+inventone.menu.non32xfer.fast.build.non32xferflags=
+inventone.menu.non32xfer.safe=Byte/Word access to IRAM/PROGMEM (very slow)
+inventone.menu.non32xfer.safe.build.non32xferflags=-DNON32XFER_HANDLER
+inventone.upload.resetmethod=--before default_reset --after hard_reset
+inventone.build.flash_mode=dio
+inventone.build.flash_flags=-DFLASHMODE_DIO
+inventone.build.flash_freq=40
+inventone.menu.eesz.4M2M=4MB (FS:2MB OTA:~1019KB)
+inventone.menu.eesz.4M2M.build.flash_size=4M
+inventone.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
+inventone.menu.eesz.4M2M.build.spiffs_pagesize=256
+inventone.menu.eesz.4M2M.build.rfcal_addr=0x3FC000
+inventone.menu.eesz.4M2M.build.spiffs_start=0x200000
+inventone.menu.eesz.4M2M.build.spiffs_end=0x3FA000
+inventone.menu.eesz.4M2M.build.spiffs_blocksize=8192
+inventone.menu.eesz.4M3M=4MB (FS:3MB OTA:~512KB)
+inventone.menu.eesz.4M3M.build.flash_size=4M
+inventone.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
+inventone.menu.eesz.4M3M.build.spiffs_pagesize=256
+inventone.menu.eesz.4M3M.build.rfcal_addr=0x3FC000
+inventone.menu.eesz.4M3M.build.spiffs_start=0x100000
+inventone.menu.eesz.4M3M.build.spiffs_end=0x3FA000
+inventone.menu.eesz.4M3M.build.spiffs_blocksize=8192
+inventone.menu.eesz.4M1M=4MB (FS:1MB OTA:~1019KB)
+inventone.menu.eesz.4M1M.build.flash_size=4M
+inventone.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
+inventone.menu.eesz.4M1M.build.spiffs_pagesize=256
+inventone.menu.eesz.4M1M.build.rfcal_addr=0x3FC000
+inventone.menu.eesz.4M1M.build.spiffs_start=0x300000
+inventone.menu.eesz.4M1M.build.spiffs_end=0x3FA000
+inventone.menu.eesz.4M1M.build.spiffs_blocksize=8192
+inventone.menu.eesz.4M=4MB (FS:none OTA:~1019KB)
+inventone.menu.eesz.4M.build.flash_size=4M
+inventone.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
+inventone.menu.eesz.4M.build.spiffs_pagesize=256
+inventone.menu.eesz.4M.build.rfcal_addr=0x3FC000
+inventone.menu.ip.lm2f=v2 Lower Memory
+inventone.menu.ip.lm2f.build.lwip_include=lwip2/include
+inventone.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+inventone.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+inventone.menu.ip.hb2f=v2 Higher Bandwidth
+inventone.menu.ip.hb2f.build.lwip_include=lwip2/include
+inventone.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+inventone.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+inventone.menu.ip.lm2n=v2 Lower Memory (no features)
+inventone.menu.ip.lm2n.build.lwip_include=lwip2/include
+inventone.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+inventone.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+inventone.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+inventone.menu.ip.hb2n.build.lwip_include=lwip2/include
+inventone.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+inventone.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+inventone.menu.ip.lm6f=v2 IPv6 Lower Memory
+inventone.menu.ip.lm6f.build.lwip_include=lwip2/include
+inventone.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+inventone.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+inventone.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+inventone.menu.ip.hb6f.build.lwip_include=lwip2/include
+inventone.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+inventone.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+inventone.menu.dbg.Disabled=Disabled
+inventone.menu.dbg.Disabled.build.debug_port=
+inventone.menu.dbg.Serial=Serial
+inventone.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+inventone.menu.dbg.Serial1=Serial1
+inventone.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+inventone.menu.lvl.None____=None
+inventone.menu.lvl.None____.build.debug_level=
+inventone.menu.optim.Smallest=None
+inventone.menu.optim.Smallest.build.debug_optim=-Os
+inventone.menu.optim.Lite=Lite
+inventone.menu.optim.Lite.build.debug_optim=-Os -fno-optimize-sibling-calls
+inventone.menu.optim.Full=Optimum
+inventone.menu.optim.Full.build.debug_optim=-Og
+inventone.menu.lvl.SSL=SSL
+inventone.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+inventone.menu.lvl.TLS_MEM=TLS_MEM
+inventone.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+inventone.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+inventone.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+inventone.menu.lvl.HTTP_SERVER=HTTP_SERVER
+inventone.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+inventone.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+inventone.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+inventone.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+inventone.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+inventone.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+inventone.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+inventone.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+inventone.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+inventone.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+inventone.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+inventone.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+inventone.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+inventone.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+inventone.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+inventone.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+inventone.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+inventone.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+inventone.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+inventone.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+inventone.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+inventone.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+inventone.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+inventone.menu.lvl.CORE=CORE
+inventone.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+inventone.menu.lvl.WIFI=WIFI
+inventone.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+inventone.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+inventone.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+inventone.menu.lvl.UPDATER=UPDATER
+inventone.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+inventone.menu.lvl.OTA=OTA
+inventone.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+inventone.menu.lvl.OOM=OOM
+inventone.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+inventone.menu.lvl.MDNS=MDNS
+inventone.menu.lvl.MDNS.build.debug_level= -DDEBUG_ESP_MDNS
+inventone.menu.lvl.HWDT=HWDT
+inventone.menu.lvl.HWDT.build.debug_level= -DDEBUG_ESP_HWDT
+inventone.menu.lvl.HWDT_NOEXTRA4K=HWDT_NOEXTRA4K
+inventone.menu.lvl.HWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_HWDT_NOEXTRA4K
+inventone.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+inventone.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+inventone.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+inventone.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+inventone.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+inventone.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+inventone.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+inventone.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+inventone.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+inventone.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+inventone.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+inventone.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+inventone.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+inventone.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+inventone.menu.wipe.none=Only Sketch
+inventone.menu.wipe.none.upload.erase_cmd=
+inventone.menu.wipe.sdk=Sketch + WiFi Settings
+inventone.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
+inventone.menu.wipe.all=All Flash Contents
+inventone.menu.wipe.all.upload.erase_cmd=erase_flash
+inventone.menu.baud.115200=115200
+inventone.menu.baud.115200.upload.speed=115200
+inventone.menu.baud.57600=57600
+inventone.menu.baud.57600.upload.speed=57600
+inventone.menu.baud.230400.linux=230400
+inventone.menu.baud.230400.macosx=230400
+inventone.menu.baud.230400.upload.speed=230400
+inventone.menu.baud.256000.windows=256000
+inventone.menu.baud.256000.upload.speed=256000
+inventone.menu.baud.460800.linux=460800
+inventone.menu.baud.460800.macosx=460800
+inventone.menu.baud.460800.upload.speed=460800
+inventone.menu.baud.512000.windows=512000
+inventone.menu.baud.512000.upload.speed=512000
+inventone.menu.baud.921600=921600
+inventone.menu.baud.921600.upload.speed=921600
+inventone.menu.baud.3000000=3000000
+inventone.menu.baud.3000000.upload.speed=3000000
+inventone.menu.eesz.autoflash=Mapping defined by Hardware and Sketch
+inventone.menu.eesz.autoflash.build.flash_size=16M
+inventone.menu.eesz.autoflash.build.flash_ld=eagle.flash.auto.ld
+inventone.menu.eesz.autoflash.build.extra_flags=-DFLASH_MAP_SUPPORT=1
+inventone.menu.eesz.autoflash.upload.maximum_size=1044464
+inventone.menu.iramfloat.no=in IROM
+inventone.menu.iramfloat.no.build.iramfloat=-DFP_IN_IROM
+inventone.menu.iramfloat.yes=allowed in ISR
+inventone.menu.iramfloat.yes.build.iramfloat=-DFP_IN_IRAM
-espresso_lite_v2.menu.FlashSize.4M3M=4M (3M SPIFFS)
-espresso_lite_v2.menu.FlashSize.4M3M.build.flash_size=4M
-espresso_lite_v2.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-espresso_lite_v2.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-espresso_lite_v2.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-espresso_lite_v2.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-espresso_lite_v2.menu.FlashSize.4M3M.upload.maximum_size=1044464
+##############################################################
+d1_wroom_02.name=LOLIN(WEMOS) D1 ESP-WROOM-02
+d1_wroom_02.build.board=ESP8266_WEMOS_D1WROOM02
+d1_wroom_02.build.variant=d1_mini
+d1_wroom_02.upload.tool=esptool
+d1_wroom_02.upload.maximum_data_size=81920
+d1_wroom_02.upload.wait_for_upload_port=true
+d1_wroom_02.upload.erase_cmd=
+d1_wroom_02.serial.disableDTR=true
+d1_wroom_02.serial.disableRTS=true
+d1_wroom_02.build.mcu=esp8266
+d1_wroom_02.build.core=esp8266
+d1_wroom_02.build.spiffs_pagesize=256
+d1_wroom_02.build.debug_optim=
+d1_wroom_02.build.debug_port=
+d1_wroom_02.build.debug_level=
+d1_wroom_02.menu.xtal.80=80 MHz
+d1_wroom_02.menu.xtal.80.build.f_cpu=80000000L
+d1_wroom_02.menu.xtal.160=160 MHz
+d1_wroom_02.menu.xtal.160.build.f_cpu=160000000L
+d1_wroom_02.menu.vt.flash=Flash
+d1_wroom_02.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+d1_wroom_02.menu.vt.heap=Heap
+d1_wroom_02.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+d1_wroom_02.menu.vt.iram=IRAM
+d1_wroom_02.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+d1_wroom_02.menu.exception.disabled=Disabled (new aborts on oom)
+d1_wroom_02.menu.exception.disabled.build.exception_flags=-fno-exceptions
+d1_wroom_02.menu.exception.disabled.build.stdcpp_lib=-lstdc++
+d1_wroom_02.menu.exception.enabled=Enabled
+d1_wroom_02.menu.exception.enabled.build.exception_flags=-fexceptions
+d1_wroom_02.menu.exception.enabled.build.stdcpp_lib=-lstdc++-exc
+d1_wroom_02.menu.stacksmash.disabled=Disabled
+d1_wroom_02.menu.stacksmash.disabled.build.stacksmash_flags=
+d1_wroom_02.menu.stacksmash.enabled=Enabled
+d1_wroom_02.menu.stacksmash.enabled.build.stacksmash_flags=-fstack-protector
+d1_wroom_02.menu.ssl.all=All SSL ciphers (most compatible)
+d1_wroom_02.menu.ssl.all.build.sslflags=
+d1_wroom_02.menu.ssl.basic=Basic SSL ciphers (lower ROM use)
+d1_wroom_02.menu.ssl.basic.build.sslflags=-DBEARSSL_SSL_BASIC
+d1_wroom_02.menu.mmu.3232=32KB cache + 32KB IRAM (balanced)
+d1_wroom_02.menu.mmu.3232.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+d1_wroom_02.menu.mmu.4816=16KB cache + 48KB IRAM (IRAM)
+d1_wroom_02.menu.mmu.4816.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000
+d1_wroom_02.menu.mmu.4816H=16KB cache + 48KB IRAM and 2nd Heap (shared)
+d1_wroom_02.menu.mmu.4816H.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_IRAM_HEAP
+d1_wroom_02.menu.mmu.3216=16KB cache + 32KB IRAM + 16KB 2nd Heap (not shared)
+d1_wroom_02.menu.mmu.3216.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_SEC_HEAP=0x40108000 -DMMU_SEC_HEAP_SIZE=0x4000
+d1_wroom_02.menu.mmu.ext128k=128K Heap External 23LC1024
+d1_wroom_02.menu.mmu.ext128k.build.mmuflags=-DMMU_EXTERNAL_HEAP=128 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+d1_wroom_02.menu.mmu.ext8192k=8M w/256K Heap External 64 MBit PSRAM
+d1_wroom_02.menu.mmu.ext8192k.build.mmuflags=-DMMU_EXTERNAL_HEAP=256 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+d1_wroom_02.menu.non32xfer.fast=Use pgm_read macros for IRAM/PROGMEM
+d1_wroom_02.menu.non32xfer.fast.build.non32xferflags=
+d1_wroom_02.menu.non32xfer.safe=Byte/Word access to IRAM/PROGMEM (very slow)
+d1_wroom_02.menu.non32xfer.safe.build.non32xferflags=-DNON32XFER_HANDLER
+d1_wroom_02.upload.resetmethod=--before default_reset --after hard_reset
+d1_wroom_02.build.flash_mode=dio
+d1_wroom_02.build.flash_flags=-DFLASHMODE_DIO
+d1_wroom_02.build.flash_freq=26
+d1_wroom_02.menu.eesz.2M64=2MB (FS:64KB OTA:~992KB)
+d1_wroom_02.menu.eesz.2M64.build.flash_size=2M
+d1_wroom_02.menu.eesz.2M64.build.flash_ld=eagle.flash.2m64.ld
+d1_wroom_02.menu.eesz.2M64.build.spiffs_pagesize=256
+d1_wroom_02.menu.eesz.2M64.build.rfcal_addr=0x1FC000
+d1_wroom_02.menu.eesz.2M64.build.spiffs_start=0x1F0000
+d1_wroom_02.menu.eesz.2M64.build.spiffs_end=0x1FB000
+d1_wroom_02.menu.eesz.2M64.build.spiffs_blocksize=4096
+d1_wroom_02.menu.eesz.2M128=2MB (FS:128KB OTA:~960KB)
+d1_wroom_02.menu.eesz.2M128.build.flash_size=2M
+d1_wroom_02.menu.eesz.2M128.build.flash_ld=eagle.flash.2m128.ld
+d1_wroom_02.menu.eesz.2M128.build.spiffs_pagesize=256
+d1_wroom_02.menu.eesz.2M128.build.rfcal_addr=0x1FC000
+d1_wroom_02.menu.eesz.2M128.build.spiffs_start=0x1E0000
+d1_wroom_02.menu.eesz.2M128.build.spiffs_end=0x1FB000
+d1_wroom_02.menu.eesz.2M128.build.spiffs_blocksize=4096
+d1_wroom_02.menu.eesz.2M256=2MB (FS:256KB OTA:~896KB)
+d1_wroom_02.menu.eesz.2M256.build.flash_size=2M
+d1_wroom_02.menu.eesz.2M256.build.flash_ld=eagle.flash.2m256.ld
+d1_wroom_02.menu.eesz.2M256.build.spiffs_pagesize=256
+d1_wroom_02.menu.eesz.2M256.build.rfcal_addr=0x1FC000
+d1_wroom_02.menu.eesz.2M256.build.spiffs_start=0x1C0000
+d1_wroom_02.menu.eesz.2M256.build.spiffs_end=0x1FB000
+d1_wroom_02.menu.eesz.2M256.build.spiffs_blocksize=4096
+d1_wroom_02.menu.eesz.2M512=2MB (FS:512KB OTA:~768KB)
+d1_wroom_02.menu.eesz.2M512.build.flash_size=2M
+d1_wroom_02.menu.eesz.2M512.build.flash_ld=eagle.flash.2m512.ld
+d1_wroom_02.menu.eesz.2M512.build.spiffs_pagesize=256
+d1_wroom_02.menu.eesz.2M512.build.rfcal_addr=0x1FC000
+d1_wroom_02.menu.eesz.2M512.build.spiffs_start=0x180000
+d1_wroom_02.menu.eesz.2M512.build.spiffs_end=0x1FA000
+d1_wroom_02.menu.eesz.2M512.build.spiffs_blocksize=8192
+d1_wroom_02.menu.eesz.2M1M=2MB (FS:1MB OTA:~512KB)
+d1_wroom_02.menu.eesz.2M1M.build.flash_size=2M
+d1_wroom_02.menu.eesz.2M1M.build.flash_ld=eagle.flash.2m1m.ld
+d1_wroom_02.menu.eesz.2M1M.build.spiffs_pagesize=256
+d1_wroom_02.menu.eesz.2M1M.build.rfcal_addr=0x1FC000
+d1_wroom_02.menu.eesz.2M1M.build.spiffs_start=0x100000
+d1_wroom_02.menu.eesz.2M1M.build.spiffs_end=0x1FA000
+d1_wroom_02.menu.eesz.2M1M.build.spiffs_blocksize=8192
+d1_wroom_02.menu.eesz.2M=2MB (FS:none OTA:~1019KB)
+d1_wroom_02.menu.eesz.2M.build.flash_size=2M
+d1_wroom_02.menu.eesz.2M.build.flash_ld=eagle.flash.2m.ld
+d1_wroom_02.menu.eesz.2M.build.spiffs_pagesize=256
+d1_wroom_02.menu.eesz.2M.build.rfcal_addr=0x1FC000
+d1_wroom_02.menu.ip.lm2f=v2 Lower Memory
+d1_wroom_02.menu.ip.lm2f.build.lwip_include=lwip2/include
+d1_wroom_02.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+d1_wroom_02.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+d1_wroom_02.menu.ip.hb2f=v2 Higher Bandwidth
+d1_wroom_02.menu.ip.hb2f.build.lwip_include=lwip2/include
+d1_wroom_02.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+d1_wroom_02.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+d1_wroom_02.menu.ip.lm2n=v2 Lower Memory (no features)
+d1_wroom_02.menu.ip.lm2n.build.lwip_include=lwip2/include
+d1_wroom_02.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+d1_wroom_02.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+d1_wroom_02.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+d1_wroom_02.menu.ip.hb2n.build.lwip_include=lwip2/include
+d1_wroom_02.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+d1_wroom_02.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+d1_wroom_02.menu.ip.lm6f=v2 IPv6 Lower Memory
+d1_wroom_02.menu.ip.lm6f.build.lwip_include=lwip2/include
+d1_wroom_02.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+d1_wroom_02.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+d1_wroom_02.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+d1_wroom_02.menu.ip.hb6f.build.lwip_include=lwip2/include
+d1_wroom_02.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+d1_wroom_02.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+d1_wroom_02.menu.dbg.Disabled=Disabled
+d1_wroom_02.menu.dbg.Disabled.build.debug_port=
+d1_wroom_02.menu.dbg.Serial=Serial
+d1_wroom_02.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+d1_wroom_02.menu.dbg.Serial1=Serial1
+d1_wroom_02.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+d1_wroom_02.menu.lvl.None____=None
+d1_wroom_02.menu.lvl.None____.build.debug_level=
+d1_wroom_02.menu.optim.Smallest=None
+d1_wroom_02.menu.optim.Smallest.build.debug_optim=-Os
+d1_wroom_02.menu.optim.Lite=Lite
+d1_wroom_02.menu.optim.Lite.build.debug_optim=-Os -fno-optimize-sibling-calls
+d1_wroom_02.menu.optim.Full=Optimum
+d1_wroom_02.menu.optim.Full.build.debug_optim=-Og
+d1_wroom_02.menu.lvl.SSL=SSL
+d1_wroom_02.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+d1_wroom_02.menu.lvl.TLS_MEM=TLS_MEM
+d1_wroom_02.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+d1_wroom_02.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+d1_wroom_02.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+d1_wroom_02.menu.lvl.HTTP_SERVER=HTTP_SERVER
+d1_wroom_02.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+d1_wroom_02.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+d1_wroom_02.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+d1_wroom_02.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+d1_wroom_02.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+d1_wroom_02.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+d1_wroom_02.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+d1_wroom_02.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+d1_wroom_02.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+d1_wroom_02.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+d1_wroom_02.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+d1_wroom_02.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+d1_wroom_02.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+d1_wroom_02.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+d1_wroom_02.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+d1_wroom_02.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+d1_wroom_02.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+d1_wroom_02.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+d1_wroom_02.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+d1_wroom_02.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+d1_wroom_02.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+d1_wroom_02.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+d1_wroom_02.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+d1_wroom_02.menu.lvl.CORE=CORE
+d1_wroom_02.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+d1_wroom_02.menu.lvl.WIFI=WIFI
+d1_wroom_02.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+d1_wroom_02.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+d1_wroom_02.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+d1_wroom_02.menu.lvl.UPDATER=UPDATER
+d1_wroom_02.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+d1_wroom_02.menu.lvl.OTA=OTA
+d1_wroom_02.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+d1_wroom_02.menu.lvl.OOM=OOM
+d1_wroom_02.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+d1_wroom_02.menu.lvl.MDNS=MDNS
+d1_wroom_02.menu.lvl.MDNS.build.debug_level= -DDEBUG_ESP_MDNS
+d1_wroom_02.menu.lvl.HWDT=HWDT
+d1_wroom_02.menu.lvl.HWDT.build.debug_level= -DDEBUG_ESP_HWDT
+d1_wroom_02.menu.lvl.HWDT_NOEXTRA4K=HWDT_NOEXTRA4K
+d1_wroom_02.menu.lvl.HWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_HWDT_NOEXTRA4K
+d1_wroom_02.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+d1_wroom_02.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+d1_wroom_02.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+d1_wroom_02.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+d1_wroom_02.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+d1_wroom_02.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+d1_wroom_02.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+d1_wroom_02.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+d1_wroom_02.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+d1_wroom_02.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+d1_wroom_02.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+d1_wroom_02.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+d1_wroom_02.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+d1_wroom_02.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+d1_wroom_02.menu.wipe.none=Only Sketch
+d1_wroom_02.menu.wipe.none.upload.erase_cmd=
+d1_wroom_02.menu.wipe.sdk=Sketch + WiFi Settings
+d1_wroom_02.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
+d1_wroom_02.menu.wipe.all=All Flash Contents
+d1_wroom_02.menu.wipe.all.upload.erase_cmd=erase_flash
+d1_wroom_02.menu.baud.921600=921600
+d1_wroom_02.menu.baud.921600.upload.speed=921600
+d1_wroom_02.menu.baud.57600=57600
+d1_wroom_02.menu.baud.57600.upload.speed=57600
+d1_wroom_02.menu.baud.115200=115200
+d1_wroom_02.menu.baud.115200.upload.speed=115200
+d1_wroom_02.menu.baud.230400.linux=230400
+d1_wroom_02.menu.baud.230400.macosx=230400
+d1_wroom_02.menu.baud.230400.upload.speed=230400
+d1_wroom_02.menu.baud.256000.windows=256000
+d1_wroom_02.menu.baud.256000.upload.speed=256000
+d1_wroom_02.menu.baud.460800.linux=460800
+d1_wroom_02.menu.baud.460800.macosx=460800
+d1_wroom_02.menu.baud.460800.upload.speed=460800
+d1_wroom_02.menu.baud.512000.windows=512000
+d1_wroom_02.menu.baud.512000.upload.speed=512000
+d1_wroom_02.menu.baud.3000000=3000000
+d1_wroom_02.menu.baud.3000000.upload.speed=3000000
+d1_wroom_02.menu.eesz.autoflash=Mapping defined by Hardware and Sketch
+d1_wroom_02.menu.eesz.autoflash.build.flash_size=16M
+d1_wroom_02.menu.eesz.autoflash.build.flash_ld=eagle.flash.auto.ld
+d1_wroom_02.menu.eesz.autoflash.build.extra_flags=-DFLASH_MAP_SUPPORT=1
+d1_wroom_02.menu.eesz.autoflash.upload.maximum_size=1044464
+d1_wroom_02.menu.iramfloat.no=in IROM
+d1_wroom_02.menu.iramfloat.no.build.iramfloat=-DFP_IN_IROM
+d1_wroom_02.menu.iramfloat.yes=allowed in ISR
+d1_wroom_02.menu.iramfloat.yes.build.iramfloat=-DFP_IN_IRAM
-espresso_lite_v2.menu.FlashSize.4M1M=4M (1M SPIFFS)
-espresso_lite_v2.menu.FlashSize.4M1M.build.flash_size=4M
-espresso_lite_v2.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-espresso_lite_v2.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-espresso_lite_v2.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-espresso_lite_v2.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-espresso_lite_v2.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-espresso_lite_v2.menu.FlashSize.4M1M.upload.maximum_size=1044464
+##############################################################
+d1_mini.name=LOLIN(WEMOS) D1 R2 & mini
+d1_mini.build.board=ESP8266_WEMOS_D1MINI
+d1_mini.build.variant=d1_mini
+d1_mini.upload.tool=esptool
+d1_mini.upload.maximum_data_size=81920
+d1_mini.upload.wait_for_upload_port=true
+d1_mini.upload.erase_cmd=
+d1_mini.serial.disableDTR=true
+d1_mini.serial.disableRTS=true
+d1_mini.build.mcu=esp8266
+d1_mini.build.core=esp8266
+d1_mini.build.spiffs_pagesize=256
+d1_mini.build.debug_optim=
+d1_mini.build.debug_port=
+d1_mini.build.debug_level=
+d1_mini.menu.xtal.80=80 MHz
+d1_mini.menu.xtal.80.build.f_cpu=80000000L
+d1_mini.menu.xtal.160=160 MHz
+d1_mini.menu.xtal.160.build.f_cpu=160000000L
+d1_mini.menu.vt.flash=Flash
+d1_mini.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+d1_mini.menu.vt.heap=Heap
+d1_mini.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+d1_mini.menu.vt.iram=IRAM
+d1_mini.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+d1_mini.menu.exception.disabled=Disabled (new aborts on oom)
+d1_mini.menu.exception.disabled.build.exception_flags=-fno-exceptions
+d1_mini.menu.exception.disabled.build.stdcpp_lib=-lstdc++
+d1_mini.menu.exception.enabled=Enabled
+d1_mini.menu.exception.enabled.build.exception_flags=-fexceptions
+d1_mini.menu.exception.enabled.build.stdcpp_lib=-lstdc++-exc
+d1_mini.menu.stacksmash.disabled=Disabled
+d1_mini.menu.stacksmash.disabled.build.stacksmash_flags=
+d1_mini.menu.stacksmash.enabled=Enabled
+d1_mini.menu.stacksmash.enabled.build.stacksmash_flags=-fstack-protector
+d1_mini.menu.ssl.all=All SSL ciphers (most compatible)
+d1_mini.menu.ssl.all.build.sslflags=
+d1_mini.menu.ssl.basic=Basic SSL ciphers (lower ROM use)
+d1_mini.menu.ssl.basic.build.sslflags=-DBEARSSL_SSL_BASIC
+d1_mini.menu.mmu.3232=32KB cache + 32KB IRAM (balanced)
+d1_mini.menu.mmu.3232.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+d1_mini.menu.mmu.4816=16KB cache + 48KB IRAM (IRAM)
+d1_mini.menu.mmu.4816.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000
+d1_mini.menu.mmu.4816H=16KB cache + 48KB IRAM and 2nd Heap (shared)
+d1_mini.menu.mmu.4816H.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_IRAM_HEAP
+d1_mini.menu.mmu.3216=16KB cache + 32KB IRAM + 16KB 2nd Heap (not shared)
+d1_mini.menu.mmu.3216.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_SEC_HEAP=0x40108000 -DMMU_SEC_HEAP_SIZE=0x4000
+d1_mini.menu.mmu.ext128k=128K Heap External 23LC1024
+d1_mini.menu.mmu.ext128k.build.mmuflags=-DMMU_EXTERNAL_HEAP=128 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+d1_mini.menu.mmu.ext8192k=8M w/256K Heap External 64 MBit PSRAM
+d1_mini.menu.mmu.ext8192k.build.mmuflags=-DMMU_EXTERNAL_HEAP=256 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+d1_mini.menu.non32xfer.fast=Use pgm_read macros for IRAM/PROGMEM
+d1_mini.menu.non32xfer.fast.build.non32xferflags=
+d1_mini.menu.non32xfer.safe=Byte/Word access to IRAM/PROGMEM (very slow)
+d1_mini.menu.non32xfer.safe.build.non32xferflags=-DNON32XFER_HANDLER
+d1_mini.upload.resetmethod=--before default_reset --after hard_reset
+d1_mini.build.flash_mode=dio
+d1_mini.build.flash_flags=-DFLASHMODE_DIO
+d1_mini.build.flash_freq=40
+d1_mini.menu.eesz.4M2M=4MB (FS:2MB OTA:~1019KB)
+d1_mini.menu.eesz.4M2M.build.flash_size=4M
+d1_mini.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
+d1_mini.menu.eesz.4M2M.build.spiffs_pagesize=256
+d1_mini.menu.eesz.4M2M.build.rfcal_addr=0x3FC000
+d1_mini.menu.eesz.4M2M.build.spiffs_start=0x200000
+d1_mini.menu.eesz.4M2M.build.spiffs_end=0x3FA000
+d1_mini.menu.eesz.4M2M.build.spiffs_blocksize=8192
+d1_mini.menu.eesz.4M3M=4MB (FS:3MB OTA:~512KB)
+d1_mini.menu.eesz.4M3M.build.flash_size=4M
+d1_mini.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
+d1_mini.menu.eesz.4M3M.build.spiffs_pagesize=256
+d1_mini.menu.eesz.4M3M.build.rfcal_addr=0x3FC000
+d1_mini.menu.eesz.4M3M.build.spiffs_start=0x100000
+d1_mini.menu.eesz.4M3M.build.spiffs_end=0x3FA000
+d1_mini.menu.eesz.4M3M.build.spiffs_blocksize=8192
+d1_mini.menu.eesz.4M1M=4MB (FS:1MB OTA:~1019KB)
+d1_mini.menu.eesz.4M1M.build.flash_size=4M
+d1_mini.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
+d1_mini.menu.eesz.4M1M.build.spiffs_pagesize=256
+d1_mini.menu.eesz.4M1M.build.rfcal_addr=0x3FC000
+d1_mini.menu.eesz.4M1M.build.spiffs_start=0x300000
+d1_mini.menu.eesz.4M1M.build.spiffs_end=0x3FA000
+d1_mini.menu.eesz.4M1M.build.spiffs_blocksize=8192
+d1_mini.menu.eesz.4M=4MB (FS:none OTA:~1019KB)
+d1_mini.menu.eesz.4M.build.flash_size=4M
+d1_mini.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
+d1_mini.menu.eesz.4M.build.spiffs_pagesize=256
+d1_mini.menu.eesz.4M.build.rfcal_addr=0x3FC000
+d1_mini.menu.ip.lm2f=v2 Lower Memory
+d1_mini.menu.ip.lm2f.build.lwip_include=lwip2/include
+d1_mini.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+d1_mini.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+d1_mini.menu.ip.hb2f=v2 Higher Bandwidth
+d1_mini.menu.ip.hb2f.build.lwip_include=lwip2/include
+d1_mini.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+d1_mini.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+d1_mini.menu.ip.lm2n=v2 Lower Memory (no features)
+d1_mini.menu.ip.lm2n.build.lwip_include=lwip2/include
+d1_mini.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+d1_mini.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+d1_mini.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+d1_mini.menu.ip.hb2n.build.lwip_include=lwip2/include
+d1_mini.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+d1_mini.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+d1_mini.menu.ip.lm6f=v2 IPv6 Lower Memory
+d1_mini.menu.ip.lm6f.build.lwip_include=lwip2/include
+d1_mini.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+d1_mini.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+d1_mini.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+d1_mini.menu.ip.hb6f.build.lwip_include=lwip2/include
+d1_mini.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+d1_mini.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+d1_mini.menu.dbg.Disabled=Disabled
+d1_mini.menu.dbg.Disabled.build.debug_port=
+d1_mini.menu.dbg.Serial=Serial
+d1_mini.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+d1_mini.menu.dbg.Serial1=Serial1
+d1_mini.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+d1_mini.menu.lvl.None____=None
+d1_mini.menu.lvl.None____.build.debug_level=
+d1_mini.menu.optim.Smallest=None
+d1_mini.menu.optim.Smallest.build.debug_optim=-Os
+d1_mini.menu.optim.Lite=Lite
+d1_mini.menu.optim.Lite.build.debug_optim=-Os -fno-optimize-sibling-calls
+d1_mini.menu.optim.Full=Optimum
+d1_mini.menu.optim.Full.build.debug_optim=-Og
+d1_mini.menu.lvl.SSL=SSL
+d1_mini.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+d1_mini.menu.lvl.TLS_MEM=TLS_MEM
+d1_mini.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+d1_mini.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+d1_mini.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+d1_mini.menu.lvl.HTTP_SERVER=HTTP_SERVER
+d1_mini.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+d1_mini.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+d1_mini.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+d1_mini.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+d1_mini.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+d1_mini.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+d1_mini.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+d1_mini.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+d1_mini.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+d1_mini.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+d1_mini.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+d1_mini.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+d1_mini.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+d1_mini.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+d1_mini.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+d1_mini.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+d1_mini.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+d1_mini.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+d1_mini.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+d1_mini.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+d1_mini.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+d1_mini.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+d1_mini.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+d1_mini.menu.lvl.CORE=CORE
+d1_mini.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+d1_mini.menu.lvl.WIFI=WIFI
+d1_mini.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+d1_mini.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+d1_mini.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+d1_mini.menu.lvl.UPDATER=UPDATER
+d1_mini.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+d1_mini.menu.lvl.OTA=OTA
+d1_mini.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+d1_mini.menu.lvl.OOM=OOM
+d1_mini.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+d1_mini.menu.lvl.MDNS=MDNS
+d1_mini.menu.lvl.MDNS.build.debug_level= -DDEBUG_ESP_MDNS
+d1_mini.menu.lvl.HWDT=HWDT
+d1_mini.menu.lvl.HWDT.build.debug_level= -DDEBUG_ESP_HWDT
+d1_mini.menu.lvl.HWDT_NOEXTRA4K=HWDT_NOEXTRA4K
+d1_mini.menu.lvl.HWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_HWDT_NOEXTRA4K
+d1_mini.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+d1_mini.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+d1_mini.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+d1_mini.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+d1_mini.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+d1_mini.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+d1_mini.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+d1_mini.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+d1_mini.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+d1_mini.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+d1_mini.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+d1_mini.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+d1_mini.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+d1_mini.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+d1_mini.menu.wipe.none=Only Sketch
+d1_mini.menu.wipe.none.upload.erase_cmd=
+d1_mini.menu.wipe.sdk=Sketch + WiFi Settings
+d1_mini.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
+d1_mini.menu.wipe.all=All Flash Contents
+d1_mini.menu.wipe.all.upload.erase_cmd=erase_flash
+d1_mini.menu.baud.921600=921600
+d1_mini.menu.baud.921600.upload.speed=921600
+d1_mini.menu.baud.57600=57600
+d1_mini.menu.baud.57600.upload.speed=57600
+d1_mini.menu.baud.115200=115200
+d1_mini.menu.baud.115200.upload.speed=115200
+d1_mini.menu.baud.230400.linux=230400
+d1_mini.menu.baud.230400.macosx=230400
+d1_mini.menu.baud.230400.upload.speed=230400
+d1_mini.menu.baud.256000.windows=256000
+d1_mini.menu.baud.256000.upload.speed=256000
+d1_mini.menu.baud.460800.linux=460800
+d1_mini.menu.baud.460800.macosx=460800
+d1_mini.menu.baud.460800.upload.speed=460800
+d1_mini.menu.baud.512000.windows=512000
+d1_mini.menu.baud.512000.upload.speed=512000
+d1_mini.menu.baud.3000000=3000000
+d1_mini.menu.baud.3000000.upload.speed=3000000
+d1_mini.menu.eesz.autoflash=Mapping defined by Hardware and Sketch
+d1_mini.menu.eesz.autoflash.build.flash_size=16M
+d1_mini.menu.eesz.autoflash.build.flash_ld=eagle.flash.auto.ld
+d1_mini.menu.eesz.autoflash.build.extra_flags=-DFLASH_MAP_SUPPORT=1
+d1_mini.menu.eesz.autoflash.upload.maximum_size=1044464
+d1_mini.menu.iramfloat.no=in IROM
+d1_mini.menu.iramfloat.no.build.iramfloat=-DFP_IN_IROM
+d1_mini.menu.iramfloat.yes=allowed in ISR
+d1_mini.menu.iramfloat.yes.build.iramfloat=-DFP_IN_IRAM
-espresso_lite_v2.menu.ResetMethod.ck=ck
-espresso_lite_v2.menu.ResetMethod.ck.upload.resetmethod=ck
-espresso_lite_v2.menu.ResetMethod.nodemcu=nodemcu
-espresso_lite_v2.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu
+##############################################################
+d1_mini_clone.name=LOLIN(WEMOS) D1 mini (clone)
+d1_mini_clone.build.board=ESP8266_WEMOS_D1MINI
+d1_mini_clone.build.variant=d1_mini
+d1_mini_clone.upload.tool=esptool
+d1_mini_clone.upload.maximum_data_size=81920
+d1_mini_clone.upload.wait_for_upload_port=true
+d1_mini_clone.upload.erase_cmd=
+d1_mini_clone.serial.disableDTR=true
+d1_mini_clone.serial.disableRTS=true
+d1_mini_clone.build.mcu=esp8266
+d1_mini_clone.build.core=esp8266
+d1_mini_clone.build.spiffs_pagesize=256
+d1_mini_clone.build.debug_optim=
+d1_mini_clone.build.debug_port=
+d1_mini_clone.build.debug_level=
+d1_mini_clone.menu.xtal.80=80 MHz
+d1_mini_clone.menu.xtal.80.build.f_cpu=80000000L
+d1_mini_clone.menu.xtal.160=160 MHz
+d1_mini_clone.menu.xtal.160.build.f_cpu=160000000L
+d1_mini_clone.menu.vt.flash=Flash
+d1_mini_clone.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+d1_mini_clone.menu.vt.heap=Heap
+d1_mini_clone.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+d1_mini_clone.menu.vt.iram=IRAM
+d1_mini_clone.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+d1_mini_clone.menu.exception.disabled=Disabled (new aborts on oom)
+d1_mini_clone.menu.exception.disabled.build.exception_flags=-fno-exceptions
+d1_mini_clone.menu.exception.disabled.build.stdcpp_lib=-lstdc++
+d1_mini_clone.menu.exception.enabled=Enabled
+d1_mini_clone.menu.exception.enabled.build.exception_flags=-fexceptions
+d1_mini_clone.menu.exception.enabled.build.stdcpp_lib=-lstdc++-exc
+d1_mini_clone.menu.stacksmash.disabled=Disabled
+d1_mini_clone.menu.stacksmash.disabled.build.stacksmash_flags=
+d1_mini_clone.menu.stacksmash.enabled=Enabled
+d1_mini_clone.menu.stacksmash.enabled.build.stacksmash_flags=-fstack-protector
+d1_mini_clone.menu.ssl.all=All SSL ciphers (most compatible)
+d1_mini_clone.menu.ssl.all.build.sslflags=
+d1_mini_clone.menu.ssl.basic=Basic SSL ciphers (lower ROM use)
+d1_mini_clone.menu.ssl.basic.build.sslflags=-DBEARSSL_SSL_BASIC
+d1_mini_clone.menu.mmu.3232=32KB cache + 32KB IRAM (balanced)
+d1_mini_clone.menu.mmu.3232.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+d1_mini_clone.menu.mmu.4816=16KB cache + 48KB IRAM (IRAM)
+d1_mini_clone.menu.mmu.4816.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000
+d1_mini_clone.menu.mmu.4816H=16KB cache + 48KB IRAM and 2nd Heap (shared)
+d1_mini_clone.menu.mmu.4816H.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_IRAM_HEAP
+d1_mini_clone.menu.mmu.3216=16KB cache + 32KB IRAM + 16KB 2nd Heap (not shared)
+d1_mini_clone.menu.mmu.3216.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_SEC_HEAP=0x40108000 -DMMU_SEC_HEAP_SIZE=0x4000
+d1_mini_clone.menu.mmu.ext128k=128K Heap External 23LC1024
+d1_mini_clone.menu.mmu.ext128k.build.mmuflags=-DMMU_EXTERNAL_HEAP=128 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+d1_mini_clone.menu.mmu.ext8192k=8M w/256K Heap External 64 MBit PSRAM
+d1_mini_clone.menu.mmu.ext8192k.build.mmuflags=-DMMU_EXTERNAL_HEAP=256 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+d1_mini_clone.menu.non32xfer.fast=Use pgm_read macros for IRAM/PROGMEM
+d1_mini_clone.menu.non32xfer.fast.build.non32xferflags=
+d1_mini_clone.menu.non32xfer.safe=Byte/Word access to IRAM/PROGMEM (very slow)
+d1_mini_clone.menu.non32xfer.safe.build.non32xferflags=-DNON32XFER_HANDLER
+d1_mini_clone.upload.resetmethod=--before default_reset --after hard_reset
+d1_mini_clone.menu.FlashMode.dout=DOUT (compatible)
+d1_mini_clone.menu.FlashMode.dout.build.flash_mode=dout
+d1_mini_clone.menu.FlashMode.dout.build.flash_flags=-DFLASHMODE_DOUT
+d1_mini_clone.menu.FlashMode.dio=DIO
+d1_mini_clone.menu.FlashMode.dio.build.flash_mode=dio
+d1_mini_clone.menu.FlashMode.dio.build.flash_flags=-DFLASHMODE_DIO
+d1_mini_clone.menu.FlashMode.qout=QOUT
+d1_mini_clone.menu.FlashMode.qout.build.flash_mode=qout
+d1_mini_clone.menu.FlashMode.qout.build.flash_flags=-DFLASHMODE_QOUT
+d1_mini_clone.menu.FlashMode.qio=QIO (fast)
+d1_mini_clone.menu.FlashMode.qio.build.flash_mode=qio
+d1_mini_clone.menu.FlashMode.qio.build.flash_flags=-DFLASHMODE_QIO
+d1_mini_clone.menu.FlashFreq.40=40MHz
+d1_mini_clone.menu.FlashFreq.40.build.flash_freq=40
+d1_mini_clone.menu.FlashFreq.80=80MHz
+d1_mini_clone.menu.FlashFreq.80.build.flash_freq=80
+d1_mini_clone.menu.FlashFreq.20=20MHz
+d1_mini_clone.menu.FlashFreq.20.build.flash_freq=20
+d1_mini_clone.menu.FlashFreq.26=26MHz
+d1_mini_clone.menu.FlashFreq.26.build.flash_freq=26
+d1_mini_clone.menu.eesz.4M2M=4MB (FS:2MB OTA:~1019KB)
+d1_mini_clone.menu.eesz.4M2M.build.flash_size=4M
+d1_mini_clone.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
+d1_mini_clone.menu.eesz.4M2M.build.spiffs_pagesize=256
+d1_mini_clone.menu.eesz.4M2M.build.rfcal_addr=0x3FC000
+d1_mini_clone.menu.eesz.4M2M.build.spiffs_start=0x200000
+d1_mini_clone.menu.eesz.4M2M.build.spiffs_end=0x3FA000
+d1_mini_clone.menu.eesz.4M2M.build.spiffs_blocksize=8192
+d1_mini_clone.menu.eesz.4M3M=4MB (FS:3MB OTA:~512KB)
+d1_mini_clone.menu.eesz.4M3M.build.flash_size=4M
+d1_mini_clone.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
+d1_mini_clone.menu.eesz.4M3M.build.spiffs_pagesize=256
+d1_mini_clone.menu.eesz.4M3M.build.rfcal_addr=0x3FC000
+d1_mini_clone.menu.eesz.4M3M.build.spiffs_start=0x100000
+d1_mini_clone.menu.eesz.4M3M.build.spiffs_end=0x3FA000
+d1_mini_clone.menu.eesz.4M3M.build.spiffs_blocksize=8192
+d1_mini_clone.menu.eesz.4M1M=4MB (FS:1MB OTA:~1019KB)
+d1_mini_clone.menu.eesz.4M1M.build.flash_size=4M
+d1_mini_clone.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
+d1_mini_clone.menu.eesz.4M1M.build.spiffs_pagesize=256
+d1_mini_clone.menu.eesz.4M1M.build.rfcal_addr=0x3FC000
+d1_mini_clone.menu.eesz.4M1M.build.spiffs_start=0x300000
+d1_mini_clone.menu.eesz.4M1M.build.spiffs_end=0x3FA000
+d1_mini_clone.menu.eesz.4M1M.build.spiffs_blocksize=8192
+d1_mini_clone.menu.eesz.4M=4MB (FS:none OTA:~1019KB)
+d1_mini_clone.menu.eesz.4M.build.flash_size=4M
+d1_mini_clone.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
+d1_mini_clone.menu.eesz.4M.build.spiffs_pagesize=256
+d1_mini_clone.menu.eesz.4M.build.rfcal_addr=0x3FC000
+d1_mini_clone.menu.ip.lm2f=v2 Lower Memory
+d1_mini_clone.menu.ip.lm2f.build.lwip_include=lwip2/include
+d1_mini_clone.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+d1_mini_clone.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+d1_mini_clone.menu.ip.hb2f=v2 Higher Bandwidth
+d1_mini_clone.menu.ip.hb2f.build.lwip_include=lwip2/include
+d1_mini_clone.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+d1_mini_clone.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+d1_mini_clone.menu.ip.lm2n=v2 Lower Memory (no features)
+d1_mini_clone.menu.ip.lm2n.build.lwip_include=lwip2/include
+d1_mini_clone.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+d1_mini_clone.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+d1_mini_clone.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+d1_mini_clone.menu.ip.hb2n.build.lwip_include=lwip2/include
+d1_mini_clone.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+d1_mini_clone.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+d1_mini_clone.menu.ip.lm6f=v2 IPv6 Lower Memory
+d1_mini_clone.menu.ip.lm6f.build.lwip_include=lwip2/include
+d1_mini_clone.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+d1_mini_clone.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+d1_mini_clone.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+d1_mini_clone.menu.ip.hb6f.build.lwip_include=lwip2/include
+d1_mini_clone.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+d1_mini_clone.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+d1_mini_clone.menu.dbg.Disabled=Disabled
+d1_mini_clone.menu.dbg.Disabled.build.debug_port=
+d1_mini_clone.menu.dbg.Serial=Serial
+d1_mini_clone.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+d1_mini_clone.menu.dbg.Serial1=Serial1
+d1_mini_clone.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+d1_mini_clone.menu.lvl.None____=None
+d1_mini_clone.menu.lvl.None____.build.debug_level=
+d1_mini_clone.menu.optim.Smallest=None
+d1_mini_clone.menu.optim.Smallest.build.debug_optim=-Os
+d1_mini_clone.menu.optim.Lite=Lite
+d1_mini_clone.menu.optim.Lite.build.debug_optim=-Os -fno-optimize-sibling-calls
+d1_mini_clone.menu.optim.Full=Optimum
+d1_mini_clone.menu.optim.Full.build.debug_optim=-Og
+d1_mini_clone.menu.lvl.SSL=SSL
+d1_mini_clone.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+d1_mini_clone.menu.lvl.TLS_MEM=TLS_MEM
+d1_mini_clone.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+d1_mini_clone.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+d1_mini_clone.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+d1_mini_clone.menu.lvl.HTTP_SERVER=HTTP_SERVER
+d1_mini_clone.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+d1_mini_clone.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+d1_mini_clone.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+d1_mini_clone.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+d1_mini_clone.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+d1_mini_clone.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+d1_mini_clone.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+d1_mini_clone.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+d1_mini_clone.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+d1_mini_clone.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+d1_mini_clone.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+d1_mini_clone.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+d1_mini_clone.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+d1_mini_clone.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+d1_mini_clone.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+d1_mini_clone.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+d1_mini_clone.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+d1_mini_clone.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+d1_mini_clone.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+d1_mini_clone.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+d1_mini_clone.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+d1_mini_clone.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+d1_mini_clone.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+d1_mini_clone.menu.lvl.CORE=CORE
+d1_mini_clone.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+d1_mini_clone.menu.lvl.WIFI=WIFI
+d1_mini_clone.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+d1_mini_clone.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+d1_mini_clone.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+d1_mini_clone.menu.lvl.UPDATER=UPDATER
+d1_mini_clone.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+d1_mini_clone.menu.lvl.OTA=OTA
+d1_mini_clone.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+d1_mini_clone.menu.lvl.OOM=OOM
+d1_mini_clone.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+d1_mini_clone.menu.lvl.MDNS=MDNS
+d1_mini_clone.menu.lvl.MDNS.build.debug_level= -DDEBUG_ESP_MDNS
+d1_mini_clone.menu.lvl.HWDT=HWDT
+d1_mini_clone.menu.lvl.HWDT.build.debug_level= -DDEBUG_ESP_HWDT
+d1_mini_clone.menu.lvl.HWDT_NOEXTRA4K=HWDT_NOEXTRA4K
+d1_mini_clone.menu.lvl.HWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_HWDT_NOEXTRA4K
+d1_mini_clone.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+d1_mini_clone.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+d1_mini_clone.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+d1_mini_clone.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+d1_mini_clone.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+d1_mini_clone.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+d1_mini_clone.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+d1_mini_clone.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+d1_mini_clone.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+d1_mini_clone.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+d1_mini_clone.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+d1_mini_clone.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+d1_mini_clone.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+d1_mini_clone.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+d1_mini_clone.menu.wipe.none=Only Sketch
+d1_mini_clone.menu.wipe.none.upload.erase_cmd=
+d1_mini_clone.menu.wipe.sdk=Sketch + WiFi Settings
+d1_mini_clone.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
+d1_mini_clone.menu.wipe.all=All Flash Contents
+d1_mini_clone.menu.wipe.all.upload.erase_cmd=erase_flash
+d1_mini_clone.menu.baud.921600=921600
+d1_mini_clone.menu.baud.921600.upload.speed=921600
+d1_mini_clone.menu.baud.57600=57600
+d1_mini_clone.menu.baud.57600.upload.speed=57600
+d1_mini_clone.menu.baud.115200=115200
+d1_mini_clone.menu.baud.115200.upload.speed=115200
+d1_mini_clone.menu.baud.230400.linux=230400
+d1_mini_clone.menu.baud.230400.macosx=230400
+d1_mini_clone.menu.baud.230400.upload.speed=230400
+d1_mini_clone.menu.baud.256000.windows=256000
+d1_mini_clone.menu.baud.256000.upload.speed=256000
+d1_mini_clone.menu.baud.460800.linux=460800
+d1_mini_clone.menu.baud.460800.macosx=460800
+d1_mini_clone.menu.baud.460800.upload.speed=460800
+d1_mini_clone.menu.baud.512000.windows=512000
+d1_mini_clone.menu.baud.512000.upload.speed=512000
+d1_mini_clone.menu.baud.3000000=3000000
+d1_mini_clone.menu.baud.3000000.upload.speed=3000000
+d1_mini_clone.menu.eesz.autoflash=Mapping defined by Hardware and Sketch
+d1_mini_clone.menu.eesz.autoflash.build.flash_size=16M
+d1_mini_clone.menu.eesz.autoflash.build.flash_ld=eagle.flash.auto.ld
+d1_mini_clone.menu.eesz.autoflash.build.extra_flags=-DFLASH_MAP_SUPPORT=1
+d1_mini_clone.menu.eesz.autoflash.upload.maximum_size=1044464
+d1_mini_clone.menu.iramfloat.no=in IROM
+d1_mini_clone.menu.iramfloat.no.build.iramfloat=-DFP_IN_IROM
+d1_mini_clone.menu.iramfloat.yes=allowed in ISR
+d1_mini_clone.menu.iramfloat.yes.build.iramfloat=-DFP_IN_IRAM
-espresso_lite_v2.menu.Debug.Disabled=Disabled
-espresso_lite_v2.menu.Debug.Disabled.build.debug_port=
-espresso_lite_v2.menu.Debug.Serial=Serial
-espresso_lite_v2.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-espresso_lite_v2.menu.Debug.Serial1=Serial1
-espresso_lite_v2.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+##############################################################
+d1_mini_lite.name=LOLIN(WEMOS) D1 mini Lite
+d1_mini_lite.build.board=ESP8266_WEMOS_D1MINILITE
+d1_mini_lite.build.variant=d1_mini
+d1_mini_lite.upload.tool=esptool
+d1_mini_lite.upload.maximum_data_size=81920
+d1_mini_lite.upload.wait_for_upload_port=true
+d1_mini_lite.upload.erase_cmd=
+d1_mini_lite.serial.disableDTR=true
+d1_mini_lite.serial.disableRTS=true
+d1_mini_lite.build.mcu=esp8266
+d1_mini_lite.build.core=esp8266
+d1_mini_lite.build.spiffs_pagesize=256
+d1_mini_lite.build.debug_optim=
+d1_mini_lite.build.debug_port=
+d1_mini_lite.build.debug_level=
+d1_mini_lite.menu.xtal.80=80 MHz
+d1_mini_lite.menu.xtal.80.build.f_cpu=80000000L
+d1_mini_lite.menu.xtal.160=160 MHz
+d1_mini_lite.menu.xtal.160.build.f_cpu=160000000L
+d1_mini_lite.menu.vt.flash=Flash
+d1_mini_lite.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+d1_mini_lite.menu.vt.heap=Heap
+d1_mini_lite.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+d1_mini_lite.menu.vt.iram=IRAM
+d1_mini_lite.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+d1_mini_lite.menu.exception.disabled=Disabled (new aborts on oom)
+d1_mini_lite.menu.exception.disabled.build.exception_flags=-fno-exceptions
+d1_mini_lite.menu.exception.disabled.build.stdcpp_lib=-lstdc++
+d1_mini_lite.menu.exception.enabled=Enabled
+d1_mini_lite.menu.exception.enabled.build.exception_flags=-fexceptions
+d1_mini_lite.menu.exception.enabled.build.stdcpp_lib=-lstdc++-exc
+d1_mini_lite.menu.stacksmash.disabled=Disabled
+d1_mini_lite.menu.stacksmash.disabled.build.stacksmash_flags=
+d1_mini_lite.menu.stacksmash.enabled=Enabled
+d1_mini_lite.menu.stacksmash.enabled.build.stacksmash_flags=-fstack-protector
+d1_mini_lite.menu.ssl.all=All SSL ciphers (most compatible)
+d1_mini_lite.menu.ssl.all.build.sslflags=
+d1_mini_lite.menu.ssl.basic=Basic SSL ciphers (lower ROM use)
+d1_mini_lite.menu.ssl.basic.build.sslflags=-DBEARSSL_SSL_BASIC
+d1_mini_lite.menu.mmu.3232=32KB cache + 32KB IRAM (balanced)
+d1_mini_lite.menu.mmu.3232.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+d1_mini_lite.menu.mmu.4816=16KB cache + 48KB IRAM (IRAM)
+d1_mini_lite.menu.mmu.4816.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000
+d1_mini_lite.menu.mmu.4816H=16KB cache + 48KB IRAM and 2nd Heap (shared)
+d1_mini_lite.menu.mmu.4816H.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_IRAM_HEAP
+d1_mini_lite.menu.mmu.3216=16KB cache + 32KB IRAM + 16KB 2nd Heap (not shared)
+d1_mini_lite.menu.mmu.3216.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_SEC_HEAP=0x40108000 -DMMU_SEC_HEAP_SIZE=0x4000
+d1_mini_lite.menu.mmu.ext128k=128K Heap External 23LC1024
+d1_mini_lite.menu.mmu.ext128k.build.mmuflags=-DMMU_EXTERNAL_HEAP=128 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+d1_mini_lite.menu.mmu.ext8192k=8M w/256K Heap External 64 MBit PSRAM
+d1_mini_lite.menu.mmu.ext8192k.build.mmuflags=-DMMU_EXTERNAL_HEAP=256 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+d1_mini_lite.menu.non32xfer.fast=Use pgm_read macros for IRAM/PROGMEM
+d1_mini_lite.menu.non32xfer.fast.build.non32xferflags=
+d1_mini_lite.menu.non32xfer.safe=Byte/Word access to IRAM/PROGMEM (very slow)
+d1_mini_lite.menu.non32xfer.safe.build.non32xferflags=-DNON32XFER_HANDLER
+d1_mini_lite.upload.resetmethod=--before default_reset --after hard_reset
+d1_mini_lite.build.flash_mode=dout
+d1_mini_lite.build.flash_flags=-DFLASHMODE_DOUT
+d1_mini_lite.build.flash_freq=40
+d1_mini_lite.menu.eesz.1M64=1MB (FS:64KB OTA:~470KB)
+d1_mini_lite.menu.eesz.1M64.build.flash_size=1M
+d1_mini_lite.menu.eesz.1M64.build.flash_ld=eagle.flash.1m64.ld
+d1_mini_lite.menu.eesz.1M64.build.spiffs_pagesize=256
+d1_mini_lite.menu.eesz.1M64.build.rfcal_addr=0xFC000
+d1_mini_lite.menu.eesz.1M64.build.spiffs_start=0xEB000
+d1_mini_lite.menu.eesz.1M64.build.spiffs_end=0xFB000
+d1_mini_lite.menu.eesz.1M64.build.spiffs_blocksize=4096
+d1_mini_lite.menu.eesz.1M128=1MB (FS:128KB OTA:~438KB)
+d1_mini_lite.menu.eesz.1M128.build.flash_size=1M
+d1_mini_lite.menu.eesz.1M128.build.flash_ld=eagle.flash.1m128.ld
+d1_mini_lite.menu.eesz.1M128.build.spiffs_pagesize=256
+d1_mini_lite.menu.eesz.1M128.build.rfcal_addr=0xFC000
+d1_mini_lite.menu.eesz.1M128.build.spiffs_start=0xDB000
+d1_mini_lite.menu.eesz.1M128.build.spiffs_end=0xFB000
+d1_mini_lite.menu.eesz.1M128.build.spiffs_blocksize=4096
+d1_mini_lite.menu.eesz.1M144=1MB (FS:144KB OTA:~430KB)
+d1_mini_lite.menu.eesz.1M144.build.flash_size=1M
+d1_mini_lite.menu.eesz.1M144.build.flash_ld=eagle.flash.1m144.ld
+d1_mini_lite.menu.eesz.1M144.build.spiffs_pagesize=256
+d1_mini_lite.menu.eesz.1M144.build.rfcal_addr=0xFC000
+d1_mini_lite.menu.eesz.1M144.build.spiffs_start=0xD7000
+d1_mini_lite.menu.eesz.1M144.build.spiffs_end=0xFB000
+d1_mini_lite.menu.eesz.1M144.build.spiffs_blocksize=4096
+d1_mini_lite.menu.eesz.1M160=1MB (FS:160KB OTA:~422KB)
+d1_mini_lite.menu.eesz.1M160.build.flash_size=1M
+d1_mini_lite.menu.eesz.1M160.build.flash_ld=eagle.flash.1m160.ld
+d1_mini_lite.menu.eesz.1M160.build.spiffs_pagesize=256
+d1_mini_lite.menu.eesz.1M160.build.rfcal_addr=0xFC000
+d1_mini_lite.menu.eesz.1M160.build.spiffs_start=0xD3000
+d1_mini_lite.menu.eesz.1M160.build.spiffs_end=0xFB000
+d1_mini_lite.menu.eesz.1M160.build.spiffs_blocksize=4096
+d1_mini_lite.menu.eesz.1M192=1MB (FS:192KB OTA:~406KB)
+d1_mini_lite.menu.eesz.1M192.build.flash_size=1M
+d1_mini_lite.menu.eesz.1M192.build.flash_ld=eagle.flash.1m192.ld
+d1_mini_lite.menu.eesz.1M192.build.spiffs_pagesize=256
+d1_mini_lite.menu.eesz.1M192.build.rfcal_addr=0xFC000
+d1_mini_lite.menu.eesz.1M192.build.spiffs_start=0xCB000
+d1_mini_lite.menu.eesz.1M192.build.spiffs_end=0xFB000
+d1_mini_lite.menu.eesz.1M192.build.spiffs_blocksize=4096
+d1_mini_lite.menu.eesz.1M256=1MB (FS:256KB OTA:~374KB)
+d1_mini_lite.menu.eesz.1M256.build.flash_size=1M
+d1_mini_lite.menu.eesz.1M256.build.flash_ld=eagle.flash.1m256.ld
+d1_mini_lite.menu.eesz.1M256.build.spiffs_pagesize=256
+d1_mini_lite.menu.eesz.1M256.build.rfcal_addr=0xFC000
+d1_mini_lite.menu.eesz.1M256.build.spiffs_start=0xBB000
+d1_mini_lite.menu.eesz.1M256.build.spiffs_end=0xFB000
+d1_mini_lite.menu.eesz.1M256.build.spiffs_blocksize=4096
+d1_mini_lite.menu.eesz.1M512=1MB (FS:512KB OTA:~246KB)
+d1_mini_lite.menu.eesz.1M512.build.flash_size=1M
+d1_mini_lite.menu.eesz.1M512.build.flash_ld=eagle.flash.1m512.ld
+d1_mini_lite.menu.eesz.1M512.build.spiffs_pagesize=256
+d1_mini_lite.menu.eesz.1M512.build.rfcal_addr=0xFC000
+d1_mini_lite.menu.eesz.1M512.build.spiffs_start=0x7B000
+d1_mini_lite.menu.eesz.1M512.build.spiffs_end=0xFB000
+d1_mini_lite.menu.eesz.1M512.build.spiffs_blocksize=8192
+d1_mini_lite.menu.eesz.1M=1MB (FS:none OTA:~502KB)
+d1_mini_lite.menu.eesz.1M.build.flash_size=1M
+d1_mini_lite.menu.eesz.1M.build.flash_ld=eagle.flash.1m.ld
+d1_mini_lite.menu.eesz.1M.build.spiffs_pagesize=256
+d1_mini_lite.menu.eesz.1M.build.rfcal_addr=0xFC000
+d1_mini_lite.menu.ip.lm2f=v2 Lower Memory
+d1_mini_lite.menu.ip.lm2f.build.lwip_include=lwip2/include
+d1_mini_lite.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+d1_mini_lite.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+d1_mini_lite.menu.ip.hb2f=v2 Higher Bandwidth
+d1_mini_lite.menu.ip.hb2f.build.lwip_include=lwip2/include
+d1_mini_lite.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+d1_mini_lite.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+d1_mini_lite.menu.ip.lm2n=v2 Lower Memory (no features)
+d1_mini_lite.menu.ip.lm2n.build.lwip_include=lwip2/include
+d1_mini_lite.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+d1_mini_lite.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+d1_mini_lite.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+d1_mini_lite.menu.ip.hb2n.build.lwip_include=lwip2/include
+d1_mini_lite.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+d1_mini_lite.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+d1_mini_lite.menu.ip.lm6f=v2 IPv6 Lower Memory
+d1_mini_lite.menu.ip.lm6f.build.lwip_include=lwip2/include
+d1_mini_lite.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+d1_mini_lite.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+d1_mini_lite.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+d1_mini_lite.menu.ip.hb6f.build.lwip_include=lwip2/include
+d1_mini_lite.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+d1_mini_lite.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+d1_mini_lite.menu.dbg.Disabled=Disabled
+d1_mini_lite.menu.dbg.Disabled.build.debug_port=
+d1_mini_lite.menu.dbg.Serial=Serial
+d1_mini_lite.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+d1_mini_lite.menu.dbg.Serial1=Serial1
+d1_mini_lite.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+d1_mini_lite.menu.lvl.None____=None
+d1_mini_lite.menu.lvl.None____.build.debug_level=
+d1_mini_lite.menu.optim.Smallest=None
+d1_mini_lite.menu.optim.Smallest.build.debug_optim=-Os
+d1_mini_lite.menu.optim.Lite=Lite
+d1_mini_lite.menu.optim.Lite.build.debug_optim=-Os -fno-optimize-sibling-calls
+d1_mini_lite.menu.optim.Full=Optimum
+d1_mini_lite.menu.optim.Full.build.debug_optim=-Og
+d1_mini_lite.menu.lvl.SSL=SSL
+d1_mini_lite.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+d1_mini_lite.menu.lvl.TLS_MEM=TLS_MEM
+d1_mini_lite.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+d1_mini_lite.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+d1_mini_lite.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+d1_mini_lite.menu.lvl.HTTP_SERVER=HTTP_SERVER
+d1_mini_lite.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+d1_mini_lite.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+d1_mini_lite.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+d1_mini_lite.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+d1_mini_lite.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+d1_mini_lite.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+d1_mini_lite.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+d1_mini_lite.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+d1_mini_lite.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+d1_mini_lite.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+d1_mini_lite.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+d1_mini_lite.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+d1_mini_lite.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+d1_mini_lite.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+d1_mini_lite.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+d1_mini_lite.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+d1_mini_lite.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+d1_mini_lite.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+d1_mini_lite.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+d1_mini_lite.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+d1_mini_lite.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+d1_mini_lite.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+d1_mini_lite.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+d1_mini_lite.menu.lvl.CORE=CORE
+d1_mini_lite.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+d1_mini_lite.menu.lvl.WIFI=WIFI
+d1_mini_lite.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+d1_mini_lite.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+d1_mini_lite.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+d1_mini_lite.menu.lvl.UPDATER=UPDATER
+d1_mini_lite.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+d1_mini_lite.menu.lvl.OTA=OTA
+d1_mini_lite.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+d1_mini_lite.menu.lvl.OOM=OOM
+d1_mini_lite.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+d1_mini_lite.menu.lvl.MDNS=MDNS
+d1_mini_lite.menu.lvl.MDNS.build.debug_level= -DDEBUG_ESP_MDNS
+d1_mini_lite.menu.lvl.HWDT=HWDT
+d1_mini_lite.menu.lvl.HWDT.build.debug_level= -DDEBUG_ESP_HWDT
+d1_mini_lite.menu.lvl.HWDT_NOEXTRA4K=HWDT_NOEXTRA4K
+d1_mini_lite.menu.lvl.HWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_HWDT_NOEXTRA4K
+d1_mini_lite.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+d1_mini_lite.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+d1_mini_lite.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+d1_mini_lite.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+d1_mini_lite.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+d1_mini_lite.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+d1_mini_lite.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+d1_mini_lite.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+d1_mini_lite.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+d1_mini_lite.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+d1_mini_lite.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+d1_mini_lite.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+d1_mini_lite.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+d1_mini_lite.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+d1_mini_lite.menu.wipe.none=Only Sketch
+d1_mini_lite.menu.wipe.none.upload.erase_cmd=
+d1_mini_lite.menu.wipe.sdk=Sketch + WiFi Settings
+d1_mini_lite.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
+d1_mini_lite.menu.wipe.all=All Flash Contents
+d1_mini_lite.menu.wipe.all.upload.erase_cmd=erase_flash
+d1_mini_lite.menu.baud.921600=921600
+d1_mini_lite.menu.baud.921600.upload.speed=921600
+d1_mini_lite.menu.baud.57600=57600
+d1_mini_lite.menu.baud.57600.upload.speed=57600
+d1_mini_lite.menu.baud.115200=115200
+d1_mini_lite.menu.baud.115200.upload.speed=115200
+d1_mini_lite.menu.baud.230400.linux=230400
+d1_mini_lite.menu.baud.230400.macosx=230400
+d1_mini_lite.menu.baud.230400.upload.speed=230400
+d1_mini_lite.menu.baud.256000.windows=256000
+d1_mini_lite.menu.baud.256000.upload.speed=256000
+d1_mini_lite.menu.baud.460800.linux=460800
+d1_mini_lite.menu.baud.460800.macosx=460800
+d1_mini_lite.menu.baud.460800.upload.speed=460800
+d1_mini_lite.menu.baud.512000.windows=512000
+d1_mini_lite.menu.baud.512000.upload.speed=512000
+d1_mini_lite.menu.baud.3000000=3000000
+d1_mini_lite.menu.baud.3000000.upload.speed=3000000
+d1_mini_lite.menu.eesz.autoflash=Mapping defined by Hardware and Sketch
+d1_mini_lite.menu.eesz.autoflash.build.flash_size=16M
+d1_mini_lite.menu.eesz.autoflash.build.flash_ld=eagle.flash.auto.ld
+d1_mini_lite.menu.eesz.autoflash.build.extra_flags=-DFLASH_MAP_SUPPORT=1
+d1_mini_lite.menu.eesz.autoflash.upload.maximum_size=1044464
+d1_mini_lite.menu.iramfloat.no=in IROM
+d1_mini_lite.menu.iramfloat.no.build.iramfloat=-DFP_IN_IROM
+d1_mini_lite.menu.iramfloat.yes=allowed in ISR
+d1_mini_lite.menu.iramfloat.yes.build.iramfloat=-DFP_IN_IRAM
-espresso_lite_v2.menu.DebugLevel.None____=None
-espresso_lite_v2.menu.DebugLevel.None____.build.debug_level=
-espresso_lite_v2.menu.DebugLevel.Core____=Core
-espresso_lite_v2.menu.DebugLevel.Core____.build.debug_level=-DDEBUG_ESP_CORE
-espresso_lite_v2.menu.DebugLevel.SSL_____=Core + SSL
-espresso_lite_v2.menu.DebugLevel.SSL_____.build.debug_level=-DDEBUG_ESP_CORE -DDEBUG_ESP_SSL
-espresso_lite_v2.menu.DebugLevel.SSL_MEM_=Core + SSL + TLS Mem
-espresso_lite_v2.menu.DebugLevel.SSL_MEM_.build.debug_level=-DDEBUG_ESP_CORE -DDEBUG_ESP_SSL -DDEBUG_TLS_MEM
-espresso_lite_v2.menu.DebugLevel.WiFic___=Core + WiFi
-espresso_lite_v2.menu.DebugLevel.WiFic___.build.debug_level=-DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI
-espresso_lite_v2.menu.DebugLevel.WiFi____=WiFi
-espresso_lite_v2.menu.DebugLevel.WiFi____.build.debug_level=-DDEBUG_ESP_WIFI
-espresso_lite_v2.menu.DebugLevel.HTTPClient=HTTPClient
-espresso_lite_v2.menu.DebugLevel.HTTPClient.build.debug_level=-DDEBUG_ESP_HTTP_CLIENT
-espresso_lite_v2.menu.DebugLevel.HTTPClient2=HTTPClient + SSL
-espresso_lite_v2.menu.DebugLevel.HTTPClient2.build.debug_level=-DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_SSL
-espresso_lite_v2.menu.DebugLevel.HTTPUpdate=HTTPUpdate
-espresso_lite_v2.menu.DebugLevel.HTTPUpdate.build.debug_level=-DDEBUG_ESP_HTTP_UPDATE
-espresso_lite_v2.menu.DebugLevel.HTTPUpdate2=HTTPClient + HTTPUpdate
-espresso_lite_v2.menu.DebugLevel.HTTPUpdate2.build.debug_level=-DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_HTTP_UPDATE
-espresso_lite_v2.menu.DebugLevel.HTTPUpdate3=HTTPClient + HTTPUpdate + Updater
-espresso_lite_v2.menu.DebugLevel.HTTPUpdate3.build.debug_level=-DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER
-espresso_lite_v2.menu.DebugLevel.HTTPServer=HTTPServer
-espresso_lite_v2.menu.DebugLevel.HTTPServer.build.debug_level=-DDEBUG_ESP_HTTP_SERVER
-espresso_lite_v2.menu.DebugLevel.UPDATER=Updater
-espresso_lite_v2.menu.DebugLevel.UPDATER.build.debug_level=-DDEBUG_ESP_UPDATER
-espresso_lite_v2.menu.DebugLevel.OTA_____=OTA
-espresso_lite_v2.menu.DebugLevel.OTA_____.build.debug_level=-DDEBUG_ESP_OTA
-espresso_lite_v2.menu.DebugLevel.OTA2____=OTA + Updater
-espresso_lite_v2.menu.DebugLevel.OTA2____.build.debug_level=-DDEBUG_ESP_OTA -DDEBUG_ESP_UPDATER
-espresso_lite_v2.menu.DebugLevel.all_____=All
-espresso_lite_v2.menu.DebugLevel.all_____.build.debug_level=-DDEBUG_ESP_CORE -DDEBUG_ESP_SSL -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_TLS_MEM
+##############################################################
+d1_mini_pro.name=LOLIN(WEMOS) D1 mini Pro
+d1_mini_pro.build.board=ESP8266_WEMOS_D1MINIPRO
+d1_mini_pro.build.variant=d1_mini
+d1_mini_pro.upload.tool=esptool
+d1_mini_pro.upload.maximum_data_size=81920
+d1_mini_pro.upload.wait_for_upload_port=true
+d1_mini_pro.upload.erase_cmd=
+d1_mini_pro.serial.disableDTR=true
+d1_mini_pro.serial.disableRTS=true
+d1_mini_pro.build.mcu=esp8266
+d1_mini_pro.build.core=esp8266
+d1_mini_pro.build.spiffs_pagesize=256
+d1_mini_pro.build.debug_optim=
+d1_mini_pro.build.debug_port=
+d1_mini_pro.build.debug_level=
+d1_mini_pro.menu.xtal.80=80 MHz
+d1_mini_pro.menu.xtal.80.build.f_cpu=80000000L
+d1_mini_pro.menu.xtal.160=160 MHz
+d1_mini_pro.menu.xtal.160.build.f_cpu=160000000L
+d1_mini_pro.menu.vt.flash=Flash
+d1_mini_pro.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+d1_mini_pro.menu.vt.heap=Heap
+d1_mini_pro.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+d1_mini_pro.menu.vt.iram=IRAM
+d1_mini_pro.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+d1_mini_pro.menu.exception.disabled=Disabled (new aborts on oom)
+d1_mini_pro.menu.exception.disabled.build.exception_flags=-fno-exceptions
+d1_mini_pro.menu.exception.disabled.build.stdcpp_lib=-lstdc++
+d1_mini_pro.menu.exception.enabled=Enabled
+d1_mini_pro.menu.exception.enabled.build.exception_flags=-fexceptions
+d1_mini_pro.menu.exception.enabled.build.stdcpp_lib=-lstdc++-exc
+d1_mini_pro.menu.stacksmash.disabled=Disabled
+d1_mini_pro.menu.stacksmash.disabled.build.stacksmash_flags=
+d1_mini_pro.menu.stacksmash.enabled=Enabled
+d1_mini_pro.menu.stacksmash.enabled.build.stacksmash_flags=-fstack-protector
+d1_mini_pro.menu.ssl.all=All SSL ciphers (most compatible)
+d1_mini_pro.menu.ssl.all.build.sslflags=
+d1_mini_pro.menu.ssl.basic=Basic SSL ciphers (lower ROM use)
+d1_mini_pro.menu.ssl.basic.build.sslflags=-DBEARSSL_SSL_BASIC
+d1_mini_pro.menu.mmu.3232=32KB cache + 32KB IRAM (balanced)
+d1_mini_pro.menu.mmu.3232.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+d1_mini_pro.menu.mmu.4816=16KB cache + 48KB IRAM (IRAM)
+d1_mini_pro.menu.mmu.4816.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000
+d1_mini_pro.menu.mmu.4816H=16KB cache + 48KB IRAM and 2nd Heap (shared)
+d1_mini_pro.menu.mmu.4816H.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_IRAM_HEAP
+d1_mini_pro.menu.mmu.3216=16KB cache + 32KB IRAM + 16KB 2nd Heap (not shared)
+d1_mini_pro.menu.mmu.3216.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_SEC_HEAP=0x40108000 -DMMU_SEC_HEAP_SIZE=0x4000
+d1_mini_pro.menu.mmu.ext128k=128K Heap External 23LC1024
+d1_mini_pro.menu.mmu.ext128k.build.mmuflags=-DMMU_EXTERNAL_HEAP=128 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+d1_mini_pro.menu.mmu.ext8192k=8M w/256K Heap External 64 MBit PSRAM
+d1_mini_pro.menu.mmu.ext8192k.build.mmuflags=-DMMU_EXTERNAL_HEAP=256 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+d1_mini_pro.menu.non32xfer.fast=Use pgm_read macros for IRAM/PROGMEM
+d1_mini_pro.menu.non32xfer.fast.build.non32xferflags=
+d1_mini_pro.menu.non32xfer.safe=Byte/Word access to IRAM/PROGMEM (very slow)
+d1_mini_pro.menu.non32xfer.safe.build.non32xferflags=-DNON32XFER_HANDLER
+d1_mini_pro.upload.resetmethod=--before default_reset --after hard_reset
+d1_mini_pro.build.flash_mode=dio
+d1_mini_pro.build.flash_flags=-DFLASHMODE_DIO
+d1_mini_pro.build.flash_freq=40
+d1_mini_pro.menu.eesz.16M14M=16MB (FS:14MB OTA:~1019KB)
+d1_mini_pro.menu.eesz.16M14M.build.flash_size=16M
+d1_mini_pro.menu.eesz.16M14M.build.flash_ld=eagle.flash.16m14m.ld
+d1_mini_pro.menu.eesz.16M14M.build.spiffs_pagesize=256
+d1_mini_pro.menu.eesz.16M14M.build.rfcal_addr=0xFFC000
+d1_mini_pro.menu.eesz.16M14M.build.spiffs_start=0x200000
+d1_mini_pro.menu.eesz.16M14M.build.spiffs_end=0xFFA000
+d1_mini_pro.menu.eesz.16M14M.build.spiffs_blocksize=8192
+d1_mini_pro.menu.eesz.16M15M=16MB (FS:15MB OTA:~512KB)
+d1_mini_pro.menu.eesz.16M15M.build.flash_size=16M
+d1_mini_pro.menu.eesz.16M15M.build.flash_ld=eagle.flash.16m15m.ld
+d1_mini_pro.menu.eesz.16M15M.build.spiffs_pagesize=256
+d1_mini_pro.menu.eesz.16M15M.build.rfcal_addr=0xFFC000
+d1_mini_pro.menu.eesz.16M15M.build.spiffs_start=0x100000
+d1_mini_pro.menu.eesz.16M15M.build.spiffs_end=0xFFA000
+d1_mini_pro.menu.eesz.16M15M.build.spiffs_blocksize=8192
+d1_mini_pro.menu.eesz.16M=16MB (FS:none OTA:~1019KB)
+d1_mini_pro.menu.eesz.16M.build.flash_size=16M
+d1_mini_pro.menu.eesz.16M.build.flash_ld=eagle.flash.16m.ld
+d1_mini_pro.menu.eesz.16M.build.spiffs_pagesize=256
+d1_mini_pro.menu.eesz.16M.build.rfcal_addr=0xFFC000
+d1_mini_pro.menu.ip.lm2f=v2 Lower Memory
+d1_mini_pro.menu.ip.lm2f.build.lwip_include=lwip2/include
+d1_mini_pro.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+d1_mini_pro.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+d1_mini_pro.menu.ip.hb2f=v2 Higher Bandwidth
+d1_mini_pro.menu.ip.hb2f.build.lwip_include=lwip2/include
+d1_mini_pro.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+d1_mini_pro.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+d1_mini_pro.menu.ip.lm2n=v2 Lower Memory (no features)
+d1_mini_pro.menu.ip.lm2n.build.lwip_include=lwip2/include
+d1_mini_pro.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+d1_mini_pro.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+d1_mini_pro.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+d1_mini_pro.menu.ip.hb2n.build.lwip_include=lwip2/include
+d1_mini_pro.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+d1_mini_pro.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+d1_mini_pro.menu.ip.lm6f=v2 IPv6 Lower Memory
+d1_mini_pro.menu.ip.lm6f.build.lwip_include=lwip2/include
+d1_mini_pro.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+d1_mini_pro.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+d1_mini_pro.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+d1_mini_pro.menu.ip.hb6f.build.lwip_include=lwip2/include
+d1_mini_pro.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+d1_mini_pro.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+d1_mini_pro.menu.dbg.Disabled=Disabled
+d1_mini_pro.menu.dbg.Disabled.build.debug_port=
+d1_mini_pro.menu.dbg.Serial=Serial
+d1_mini_pro.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+d1_mini_pro.menu.dbg.Serial1=Serial1
+d1_mini_pro.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+d1_mini_pro.menu.lvl.None____=None
+d1_mini_pro.menu.lvl.None____.build.debug_level=
+d1_mini_pro.menu.optim.Smallest=None
+d1_mini_pro.menu.optim.Smallest.build.debug_optim=-Os
+d1_mini_pro.menu.optim.Lite=Lite
+d1_mini_pro.menu.optim.Lite.build.debug_optim=-Os -fno-optimize-sibling-calls
+d1_mini_pro.menu.optim.Full=Optimum
+d1_mini_pro.menu.optim.Full.build.debug_optim=-Og
+d1_mini_pro.menu.lvl.SSL=SSL
+d1_mini_pro.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+d1_mini_pro.menu.lvl.TLS_MEM=TLS_MEM
+d1_mini_pro.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+d1_mini_pro.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+d1_mini_pro.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+d1_mini_pro.menu.lvl.HTTP_SERVER=HTTP_SERVER
+d1_mini_pro.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+d1_mini_pro.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+d1_mini_pro.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+d1_mini_pro.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+d1_mini_pro.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+d1_mini_pro.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+d1_mini_pro.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+d1_mini_pro.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+d1_mini_pro.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+d1_mini_pro.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+d1_mini_pro.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+d1_mini_pro.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+d1_mini_pro.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+d1_mini_pro.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+d1_mini_pro.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+d1_mini_pro.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+d1_mini_pro.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+d1_mini_pro.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+d1_mini_pro.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+d1_mini_pro.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+d1_mini_pro.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+d1_mini_pro.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+d1_mini_pro.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+d1_mini_pro.menu.lvl.CORE=CORE
+d1_mini_pro.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+d1_mini_pro.menu.lvl.WIFI=WIFI
+d1_mini_pro.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+d1_mini_pro.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+d1_mini_pro.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+d1_mini_pro.menu.lvl.UPDATER=UPDATER
+d1_mini_pro.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+d1_mini_pro.menu.lvl.OTA=OTA
+d1_mini_pro.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+d1_mini_pro.menu.lvl.OOM=OOM
+d1_mini_pro.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+d1_mini_pro.menu.lvl.MDNS=MDNS
+d1_mini_pro.menu.lvl.MDNS.build.debug_level= -DDEBUG_ESP_MDNS
+d1_mini_pro.menu.lvl.HWDT=HWDT
+d1_mini_pro.menu.lvl.HWDT.build.debug_level= -DDEBUG_ESP_HWDT
+d1_mini_pro.menu.lvl.HWDT_NOEXTRA4K=HWDT_NOEXTRA4K
+d1_mini_pro.menu.lvl.HWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_HWDT_NOEXTRA4K
+d1_mini_pro.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+d1_mini_pro.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+d1_mini_pro.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+d1_mini_pro.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+d1_mini_pro.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+d1_mini_pro.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+d1_mini_pro.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+d1_mini_pro.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+d1_mini_pro.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+d1_mini_pro.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+d1_mini_pro.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+d1_mini_pro.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+d1_mini_pro.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+d1_mini_pro.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+d1_mini_pro.menu.wipe.none=Only Sketch
+d1_mini_pro.menu.wipe.none.upload.erase_cmd=
+d1_mini_pro.menu.wipe.sdk=Sketch + WiFi Settings
+d1_mini_pro.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
+d1_mini_pro.menu.wipe.all=All Flash Contents
+d1_mini_pro.menu.wipe.all.upload.erase_cmd=erase_flash
+d1_mini_pro.menu.baud.921600=921600
+d1_mini_pro.menu.baud.921600.upload.speed=921600
+d1_mini_pro.menu.baud.57600=57600
+d1_mini_pro.menu.baud.57600.upload.speed=57600
+d1_mini_pro.menu.baud.115200=115200
+d1_mini_pro.menu.baud.115200.upload.speed=115200
+d1_mini_pro.menu.baud.230400.linux=230400
+d1_mini_pro.menu.baud.230400.macosx=230400
+d1_mini_pro.menu.baud.230400.upload.speed=230400
+d1_mini_pro.menu.baud.256000.windows=256000
+d1_mini_pro.menu.baud.256000.upload.speed=256000
+d1_mini_pro.menu.baud.460800.linux=460800
+d1_mini_pro.menu.baud.460800.macosx=460800
+d1_mini_pro.menu.baud.460800.upload.speed=460800
+d1_mini_pro.menu.baud.512000.windows=512000
+d1_mini_pro.menu.baud.512000.upload.speed=512000
+d1_mini_pro.menu.baud.3000000=3000000
+d1_mini_pro.menu.baud.3000000.upload.speed=3000000
+d1_mini_pro.menu.eesz.autoflash=Mapping defined by Hardware and Sketch
+d1_mini_pro.menu.eesz.autoflash.build.flash_size=16M
+d1_mini_pro.menu.eesz.autoflash.build.flash_ld=eagle.flash.auto.ld
+d1_mini_pro.menu.eesz.autoflash.build.extra_flags=-DFLASH_MAP_SUPPORT=1
+d1_mini_pro.menu.eesz.autoflash.upload.maximum_size=1044464
+d1_mini_pro.menu.iramfloat.no=in IROM
+d1_mini_pro.menu.iramfloat.no.build.iramfloat=-DFP_IN_IROM
+d1_mini_pro.menu.iramfloat.yes=allowed in ISR
+d1_mini_pro.menu.iramfloat.yes.build.iramfloat=-DFP_IN_IRAM
-espresso_lite_v2.build.debug_port=
-espresso_lite_v2.build.debug_level=
+##############################################################
+d1.name=LOLIN(WeMos) D1 R1
+d1.build.board=ESP8266_WEMOS_D1R1
+d1.build.variant=d1
+d1.upload.tool=esptool
+d1.upload.maximum_data_size=81920
+d1.upload.wait_for_upload_port=true
+d1.upload.erase_cmd=
+d1.serial.disableDTR=true
+d1.serial.disableRTS=true
+d1.build.mcu=esp8266
+d1.build.core=esp8266
+d1.build.spiffs_pagesize=256
+d1.build.debug_optim=
+d1.build.debug_port=
+d1.build.debug_level=
+d1.menu.xtal.80=80 MHz
+d1.menu.xtal.80.build.f_cpu=80000000L
+d1.menu.xtal.160=160 MHz
+d1.menu.xtal.160.build.f_cpu=160000000L
+d1.menu.vt.flash=Flash
+d1.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+d1.menu.vt.heap=Heap
+d1.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+d1.menu.vt.iram=IRAM
+d1.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+d1.menu.exception.disabled=Disabled (new aborts on oom)
+d1.menu.exception.disabled.build.exception_flags=-fno-exceptions
+d1.menu.exception.disabled.build.stdcpp_lib=-lstdc++
+d1.menu.exception.enabled=Enabled
+d1.menu.exception.enabled.build.exception_flags=-fexceptions
+d1.menu.exception.enabled.build.stdcpp_lib=-lstdc++-exc
+d1.menu.stacksmash.disabled=Disabled
+d1.menu.stacksmash.disabled.build.stacksmash_flags=
+d1.menu.stacksmash.enabled=Enabled
+d1.menu.stacksmash.enabled.build.stacksmash_flags=-fstack-protector
+d1.menu.ssl.all=All SSL ciphers (most compatible)
+d1.menu.ssl.all.build.sslflags=
+d1.menu.ssl.basic=Basic SSL ciphers (lower ROM use)
+d1.menu.ssl.basic.build.sslflags=-DBEARSSL_SSL_BASIC
+d1.menu.mmu.3232=32KB cache + 32KB IRAM (balanced)
+d1.menu.mmu.3232.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+d1.menu.mmu.4816=16KB cache + 48KB IRAM (IRAM)
+d1.menu.mmu.4816.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000
+d1.menu.mmu.4816H=16KB cache + 48KB IRAM and 2nd Heap (shared)
+d1.menu.mmu.4816H.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_IRAM_HEAP
+d1.menu.mmu.3216=16KB cache + 32KB IRAM + 16KB 2nd Heap (not shared)
+d1.menu.mmu.3216.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_SEC_HEAP=0x40108000 -DMMU_SEC_HEAP_SIZE=0x4000
+d1.menu.mmu.ext128k=128K Heap External 23LC1024
+d1.menu.mmu.ext128k.build.mmuflags=-DMMU_EXTERNAL_HEAP=128 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+d1.menu.mmu.ext8192k=8M w/256K Heap External 64 MBit PSRAM
+d1.menu.mmu.ext8192k.build.mmuflags=-DMMU_EXTERNAL_HEAP=256 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+d1.menu.non32xfer.fast=Use pgm_read macros for IRAM/PROGMEM
+d1.menu.non32xfer.fast.build.non32xferflags=
+d1.menu.non32xfer.safe=Byte/Word access to IRAM/PROGMEM (very slow)
+d1.menu.non32xfer.safe.build.non32xferflags=-DNON32XFER_HANDLER
+d1.upload.resetmethod=--before default_reset --after hard_reset
+d1.build.flash_mode=dio
+d1.build.flash_flags=-DFLASHMODE_DIO
+d1.build.flash_freq=40
+d1.menu.eesz.4M2M=4MB (FS:2MB OTA:~1019KB)
+d1.menu.eesz.4M2M.build.flash_size=4M
+d1.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
+d1.menu.eesz.4M2M.build.spiffs_pagesize=256
+d1.menu.eesz.4M2M.build.rfcal_addr=0x3FC000
+d1.menu.eesz.4M2M.build.spiffs_start=0x200000
+d1.menu.eesz.4M2M.build.spiffs_end=0x3FA000
+d1.menu.eesz.4M2M.build.spiffs_blocksize=8192
+d1.menu.eesz.4M3M=4MB (FS:3MB OTA:~512KB)
+d1.menu.eesz.4M3M.build.flash_size=4M
+d1.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
+d1.menu.eesz.4M3M.build.spiffs_pagesize=256
+d1.menu.eesz.4M3M.build.rfcal_addr=0x3FC000
+d1.menu.eesz.4M3M.build.spiffs_start=0x100000
+d1.menu.eesz.4M3M.build.spiffs_end=0x3FA000
+d1.menu.eesz.4M3M.build.spiffs_blocksize=8192
+d1.menu.eesz.4M1M=4MB (FS:1MB OTA:~1019KB)
+d1.menu.eesz.4M1M.build.flash_size=4M
+d1.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
+d1.menu.eesz.4M1M.build.spiffs_pagesize=256
+d1.menu.eesz.4M1M.build.rfcal_addr=0x3FC000
+d1.menu.eesz.4M1M.build.spiffs_start=0x300000
+d1.menu.eesz.4M1M.build.spiffs_end=0x3FA000
+d1.menu.eesz.4M1M.build.spiffs_blocksize=8192
+d1.menu.eesz.4M=4MB (FS:none OTA:~1019KB)
+d1.menu.eesz.4M.build.flash_size=4M
+d1.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
+d1.menu.eesz.4M.build.spiffs_pagesize=256
+d1.menu.eesz.4M.build.rfcal_addr=0x3FC000
+d1.menu.ip.lm2f=v2 Lower Memory
+d1.menu.ip.lm2f.build.lwip_include=lwip2/include
+d1.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+d1.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+d1.menu.ip.hb2f=v2 Higher Bandwidth
+d1.menu.ip.hb2f.build.lwip_include=lwip2/include
+d1.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+d1.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+d1.menu.ip.lm2n=v2 Lower Memory (no features)
+d1.menu.ip.lm2n.build.lwip_include=lwip2/include
+d1.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+d1.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+d1.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+d1.menu.ip.hb2n.build.lwip_include=lwip2/include
+d1.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+d1.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+d1.menu.ip.lm6f=v2 IPv6 Lower Memory
+d1.menu.ip.lm6f.build.lwip_include=lwip2/include
+d1.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+d1.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+d1.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+d1.menu.ip.hb6f.build.lwip_include=lwip2/include
+d1.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+d1.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+d1.menu.dbg.Disabled=Disabled
+d1.menu.dbg.Disabled.build.debug_port=
+d1.menu.dbg.Serial=Serial
+d1.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+d1.menu.dbg.Serial1=Serial1
+d1.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+d1.menu.lvl.None____=None
+d1.menu.lvl.None____.build.debug_level=
+d1.menu.optim.Smallest=None
+d1.menu.optim.Smallest.build.debug_optim=-Os
+d1.menu.optim.Lite=Lite
+d1.menu.optim.Lite.build.debug_optim=-Os -fno-optimize-sibling-calls
+d1.menu.optim.Full=Optimum
+d1.menu.optim.Full.build.debug_optim=-Og
+d1.menu.lvl.SSL=SSL
+d1.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+d1.menu.lvl.TLS_MEM=TLS_MEM
+d1.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+d1.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+d1.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+d1.menu.lvl.HTTP_SERVER=HTTP_SERVER
+d1.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+d1.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+d1.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+d1.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+d1.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+d1.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+d1.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+d1.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+d1.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+d1.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+d1.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+d1.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+d1.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+d1.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+d1.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+d1.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+d1.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+d1.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+d1.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+d1.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+d1.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+d1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+d1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+d1.menu.lvl.CORE=CORE
+d1.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+d1.menu.lvl.WIFI=WIFI
+d1.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+d1.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+d1.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+d1.menu.lvl.UPDATER=UPDATER
+d1.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+d1.menu.lvl.OTA=OTA
+d1.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+d1.menu.lvl.OOM=OOM
+d1.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+d1.menu.lvl.MDNS=MDNS
+d1.menu.lvl.MDNS.build.debug_level= -DDEBUG_ESP_MDNS
+d1.menu.lvl.HWDT=HWDT
+d1.menu.lvl.HWDT.build.debug_level= -DDEBUG_ESP_HWDT
+d1.menu.lvl.HWDT_NOEXTRA4K=HWDT_NOEXTRA4K
+d1.menu.lvl.HWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_HWDT_NOEXTRA4K
+d1.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+d1.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+d1.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+d1.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+d1.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+d1.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+d1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+d1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+d1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+d1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+d1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+d1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+d1.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+d1.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+d1.menu.wipe.none=Only Sketch
+d1.menu.wipe.none.upload.erase_cmd=
+d1.menu.wipe.sdk=Sketch + WiFi Settings
+d1.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
+d1.menu.wipe.all=All Flash Contents
+d1.menu.wipe.all.upload.erase_cmd=erase_flash
+d1.menu.baud.921600=921600
+d1.menu.baud.921600.upload.speed=921600
+d1.menu.baud.57600=57600
+d1.menu.baud.57600.upload.speed=57600
+d1.menu.baud.115200=115200
+d1.menu.baud.115200.upload.speed=115200
+d1.menu.baud.230400.linux=230400
+d1.menu.baud.230400.macosx=230400
+d1.menu.baud.230400.upload.speed=230400
+d1.menu.baud.256000.windows=256000
+d1.menu.baud.256000.upload.speed=256000
+d1.menu.baud.460800.linux=460800
+d1.menu.baud.460800.macosx=460800
+d1.menu.baud.460800.upload.speed=460800
+d1.menu.baud.512000.windows=512000
+d1.menu.baud.512000.upload.speed=512000
+d1.menu.baud.3000000=3000000
+d1.menu.baud.3000000.upload.speed=3000000
+d1.menu.eesz.autoflash=Mapping defined by Hardware and Sketch
+d1.menu.eesz.autoflash.build.flash_size=16M
+d1.menu.eesz.autoflash.build.flash_ld=eagle.flash.auto.ld
+d1.menu.eesz.autoflash.build.extra_flags=-DFLASH_MAP_SUPPORT=1
+d1.menu.eesz.autoflash.upload.maximum_size=1044464
+d1.menu.iramfloat.no=in IROM
+d1.menu.iramfloat.no.build.iramfloat=-DFP_IN_IROM
+d1.menu.iramfloat.yes=allowed in ISR
+d1.menu.iramfloat.yes.build.iramfloat=-DFP_IN_IRAM
##############################################################
-nodemcu.name=NodeMCU 0.9 (ESP-12 Module)
+agruminolemon.name=Lifely Agrumino Lemon v4
+agruminolemon.build.board=ESP8266_AGRUMINO_LEMON_V4
+agruminolemon.build.variant=agruminolemonv4
+agruminolemon.upload.tool=esptool
+agruminolemon.upload.maximum_data_size=81920
+agruminolemon.upload.wait_for_upload_port=true
+agruminolemon.upload.erase_cmd=
+agruminolemon.serial.disableDTR=true
+agruminolemon.serial.disableRTS=true
+agruminolemon.build.mcu=esp8266
+agruminolemon.build.core=esp8266
+agruminolemon.build.spiffs_pagesize=256
+agruminolemon.build.debug_optim=
+agruminolemon.build.debug_port=
+agruminolemon.build.debug_level=
+agruminolemon.menu.xtal.80=80 MHz
+agruminolemon.menu.xtal.80.build.f_cpu=80000000L
+agruminolemon.menu.xtal.160=160 MHz
+agruminolemon.menu.xtal.160.build.f_cpu=160000000L
+agruminolemon.menu.vt.flash=Flash
+agruminolemon.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+agruminolemon.menu.vt.heap=Heap
+agruminolemon.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+agruminolemon.menu.vt.iram=IRAM
+agruminolemon.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+agruminolemon.menu.exception.disabled=Disabled (new aborts on oom)
+agruminolemon.menu.exception.disabled.build.exception_flags=-fno-exceptions
+agruminolemon.menu.exception.disabled.build.stdcpp_lib=-lstdc++
+agruminolemon.menu.exception.enabled=Enabled
+agruminolemon.menu.exception.enabled.build.exception_flags=-fexceptions
+agruminolemon.menu.exception.enabled.build.stdcpp_lib=-lstdc++-exc
+agruminolemon.menu.stacksmash.disabled=Disabled
+agruminolemon.menu.stacksmash.disabled.build.stacksmash_flags=
+agruminolemon.menu.stacksmash.enabled=Enabled
+agruminolemon.menu.stacksmash.enabled.build.stacksmash_flags=-fstack-protector
+agruminolemon.menu.ssl.all=All SSL ciphers (most compatible)
+agruminolemon.menu.ssl.all.build.sslflags=
+agruminolemon.menu.ssl.basic=Basic SSL ciphers (lower ROM use)
+agruminolemon.menu.ssl.basic.build.sslflags=-DBEARSSL_SSL_BASIC
+agruminolemon.menu.mmu.3232=32KB cache + 32KB IRAM (balanced)
+agruminolemon.menu.mmu.3232.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+agruminolemon.menu.mmu.4816=16KB cache + 48KB IRAM (IRAM)
+agruminolemon.menu.mmu.4816.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000
+agruminolemon.menu.mmu.4816H=16KB cache + 48KB IRAM and 2nd Heap (shared)
+agruminolemon.menu.mmu.4816H.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_IRAM_HEAP
+agruminolemon.menu.mmu.3216=16KB cache + 32KB IRAM + 16KB 2nd Heap (not shared)
+agruminolemon.menu.mmu.3216.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_SEC_HEAP=0x40108000 -DMMU_SEC_HEAP_SIZE=0x4000
+agruminolemon.menu.mmu.ext128k=128K Heap External 23LC1024
+agruminolemon.menu.mmu.ext128k.build.mmuflags=-DMMU_EXTERNAL_HEAP=128 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+agruminolemon.menu.mmu.ext8192k=8M w/256K Heap External 64 MBit PSRAM
+agruminolemon.menu.mmu.ext8192k.build.mmuflags=-DMMU_EXTERNAL_HEAP=256 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+agruminolemon.menu.non32xfer.fast=Use pgm_read macros for IRAM/PROGMEM
+agruminolemon.menu.non32xfer.fast.build.non32xferflags=
+agruminolemon.menu.non32xfer.safe=Byte/Word access to IRAM/PROGMEM (very slow)
+agruminolemon.menu.non32xfer.safe.build.non32xferflags=-DNON32XFER_HANDLER
+agruminolemon.upload.resetmethod=--before default_reset --after hard_reset
+agruminolemon.build.flash_mode=dio
+agruminolemon.build.flash_flags=-DFLASHMODE_DIO
+agruminolemon.build.flash_freq=40
+agruminolemon.menu.eesz.2M64=2MB (FS:64KB OTA:~992KB)
+agruminolemon.menu.eesz.2M64.build.flash_size=2M
+agruminolemon.menu.eesz.2M64.build.flash_ld=eagle.flash.2m64.ld
+agruminolemon.menu.eesz.2M64.build.spiffs_pagesize=256
+agruminolemon.menu.eesz.2M64.build.rfcal_addr=0x1FC000
+agruminolemon.menu.eesz.2M64.build.spiffs_start=0x1F0000
+agruminolemon.menu.eesz.2M64.build.spiffs_end=0x1FB000
+agruminolemon.menu.eesz.2M64.build.spiffs_blocksize=4096
+agruminolemon.menu.eesz.2M128=2MB (FS:128KB OTA:~960KB)
+agruminolemon.menu.eesz.2M128.build.flash_size=2M
+agruminolemon.menu.eesz.2M128.build.flash_ld=eagle.flash.2m128.ld
+agruminolemon.menu.eesz.2M128.build.spiffs_pagesize=256
+agruminolemon.menu.eesz.2M128.build.rfcal_addr=0x1FC000
+agruminolemon.menu.eesz.2M128.build.spiffs_start=0x1E0000
+agruminolemon.menu.eesz.2M128.build.spiffs_end=0x1FB000
+agruminolemon.menu.eesz.2M128.build.spiffs_blocksize=4096
+agruminolemon.menu.eesz.2M256=2MB (FS:256KB OTA:~896KB)
+agruminolemon.menu.eesz.2M256.build.flash_size=2M
+agruminolemon.menu.eesz.2M256.build.flash_ld=eagle.flash.2m256.ld
+agruminolemon.menu.eesz.2M256.build.spiffs_pagesize=256
+agruminolemon.menu.eesz.2M256.build.rfcal_addr=0x1FC000
+agruminolemon.menu.eesz.2M256.build.spiffs_start=0x1C0000
+agruminolemon.menu.eesz.2M256.build.spiffs_end=0x1FB000
+agruminolemon.menu.eesz.2M256.build.spiffs_blocksize=4096
+agruminolemon.menu.eesz.2M512=2MB (FS:512KB OTA:~768KB)
+agruminolemon.menu.eesz.2M512.build.flash_size=2M
+agruminolemon.menu.eesz.2M512.build.flash_ld=eagle.flash.2m512.ld
+agruminolemon.menu.eesz.2M512.build.spiffs_pagesize=256
+agruminolemon.menu.eesz.2M512.build.rfcal_addr=0x1FC000
+agruminolemon.menu.eesz.2M512.build.spiffs_start=0x180000
+agruminolemon.menu.eesz.2M512.build.spiffs_end=0x1FA000
+agruminolemon.menu.eesz.2M512.build.spiffs_blocksize=8192
+agruminolemon.menu.eesz.2M1M=2MB (FS:1MB OTA:~512KB)
+agruminolemon.menu.eesz.2M1M.build.flash_size=2M
+agruminolemon.menu.eesz.2M1M.build.flash_ld=eagle.flash.2m1m.ld
+agruminolemon.menu.eesz.2M1M.build.spiffs_pagesize=256
+agruminolemon.menu.eesz.2M1M.build.rfcal_addr=0x1FC000
+agruminolemon.menu.eesz.2M1M.build.spiffs_start=0x100000
+agruminolemon.menu.eesz.2M1M.build.spiffs_end=0x1FA000
+agruminolemon.menu.eesz.2M1M.build.spiffs_blocksize=8192
+agruminolemon.menu.eesz.2M=2MB (FS:none OTA:~1019KB)
+agruminolemon.menu.eesz.2M.build.flash_size=2M
+agruminolemon.menu.eesz.2M.build.flash_ld=eagle.flash.2m.ld
+agruminolemon.menu.eesz.2M.build.spiffs_pagesize=256
+agruminolemon.menu.eesz.2M.build.rfcal_addr=0x1FC000
+agruminolemon.menu.ip.lm2f=v2 Lower Memory
+agruminolemon.menu.ip.lm2f.build.lwip_include=lwip2/include
+agruminolemon.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+agruminolemon.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+agruminolemon.menu.ip.hb2f=v2 Higher Bandwidth
+agruminolemon.menu.ip.hb2f.build.lwip_include=lwip2/include
+agruminolemon.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+agruminolemon.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+agruminolemon.menu.ip.lm2n=v2 Lower Memory (no features)
+agruminolemon.menu.ip.lm2n.build.lwip_include=lwip2/include
+agruminolemon.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+agruminolemon.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+agruminolemon.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+agruminolemon.menu.ip.hb2n.build.lwip_include=lwip2/include
+agruminolemon.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+agruminolemon.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+agruminolemon.menu.ip.lm6f=v2 IPv6 Lower Memory
+agruminolemon.menu.ip.lm6f.build.lwip_include=lwip2/include
+agruminolemon.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+agruminolemon.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+agruminolemon.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+agruminolemon.menu.ip.hb6f.build.lwip_include=lwip2/include
+agruminolemon.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+agruminolemon.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+agruminolemon.menu.dbg.Disabled=Disabled
+agruminolemon.menu.dbg.Disabled.build.debug_port=
+agruminolemon.menu.dbg.Serial=Serial
+agruminolemon.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+agruminolemon.menu.dbg.Serial1=Serial1
+agruminolemon.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+agruminolemon.menu.lvl.None____=None
+agruminolemon.menu.lvl.None____.build.debug_level=
+agruminolemon.menu.optim.Smallest=None
+agruminolemon.menu.optim.Smallest.build.debug_optim=-Os
+agruminolemon.menu.optim.Lite=Lite
+agruminolemon.menu.optim.Lite.build.debug_optim=-Os -fno-optimize-sibling-calls
+agruminolemon.menu.optim.Full=Optimum
+agruminolemon.menu.optim.Full.build.debug_optim=-Og
+agruminolemon.menu.lvl.SSL=SSL
+agruminolemon.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+agruminolemon.menu.lvl.TLS_MEM=TLS_MEM
+agruminolemon.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+agruminolemon.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+agruminolemon.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+agruminolemon.menu.lvl.HTTP_SERVER=HTTP_SERVER
+agruminolemon.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+agruminolemon.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+agruminolemon.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+agruminolemon.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+agruminolemon.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+agruminolemon.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+agruminolemon.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+agruminolemon.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+agruminolemon.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+agruminolemon.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+agruminolemon.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+agruminolemon.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+agruminolemon.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+agruminolemon.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+agruminolemon.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+agruminolemon.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+agruminolemon.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+agruminolemon.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+agruminolemon.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+agruminolemon.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+agruminolemon.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+agruminolemon.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+agruminolemon.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+agruminolemon.menu.lvl.CORE=CORE
+agruminolemon.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+agruminolemon.menu.lvl.WIFI=WIFI
+agruminolemon.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+agruminolemon.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+agruminolemon.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+agruminolemon.menu.lvl.UPDATER=UPDATER
+agruminolemon.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+agruminolemon.menu.lvl.OTA=OTA
+agruminolemon.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+agruminolemon.menu.lvl.OOM=OOM
+agruminolemon.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+agruminolemon.menu.lvl.MDNS=MDNS
+agruminolemon.menu.lvl.MDNS.build.debug_level= -DDEBUG_ESP_MDNS
+agruminolemon.menu.lvl.HWDT=HWDT
+agruminolemon.menu.lvl.HWDT.build.debug_level= -DDEBUG_ESP_HWDT
+agruminolemon.menu.lvl.HWDT_NOEXTRA4K=HWDT_NOEXTRA4K
+agruminolemon.menu.lvl.HWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_HWDT_NOEXTRA4K
+agruminolemon.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+agruminolemon.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+agruminolemon.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+agruminolemon.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+agruminolemon.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+agruminolemon.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+agruminolemon.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+agruminolemon.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+agruminolemon.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+agruminolemon.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+agruminolemon.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+agruminolemon.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+agruminolemon.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+agruminolemon.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+agruminolemon.menu.wipe.none=Only Sketch
+agruminolemon.menu.wipe.none.upload.erase_cmd=
+agruminolemon.menu.wipe.sdk=Sketch + WiFi Settings
+agruminolemon.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
+agruminolemon.menu.wipe.all=All Flash Contents
+agruminolemon.menu.wipe.all.upload.erase_cmd=erase_flash
+agruminolemon.menu.baud.115200=115200
+agruminolemon.menu.baud.115200.upload.speed=115200
+agruminolemon.menu.baud.57600=57600
+agruminolemon.menu.baud.57600.upload.speed=57600
+agruminolemon.menu.baud.230400.linux=230400
+agruminolemon.menu.baud.230400.macosx=230400
+agruminolemon.menu.baud.230400.upload.speed=230400
+agruminolemon.menu.baud.256000.windows=256000
+agruminolemon.menu.baud.256000.upload.speed=256000
+agruminolemon.menu.baud.460800.linux=460800
+agruminolemon.menu.baud.460800.macosx=460800
+agruminolemon.menu.baud.460800.upload.speed=460800
+agruminolemon.menu.baud.512000.windows=512000
+agruminolemon.menu.baud.512000.upload.speed=512000
+agruminolemon.menu.baud.921600=921600
+agruminolemon.menu.baud.921600.upload.speed=921600
+agruminolemon.menu.baud.3000000=3000000
+agruminolemon.menu.baud.3000000.upload.speed=3000000
+agruminolemon.menu.eesz.autoflash=Mapping defined by Hardware and Sketch
+agruminolemon.menu.eesz.autoflash.build.flash_size=16M
+agruminolemon.menu.eesz.autoflash.build.flash_ld=eagle.flash.auto.ld
+agruminolemon.menu.eesz.autoflash.build.extra_flags=-DFLASH_MAP_SUPPORT=1
+agruminolemon.menu.eesz.autoflash.upload.maximum_size=1044464
+agruminolemon.menu.iramfloat.no=in IROM
+agruminolemon.menu.iramfloat.no.build.iramfloat=-DFP_IN_IROM
+agruminolemon.menu.iramfloat.yes=allowed in ISR
+agruminolemon.menu.iramfloat.yes.build.iramfloat=-DFP_IN_IRAM
+##############################################################
+mercury1.name=Mercury 1.0
+mercury1.build.board=mercury
+mercury1.build.variant=mercury_v1
+mercury1.upload.tool=esptool
+mercury1.upload.maximum_data_size=81920
+mercury1.upload.wait_for_upload_port=true
+mercury1.upload.erase_cmd=
+mercury1.serial.disableDTR=true
+mercury1.serial.disableRTS=true
+mercury1.build.mcu=esp8266
+mercury1.build.core=esp8266
+mercury1.build.spiffs_pagesize=256
+mercury1.build.debug_optim=
+mercury1.build.debug_port=
+mercury1.build.debug_level=
+mercury1.menu.xtal.80=80 MHz
+mercury1.menu.xtal.80.build.f_cpu=80000000L
+mercury1.menu.xtal.160=160 MHz
+mercury1.menu.xtal.160.build.f_cpu=160000000L
+mercury1.menu.vt.flash=Flash
+mercury1.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+mercury1.menu.vt.heap=Heap
+mercury1.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+mercury1.menu.vt.iram=IRAM
+mercury1.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+mercury1.menu.exception.disabled=Disabled (new aborts on oom)
+mercury1.menu.exception.disabled.build.exception_flags=-fno-exceptions
+mercury1.menu.exception.disabled.build.stdcpp_lib=-lstdc++
+mercury1.menu.exception.enabled=Enabled
+mercury1.menu.exception.enabled.build.exception_flags=-fexceptions
+mercury1.menu.exception.enabled.build.stdcpp_lib=-lstdc++-exc
+mercury1.menu.stacksmash.disabled=Disabled
+mercury1.menu.stacksmash.disabled.build.stacksmash_flags=
+mercury1.menu.stacksmash.enabled=Enabled
+mercury1.menu.stacksmash.enabled.build.stacksmash_flags=-fstack-protector
+mercury1.menu.ssl.all=All SSL ciphers (most compatible)
+mercury1.menu.ssl.all.build.sslflags=
+mercury1.menu.ssl.basic=Basic SSL ciphers (lower ROM use)
+mercury1.menu.ssl.basic.build.sslflags=-DBEARSSL_SSL_BASIC
+mercury1.menu.mmu.3232=32KB cache + 32KB IRAM (balanced)
+mercury1.menu.mmu.3232.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+mercury1.menu.mmu.4816=16KB cache + 48KB IRAM (IRAM)
+mercury1.menu.mmu.4816.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000
+mercury1.menu.mmu.4816H=16KB cache + 48KB IRAM and 2nd Heap (shared)
+mercury1.menu.mmu.4816H.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_IRAM_HEAP
+mercury1.menu.mmu.3216=16KB cache + 32KB IRAM + 16KB 2nd Heap (not shared)
+mercury1.menu.mmu.3216.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_SEC_HEAP=0x40108000 -DMMU_SEC_HEAP_SIZE=0x4000
+mercury1.menu.mmu.ext128k=128K Heap External 23LC1024
+mercury1.menu.mmu.ext128k.build.mmuflags=-DMMU_EXTERNAL_HEAP=128 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+mercury1.menu.mmu.ext8192k=8M w/256K Heap External 64 MBit PSRAM
+mercury1.menu.mmu.ext8192k.build.mmuflags=-DMMU_EXTERNAL_HEAP=256 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+mercury1.menu.non32xfer.fast=Use pgm_read macros for IRAM/PROGMEM
+mercury1.menu.non32xfer.fast.build.non32xferflags=
+mercury1.menu.non32xfer.safe=Byte/Word access to IRAM/PROGMEM (very slow)
+mercury1.menu.non32xfer.safe.build.non32xferflags=-DNON32XFER_HANDLER
+mercury1.upload.resetmethod=--before default_reset --after hard_reset
+mercury1.build.flash_mode=dio
+mercury1.build.flash_flags=-DFLASHMODE_DIO
+mercury1.build.flash_freq=40
+mercury1.menu.eesz.4M2M=4MB (FS:2MB OTA:~1019KB)
+mercury1.menu.eesz.4M2M.build.flash_size=4M
+mercury1.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
+mercury1.menu.eesz.4M2M.build.spiffs_pagesize=256
+mercury1.menu.eesz.4M2M.build.rfcal_addr=0x3FC000
+mercury1.menu.eesz.4M2M.build.spiffs_start=0x200000
+mercury1.menu.eesz.4M2M.build.spiffs_end=0x3FA000
+mercury1.menu.eesz.4M2M.build.spiffs_blocksize=8192
+mercury1.menu.eesz.4M3M=4MB (FS:3MB OTA:~512KB)
+mercury1.menu.eesz.4M3M.build.flash_size=4M
+mercury1.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
+mercury1.menu.eesz.4M3M.build.spiffs_pagesize=256
+mercury1.menu.eesz.4M3M.build.rfcal_addr=0x3FC000
+mercury1.menu.eesz.4M3M.build.spiffs_start=0x100000
+mercury1.menu.eesz.4M3M.build.spiffs_end=0x3FA000
+mercury1.menu.eesz.4M3M.build.spiffs_blocksize=8192
+mercury1.menu.eesz.4M1M=4MB (FS:1MB OTA:~1019KB)
+mercury1.menu.eesz.4M1M.build.flash_size=4M
+mercury1.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
+mercury1.menu.eesz.4M1M.build.spiffs_pagesize=256
+mercury1.menu.eesz.4M1M.build.rfcal_addr=0x3FC000
+mercury1.menu.eesz.4M1M.build.spiffs_start=0x300000
+mercury1.menu.eesz.4M1M.build.spiffs_end=0x3FA000
+mercury1.menu.eesz.4M1M.build.spiffs_blocksize=8192
+mercury1.menu.eesz.4M=4MB (FS:none OTA:~1019KB)
+mercury1.menu.eesz.4M.build.flash_size=4M
+mercury1.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
+mercury1.menu.eesz.4M.build.spiffs_pagesize=256
+mercury1.menu.eesz.4M.build.rfcal_addr=0x3FC000
+mercury1.menu.ip.lm2f=v2 Lower Memory
+mercury1.menu.ip.lm2f.build.lwip_include=lwip2/include
+mercury1.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+mercury1.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+mercury1.menu.ip.hb2f=v2 Higher Bandwidth
+mercury1.menu.ip.hb2f.build.lwip_include=lwip2/include
+mercury1.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+mercury1.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+mercury1.menu.ip.lm2n=v2 Lower Memory (no features)
+mercury1.menu.ip.lm2n.build.lwip_include=lwip2/include
+mercury1.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+mercury1.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+mercury1.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+mercury1.menu.ip.hb2n.build.lwip_include=lwip2/include
+mercury1.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+mercury1.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+mercury1.menu.ip.lm6f=v2 IPv6 Lower Memory
+mercury1.menu.ip.lm6f.build.lwip_include=lwip2/include
+mercury1.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+mercury1.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+mercury1.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+mercury1.menu.ip.hb6f.build.lwip_include=lwip2/include
+mercury1.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+mercury1.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+mercury1.menu.dbg.Disabled=Disabled
+mercury1.menu.dbg.Disabled.build.debug_port=
+mercury1.menu.dbg.Serial=Serial
+mercury1.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+mercury1.menu.dbg.Serial1=Serial1
+mercury1.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+mercury1.menu.lvl.None____=None
+mercury1.menu.lvl.None____.build.debug_level=
+mercury1.menu.optim.Smallest=None
+mercury1.menu.optim.Smallest.build.debug_optim=-Os
+mercury1.menu.optim.Lite=Lite
+mercury1.menu.optim.Lite.build.debug_optim=-Os -fno-optimize-sibling-calls
+mercury1.menu.optim.Full=Optimum
+mercury1.menu.optim.Full.build.debug_optim=-Og
+mercury1.menu.lvl.SSL=SSL
+mercury1.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+mercury1.menu.lvl.TLS_MEM=TLS_MEM
+mercury1.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+mercury1.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+mercury1.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+mercury1.menu.lvl.HTTP_SERVER=HTTP_SERVER
+mercury1.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+mercury1.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+mercury1.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+mercury1.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+mercury1.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+mercury1.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+mercury1.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+mercury1.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+mercury1.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+mercury1.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+mercury1.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+mercury1.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+mercury1.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+mercury1.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+mercury1.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+mercury1.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+mercury1.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+mercury1.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+mercury1.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+mercury1.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+mercury1.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+mercury1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+mercury1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+mercury1.menu.lvl.CORE=CORE
+mercury1.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+mercury1.menu.lvl.WIFI=WIFI
+mercury1.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+mercury1.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+mercury1.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+mercury1.menu.lvl.UPDATER=UPDATER
+mercury1.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+mercury1.menu.lvl.OTA=OTA
+mercury1.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+mercury1.menu.lvl.OOM=OOM
+mercury1.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+mercury1.menu.lvl.MDNS=MDNS
+mercury1.menu.lvl.MDNS.build.debug_level= -DDEBUG_ESP_MDNS
+mercury1.menu.lvl.HWDT=HWDT
+mercury1.menu.lvl.HWDT.build.debug_level= -DDEBUG_ESP_HWDT
+mercury1.menu.lvl.HWDT_NOEXTRA4K=HWDT_NOEXTRA4K
+mercury1.menu.lvl.HWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_HWDT_NOEXTRA4K
+mercury1.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+mercury1.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+mercury1.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+mercury1.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+mercury1.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+mercury1.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+mercury1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+mercury1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+mercury1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+mercury1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+mercury1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+mercury1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+mercury1.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+mercury1.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+mercury1.menu.wipe.none=Only Sketch
+mercury1.menu.wipe.none.upload.erase_cmd=
+mercury1.menu.wipe.sdk=Sketch + WiFi Settings
+mercury1.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
+mercury1.menu.wipe.all=All Flash Contents
+mercury1.menu.wipe.all.upload.erase_cmd=erase_flash
+mercury1.menu.baud.115200=115200
+mercury1.menu.baud.115200.upload.speed=115200
+mercury1.menu.baud.57600=57600
+mercury1.menu.baud.57600.upload.speed=57600
+mercury1.menu.baud.230400.linux=230400
+mercury1.menu.baud.230400.macosx=230400
+mercury1.menu.baud.230400.upload.speed=230400
+mercury1.menu.baud.256000.windows=256000
+mercury1.menu.baud.256000.upload.speed=256000
+mercury1.menu.baud.460800.linux=460800
+mercury1.menu.baud.460800.macosx=460800
+mercury1.menu.baud.460800.upload.speed=460800
+mercury1.menu.baud.512000.windows=512000
+mercury1.menu.baud.512000.upload.speed=512000
+mercury1.menu.baud.921600=921600
+mercury1.menu.baud.921600.upload.speed=921600
+mercury1.menu.baud.3000000=3000000
+mercury1.menu.baud.3000000.upload.speed=3000000
+mercury1.menu.eesz.autoflash=Mapping defined by Hardware and Sketch
+mercury1.menu.eesz.autoflash.build.flash_size=16M
+mercury1.menu.eesz.autoflash.build.flash_ld=eagle.flash.auto.ld
+mercury1.menu.eesz.autoflash.build.extra_flags=-DFLASH_MAP_SUPPORT=1
+mercury1.menu.eesz.autoflash.upload.maximum_size=1044464
+mercury1.menu.iramfloat.no=in IROM
+mercury1.menu.iramfloat.no.build.iramfloat=-DFP_IN_IROM
+mercury1.menu.iramfloat.yes=allowed in ISR
+mercury1.menu.iramfloat.yes.build.iramfloat=-DFP_IN_IRAM
+
+##############################################################
+nodemcu.name=NodeMCU 0.9 (ESP-12 Module)
+nodemcu.build.board=ESP8266_NODEMCU_ESP12
+nodemcu.build.variant=nodemcu
nodemcu.upload.tool=esptool
-nodemcu.upload.speed=115200
-nodemcu.upload.resetmethod=nodemcu
-nodemcu.upload.maximum_size=1044464
nodemcu.upload.maximum_data_size=81920
nodemcu.upload.wait_for_upload_port=true
+nodemcu.upload.erase_cmd=
nodemcu.serial.disableDTR=true
nodemcu.serial.disableRTS=true
-
nodemcu.build.mcu=esp8266
-nodemcu.build.f_cpu=80000000L
-nodemcu.build.board=ESP8266_ESP12
nodemcu.build.core=esp8266
-nodemcu.build.variant=nodemcu
-nodemcu.build.flash_mode=qio
-nodemcu.build.flash_size=4M
-nodemcu.build.flash_freq=40
+nodemcu.build.spiffs_pagesize=256
+nodemcu.build.debug_optim=
nodemcu.build.debug_port=
nodemcu.build.debug_level=
-
-nodemcu.menu.CpuFrequency.80=80 MHz
-nodemcu.menu.CpuFrequency.80.build.f_cpu=80000000L
-nodemcu.menu.CpuFrequency.160=160 MHz
-nodemcu.menu.CpuFrequency.160.build.f_cpu=160000000L
-
-nodemcu.menu.UploadSpeed.115200=115200
-nodemcu.menu.UploadSpeed.115200.upload.speed=115200
-nodemcu.menu.UploadSpeed.9600=9600
-nodemcu.menu.UploadSpeed.9600.upload.speed=9600
-nodemcu.menu.UploadSpeed.57600=57600
-nodemcu.menu.UploadSpeed.57600.upload.speed=57600
-nodemcu.menu.UploadSpeed.256000.windows=256000
-nodemcu.menu.UploadSpeed.256000.upload.speed=256000
-nodemcu.menu.UploadSpeed.230400.linux=230400
-nodemcu.menu.UploadSpeed.230400.macosx=230400
-nodemcu.menu.UploadSpeed.230400.macosx=230400
-nodemcu.menu.UploadSpeed.230400.upload.speed=230400
-nodemcu.menu.UploadSpeed.460800.linux=460800
-nodemcu.menu.UploadSpeed.460800.macosx=460800
-nodemcu.menu.UploadSpeed.460800.upload.speed=460800
-nodemcu.menu.UploadSpeed.512000.windows=512000
-nodemcu.menu.UploadSpeed.512000.upload.speed=512000
-nodemcu.menu.UploadSpeed.921600=921600
-nodemcu.menu.UploadSpeed.921600.upload.speed=921600
-
-nodemcu.menu.FlashSize.4M3M=4M (3M SPIFFS)
-nodemcu.menu.FlashSize.4M3M.build.flash_size=4M
-nodemcu.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-nodemcu.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-nodemcu.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-nodemcu.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-nodemcu.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-
-nodemcu.menu.FlashSize.4M1M=4M (1M SPIFFS)
-nodemcu.menu.FlashSize.4M1M.build.flash_size=4M
-nodemcu.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-nodemcu.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-nodemcu.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-nodemcu.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-nodemcu.menu.FlashSize.4M1M.build.spiffs_pagesize=256
+nodemcu.menu.xtal.80=80 MHz
+nodemcu.menu.xtal.80.build.f_cpu=80000000L
+nodemcu.menu.xtal.160=160 MHz
+nodemcu.menu.xtal.160.build.f_cpu=160000000L
+nodemcu.menu.vt.flash=Flash
+nodemcu.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+nodemcu.menu.vt.heap=Heap
+nodemcu.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+nodemcu.menu.vt.iram=IRAM
+nodemcu.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+nodemcu.menu.exception.disabled=Disabled (new aborts on oom)
+nodemcu.menu.exception.disabled.build.exception_flags=-fno-exceptions
+nodemcu.menu.exception.disabled.build.stdcpp_lib=-lstdc++
+nodemcu.menu.exception.enabled=Enabled
+nodemcu.menu.exception.enabled.build.exception_flags=-fexceptions
+nodemcu.menu.exception.enabled.build.stdcpp_lib=-lstdc++-exc
+nodemcu.menu.stacksmash.disabled=Disabled
+nodemcu.menu.stacksmash.disabled.build.stacksmash_flags=
+nodemcu.menu.stacksmash.enabled=Enabled
+nodemcu.menu.stacksmash.enabled.build.stacksmash_flags=-fstack-protector
+nodemcu.menu.ssl.all=All SSL ciphers (most compatible)
+nodemcu.menu.ssl.all.build.sslflags=
+nodemcu.menu.ssl.basic=Basic SSL ciphers (lower ROM use)
+nodemcu.menu.ssl.basic.build.sslflags=-DBEARSSL_SSL_BASIC
+nodemcu.menu.mmu.3232=32KB cache + 32KB IRAM (balanced)
+nodemcu.menu.mmu.3232.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+nodemcu.menu.mmu.4816=16KB cache + 48KB IRAM (IRAM)
+nodemcu.menu.mmu.4816.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000
+nodemcu.menu.mmu.4816H=16KB cache + 48KB IRAM and 2nd Heap (shared)
+nodemcu.menu.mmu.4816H.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_IRAM_HEAP
+nodemcu.menu.mmu.3216=16KB cache + 32KB IRAM + 16KB 2nd Heap (not shared)
+nodemcu.menu.mmu.3216.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_SEC_HEAP=0x40108000 -DMMU_SEC_HEAP_SIZE=0x4000
+nodemcu.menu.mmu.ext128k=128K Heap External 23LC1024
+nodemcu.menu.mmu.ext128k.build.mmuflags=-DMMU_EXTERNAL_HEAP=128 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+nodemcu.menu.mmu.ext8192k=8M w/256K Heap External 64 MBit PSRAM
+nodemcu.menu.mmu.ext8192k.build.mmuflags=-DMMU_EXTERNAL_HEAP=256 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+nodemcu.menu.non32xfer.fast=Use pgm_read macros for IRAM/PROGMEM
+nodemcu.menu.non32xfer.fast.build.non32xferflags=
+nodemcu.menu.non32xfer.safe=Byte/Word access to IRAM/PROGMEM (very slow)
+nodemcu.menu.non32xfer.safe.build.non32xferflags=-DNON32XFER_HANDLER
+nodemcu.upload.resetmethod=--before default_reset --after hard_reset
+nodemcu.build.flash_mode=qio
+nodemcu.build.flash_flags=-DFLASHMODE_QIO
+nodemcu.build.flash_freq=40
+nodemcu.menu.eesz.4M2M=4MB (FS:2MB OTA:~1019KB)
+nodemcu.menu.eesz.4M2M.build.flash_size=4M
+nodemcu.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
+nodemcu.menu.eesz.4M2M.build.spiffs_pagesize=256
+nodemcu.menu.eesz.4M2M.build.rfcal_addr=0x3FC000
+nodemcu.menu.eesz.4M2M.build.spiffs_start=0x200000
+nodemcu.menu.eesz.4M2M.build.spiffs_end=0x3FA000
+nodemcu.menu.eesz.4M2M.build.spiffs_blocksize=8192
+nodemcu.menu.eesz.4M3M=4MB (FS:3MB OTA:~512KB)
+nodemcu.menu.eesz.4M3M.build.flash_size=4M
+nodemcu.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
+nodemcu.menu.eesz.4M3M.build.spiffs_pagesize=256
+nodemcu.menu.eesz.4M3M.build.rfcal_addr=0x3FC000
+nodemcu.menu.eesz.4M3M.build.spiffs_start=0x100000
+nodemcu.menu.eesz.4M3M.build.spiffs_end=0x3FA000
+nodemcu.menu.eesz.4M3M.build.spiffs_blocksize=8192
+nodemcu.menu.eesz.4M1M=4MB (FS:1MB OTA:~1019KB)
+nodemcu.menu.eesz.4M1M.build.flash_size=4M
+nodemcu.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
+nodemcu.menu.eesz.4M1M.build.spiffs_pagesize=256
+nodemcu.menu.eesz.4M1M.build.rfcal_addr=0x3FC000
+nodemcu.menu.eesz.4M1M.build.spiffs_start=0x300000
+nodemcu.menu.eesz.4M1M.build.spiffs_end=0x3FA000
+nodemcu.menu.eesz.4M1M.build.spiffs_blocksize=8192
+nodemcu.menu.eesz.4M=4MB (FS:none OTA:~1019KB)
+nodemcu.menu.eesz.4M.build.flash_size=4M
+nodemcu.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
+nodemcu.menu.eesz.4M.build.spiffs_pagesize=256
+nodemcu.menu.eesz.4M.build.rfcal_addr=0x3FC000
+nodemcu.menu.ip.lm2f=v2 Lower Memory
+nodemcu.menu.ip.lm2f.build.lwip_include=lwip2/include
+nodemcu.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+nodemcu.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+nodemcu.menu.ip.hb2f=v2 Higher Bandwidth
+nodemcu.menu.ip.hb2f.build.lwip_include=lwip2/include
+nodemcu.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+nodemcu.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+nodemcu.menu.ip.lm2n=v2 Lower Memory (no features)
+nodemcu.menu.ip.lm2n.build.lwip_include=lwip2/include
+nodemcu.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+nodemcu.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+nodemcu.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+nodemcu.menu.ip.hb2n.build.lwip_include=lwip2/include
+nodemcu.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+nodemcu.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+nodemcu.menu.ip.lm6f=v2 IPv6 Lower Memory
+nodemcu.menu.ip.lm6f.build.lwip_include=lwip2/include
+nodemcu.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+nodemcu.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+nodemcu.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+nodemcu.menu.ip.hb6f.build.lwip_include=lwip2/include
+nodemcu.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+nodemcu.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+nodemcu.menu.dbg.Disabled=Disabled
+nodemcu.menu.dbg.Disabled.build.debug_port=
+nodemcu.menu.dbg.Serial=Serial
+nodemcu.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+nodemcu.menu.dbg.Serial1=Serial1
+nodemcu.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+nodemcu.menu.lvl.None____=None
+nodemcu.menu.lvl.None____.build.debug_level=
+nodemcu.menu.optim.Smallest=None
+nodemcu.menu.optim.Smallest.build.debug_optim=-Os
+nodemcu.menu.optim.Lite=Lite
+nodemcu.menu.optim.Lite.build.debug_optim=-Os -fno-optimize-sibling-calls
+nodemcu.menu.optim.Full=Optimum
+nodemcu.menu.optim.Full.build.debug_optim=-Og
+nodemcu.menu.lvl.SSL=SSL
+nodemcu.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+nodemcu.menu.lvl.TLS_MEM=TLS_MEM
+nodemcu.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+nodemcu.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+nodemcu.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+nodemcu.menu.lvl.HTTP_SERVER=HTTP_SERVER
+nodemcu.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+nodemcu.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+nodemcu.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+nodemcu.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+nodemcu.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+nodemcu.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+nodemcu.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+nodemcu.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+nodemcu.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+nodemcu.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+nodemcu.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+nodemcu.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+nodemcu.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+nodemcu.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+nodemcu.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+nodemcu.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+nodemcu.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+nodemcu.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+nodemcu.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+nodemcu.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+nodemcu.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+nodemcu.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+nodemcu.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+nodemcu.menu.lvl.CORE=CORE
+nodemcu.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+nodemcu.menu.lvl.WIFI=WIFI
+nodemcu.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+nodemcu.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+nodemcu.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+nodemcu.menu.lvl.UPDATER=UPDATER
+nodemcu.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+nodemcu.menu.lvl.OTA=OTA
+nodemcu.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+nodemcu.menu.lvl.OOM=OOM
+nodemcu.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+nodemcu.menu.lvl.MDNS=MDNS
+nodemcu.menu.lvl.MDNS.build.debug_level= -DDEBUG_ESP_MDNS
+nodemcu.menu.lvl.HWDT=HWDT
+nodemcu.menu.lvl.HWDT.build.debug_level= -DDEBUG_ESP_HWDT
+nodemcu.menu.lvl.HWDT_NOEXTRA4K=HWDT_NOEXTRA4K
+nodemcu.menu.lvl.HWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_HWDT_NOEXTRA4K
+nodemcu.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+nodemcu.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+nodemcu.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+nodemcu.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+nodemcu.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+nodemcu.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+nodemcu.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+nodemcu.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+nodemcu.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+nodemcu.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+nodemcu.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+nodemcu.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+nodemcu.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+nodemcu.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+nodemcu.menu.wipe.none=Only Sketch
+nodemcu.menu.wipe.none.upload.erase_cmd=
+nodemcu.menu.wipe.sdk=Sketch + WiFi Settings
+nodemcu.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
+nodemcu.menu.wipe.all=All Flash Contents
+nodemcu.menu.wipe.all.upload.erase_cmd=erase_flash
+nodemcu.menu.baud.115200=115200
+nodemcu.menu.baud.115200.upload.speed=115200
+nodemcu.menu.baud.57600=57600
+nodemcu.menu.baud.57600.upload.speed=57600
+nodemcu.menu.baud.230400.linux=230400
+nodemcu.menu.baud.230400.macosx=230400
+nodemcu.menu.baud.230400.upload.speed=230400
+nodemcu.menu.baud.256000.windows=256000
+nodemcu.menu.baud.256000.upload.speed=256000
+nodemcu.menu.baud.460800.linux=460800
+nodemcu.menu.baud.460800.macosx=460800
+nodemcu.menu.baud.460800.upload.speed=460800
+nodemcu.menu.baud.512000.windows=512000
+nodemcu.menu.baud.512000.upload.speed=512000
+nodemcu.menu.baud.921600=921600
+nodemcu.menu.baud.921600.upload.speed=921600
+nodemcu.menu.baud.3000000=3000000
+nodemcu.menu.baud.3000000.upload.speed=3000000
+nodemcu.menu.eesz.autoflash=Mapping defined by Hardware and Sketch
+nodemcu.menu.eesz.autoflash.build.flash_size=16M
+nodemcu.menu.eesz.autoflash.build.flash_ld=eagle.flash.auto.ld
+nodemcu.menu.eesz.autoflash.build.extra_flags=-DFLASH_MAP_SUPPORT=1
+nodemcu.menu.eesz.autoflash.upload.maximum_size=1044464
+nodemcu.menu.iramfloat.no=in IROM
+nodemcu.menu.iramfloat.no.build.iramfloat=-DFP_IN_IROM
+nodemcu.menu.iramfloat.yes=allowed in ISR
+nodemcu.menu.iramfloat.yes.build.iramfloat=-DFP_IN_IRAM
##############################################################
nodemcuv2.name=NodeMCU 1.0 (ESP-12E Module)
-
+nodemcuv2.build.board=ESP8266_NODEMCU_ESP12E
+nodemcuv2.build.variant=nodemcu
nodemcuv2.upload.tool=esptool
-nodemcuv2.upload.speed=115200
-nodemcuv2.upload.resetmethod=nodemcu
-nodemcuv2.upload.maximum_size=1044464
nodemcuv2.upload.maximum_data_size=81920
nodemcuv2.upload.wait_for_upload_port=true
+nodemcuv2.upload.erase_cmd=
nodemcuv2.serial.disableDTR=true
nodemcuv2.serial.disableRTS=true
-
nodemcuv2.build.mcu=esp8266
-nodemcuv2.build.f_cpu=80000000L
-nodemcuv2.build.board=ESP8266_ESP12
nodemcuv2.build.core=esp8266
-nodemcuv2.build.variant=nodemcu
-nodemcuv2.build.flash_mode=dio
-nodemcuv2.build.flash_size=4M
-nodemcuv2.build.flash_freq=40
+nodemcuv2.build.spiffs_pagesize=256
+nodemcuv2.build.debug_optim=
nodemcuv2.build.debug_port=
nodemcuv2.build.debug_level=
-
-nodemcuv2.menu.CpuFrequency.80=80 MHz
-nodemcuv2.menu.CpuFrequency.80.build.f_cpu=80000000L
-nodemcuv2.menu.CpuFrequency.160=160 MHz
-nodemcuv2.menu.CpuFrequency.160.build.f_cpu=160000000L
-
-nodemcuv2.menu.UploadSpeed.115200=115200
-nodemcuv2.menu.UploadSpeed.115200.upload.speed=115200
-nodemcuv2.menu.UploadSpeed.9600=9600
-nodemcuv2.menu.UploadSpeed.9600.upload.speed=9600
-nodemcuv2.menu.UploadSpeed.57600=57600
-nodemcuv2.menu.UploadSpeed.57600.upload.speed=57600
-nodemcuv2.menu.UploadSpeed.256000.windows=256000
-nodemcuv2.menu.UploadSpeed.256000.upload.speed=256000
-nodemcuv2.menu.UploadSpeed.230400.linux=230400
-nodemcuv2.menu.UploadSpeed.230400.macosx=230400
-nodemcuv2.menu.UploadSpeed.230400.macosx=230400
-nodemcuv2.menu.UploadSpeed.230400.upload.speed=230400
-nodemcuv2.menu.UploadSpeed.460800.linux=460800
-nodemcuv2.menu.UploadSpeed.460800.macosx=460800
-nodemcuv2.menu.UploadSpeed.460800.upload.speed=460800
-nodemcuv2.menu.UploadSpeed.512000.windows=512000
-nodemcuv2.menu.UploadSpeed.512000.upload.speed=512000
-nodemcuv2.menu.UploadSpeed.921600=921600
-nodemcuv2.menu.UploadSpeed.921600.upload.speed=921600
-
-nodemcuv2.menu.FlashSize.4M3M=4M (3M SPIFFS)
-nodemcuv2.menu.FlashSize.4M3M.build.flash_size=4M
-nodemcuv2.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-nodemcuv2.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-nodemcuv2.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-nodemcuv2.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-nodemcuv2.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-
-nodemcuv2.menu.FlashSize.4M1M=4M (1M SPIFFS)
-nodemcuv2.menu.FlashSize.4M1M.build.flash_size=4M
-nodemcuv2.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-nodemcuv2.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-nodemcuv2.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-nodemcuv2.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-nodemcuv2.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-
+nodemcuv2.menu.xtal.80=80 MHz
+nodemcuv2.menu.xtal.80.build.f_cpu=80000000L
+nodemcuv2.menu.xtal.160=160 MHz
+nodemcuv2.menu.xtal.160.build.f_cpu=160000000L
+nodemcuv2.menu.vt.flash=Flash
+nodemcuv2.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+nodemcuv2.menu.vt.heap=Heap
+nodemcuv2.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+nodemcuv2.menu.vt.iram=IRAM
+nodemcuv2.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+nodemcuv2.menu.exception.disabled=Disabled (new aborts on oom)
+nodemcuv2.menu.exception.disabled.build.exception_flags=-fno-exceptions
+nodemcuv2.menu.exception.disabled.build.stdcpp_lib=-lstdc++
+nodemcuv2.menu.exception.enabled=Enabled
+nodemcuv2.menu.exception.enabled.build.exception_flags=-fexceptions
+nodemcuv2.menu.exception.enabled.build.stdcpp_lib=-lstdc++-exc
+nodemcuv2.menu.stacksmash.disabled=Disabled
+nodemcuv2.menu.stacksmash.disabled.build.stacksmash_flags=
+nodemcuv2.menu.stacksmash.enabled=Enabled
+nodemcuv2.menu.stacksmash.enabled.build.stacksmash_flags=-fstack-protector
+nodemcuv2.menu.ssl.all=All SSL ciphers (most compatible)
+nodemcuv2.menu.ssl.all.build.sslflags=
+nodemcuv2.menu.ssl.basic=Basic SSL ciphers (lower ROM use)
+nodemcuv2.menu.ssl.basic.build.sslflags=-DBEARSSL_SSL_BASIC
+nodemcuv2.menu.mmu.3232=32KB cache + 32KB IRAM (balanced)
+nodemcuv2.menu.mmu.3232.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+nodemcuv2.menu.mmu.4816=16KB cache + 48KB IRAM (IRAM)
+nodemcuv2.menu.mmu.4816.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000
+nodemcuv2.menu.mmu.4816H=16KB cache + 48KB IRAM and 2nd Heap (shared)
+nodemcuv2.menu.mmu.4816H.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_IRAM_HEAP
+nodemcuv2.menu.mmu.3216=16KB cache + 32KB IRAM + 16KB 2nd Heap (not shared)
+nodemcuv2.menu.mmu.3216.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_SEC_HEAP=0x40108000 -DMMU_SEC_HEAP_SIZE=0x4000
+nodemcuv2.menu.mmu.ext128k=128K Heap External 23LC1024
+nodemcuv2.menu.mmu.ext128k.build.mmuflags=-DMMU_EXTERNAL_HEAP=128 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+nodemcuv2.menu.mmu.ext8192k=8M w/256K Heap External 64 MBit PSRAM
+nodemcuv2.menu.mmu.ext8192k.build.mmuflags=-DMMU_EXTERNAL_HEAP=256 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+nodemcuv2.menu.non32xfer.fast=Use pgm_read macros for IRAM/PROGMEM
+nodemcuv2.menu.non32xfer.fast.build.non32xferflags=
+nodemcuv2.menu.non32xfer.safe=Byte/Word access to IRAM/PROGMEM (very slow)
+nodemcuv2.menu.non32xfer.safe.build.non32xferflags=-DNON32XFER_HANDLER
+nodemcuv2.upload.resetmethod=--before default_reset --after hard_reset
+nodemcuv2.build.flash_mode=dio
+nodemcuv2.build.flash_flags=-DFLASHMODE_DIO
+nodemcuv2.build.flash_freq=40
+nodemcuv2.menu.eesz.4M2M=4MB (FS:2MB OTA:~1019KB)
+nodemcuv2.menu.eesz.4M2M.build.flash_size=4M
+nodemcuv2.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
+nodemcuv2.menu.eesz.4M2M.build.spiffs_pagesize=256
+nodemcuv2.menu.eesz.4M2M.build.rfcal_addr=0x3FC000
+nodemcuv2.menu.eesz.4M2M.build.spiffs_start=0x200000
+nodemcuv2.menu.eesz.4M2M.build.spiffs_end=0x3FA000
+nodemcuv2.menu.eesz.4M2M.build.spiffs_blocksize=8192
+nodemcuv2.menu.eesz.4M3M=4MB (FS:3MB OTA:~512KB)
+nodemcuv2.menu.eesz.4M3M.build.flash_size=4M
+nodemcuv2.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
+nodemcuv2.menu.eesz.4M3M.build.spiffs_pagesize=256
+nodemcuv2.menu.eesz.4M3M.build.rfcal_addr=0x3FC000
+nodemcuv2.menu.eesz.4M3M.build.spiffs_start=0x100000
+nodemcuv2.menu.eesz.4M3M.build.spiffs_end=0x3FA000
+nodemcuv2.menu.eesz.4M3M.build.spiffs_blocksize=8192
+nodemcuv2.menu.eesz.4M1M=4MB (FS:1MB OTA:~1019KB)
+nodemcuv2.menu.eesz.4M1M.build.flash_size=4M
+nodemcuv2.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
+nodemcuv2.menu.eesz.4M1M.build.spiffs_pagesize=256
+nodemcuv2.menu.eesz.4M1M.build.rfcal_addr=0x3FC000
+nodemcuv2.menu.eesz.4M1M.build.spiffs_start=0x300000
+nodemcuv2.menu.eesz.4M1M.build.spiffs_end=0x3FA000
+nodemcuv2.menu.eesz.4M1M.build.spiffs_blocksize=8192
+nodemcuv2.menu.eesz.4M=4MB (FS:none OTA:~1019KB)
+nodemcuv2.menu.eesz.4M.build.flash_size=4M
+nodemcuv2.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
+nodemcuv2.menu.eesz.4M.build.spiffs_pagesize=256
+nodemcuv2.menu.eesz.4M.build.rfcal_addr=0x3FC000
+nodemcuv2.menu.led.2=2
+nodemcuv2.menu.led.2.build.led=-DLED_BUILTIN=2
+nodemcuv2.menu.led.16=16
+nodemcuv2.menu.led.16.build.led=-DLED_BUILTIN=16
+nodemcuv2.menu.ip.lm2f=v2 Lower Memory
+nodemcuv2.menu.ip.lm2f.build.lwip_include=lwip2/include
+nodemcuv2.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+nodemcuv2.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+nodemcuv2.menu.ip.hb2f=v2 Higher Bandwidth
+nodemcuv2.menu.ip.hb2f.build.lwip_include=lwip2/include
+nodemcuv2.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+nodemcuv2.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+nodemcuv2.menu.ip.lm2n=v2 Lower Memory (no features)
+nodemcuv2.menu.ip.lm2n.build.lwip_include=lwip2/include
+nodemcuv2.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+nodemcuv2.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+nodemcuv2.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+nodemcuv2.menu.ip.hb2n.build.lwip_include=lwip2/include
+nodemcuv2.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+nodemcuv2.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+nodemcuv2.menu.ip.lm6f=v2 IPv6 Lower Memory
+nodemcuv2.menu.ip.lm6f.build.lwip_include=lwip2/include
+nodemcuv2.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+nodemcuv2.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+nodemcuv2.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+nodemcuv2.menu.ip.hb6f.build.lwip_include=lwip2/include
+nodemcuv2.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+nodemcuv2.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+nodemcuv2.menu.dbg.Disabled=Disabled
+nodemcuv2.menu.dbg.Disabled.build.debug_port=
+nodemcuv2.menu.dbg.Serial=Serial
+nodemcuv2.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+nodemcuv2.menu.dbg.Serial1=Serial1
+nodemcuv2.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+nodemcuv2.menu.lvl.None____=None
+nodemcuv2.menu.lvl.None____.build.debug_level=
+nodemcuv2.menu.optim.Smallest=None
+nodemcuv2.menu.optim.Smallest.build.debug_optim=-Os
+nodemcuv2.menu.optim.Lite=Lite
+nodemcuv2.menu.optim.Lite.build.debug_optim=-Os -fno-optimize-sibling-calls
+nodemcuv2.menu.optim.Full=Optimum
+nodemcuv2.menu.optim.Full.build.debug_optim=-Og
+nodemcuv2.menu.lvl.SSL=SSL
+nodemcuv2.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+nodemcuv2.menu.lvl.TLS_MEM=TLS_MEM
+nodemcuv2.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+nodemcuv2.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+nodemcuv2.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+nodemcuv2.menu.lvl.HTTP_SERVER=HTTP_SERVER
+nodemcuv2.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+nodemcuv2.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+nodemcuv2.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+nodemcuv2.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+nodemcuv2.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+nodemcuv2.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+nodemcuv2.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+nodemcuv2.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+nodemcuv2.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+nodemcuv2.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+nodemcuv2.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+nodemcuv2.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+nodemcuv2.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+nodemcuv2.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+nodemcuv2.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+nodemcuv2.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+nodemcuv2.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+nodemcuv2.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+nodemcuv2.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+nodemcuv2.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+nodemcuv2.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+nodemcuv2.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+nodemcuv2.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+nodemcuv2.menu.lvl.CORE=CORE
+nodemcuv2.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+nodemcuv2.menu.lvl.WIFI=WIFI
+nodemcuv2.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+nodemcuv2.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+nodemcuv2.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+nodemcuv2.menu.lvl.UPDATER=UPDATER
+nodemcuv2.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+nodemcuv2.menu.lvl.OTA=OTA
+nodemcuv2.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+nodemcuv2.menu.lvl.OOM=OOM
+nodemcuv2.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+nodemcuv2.menu.lvl.MDNS=MDNS
+nodemcuv2.menu.lvl.MDNS.build.debug_level= -DDEBUG_ESP_MDNS
+nodemcuv2.menu.lvl.HWDT=HWDT
+nodemcuv2.menu.lvl.HWDT.build.debug_level= -DDEBUG_ESP_HWDT
+nodemcuv2.menu.lvl.HWDT_NOEXTRA4K=HWDT_NOEXTRA4K
+nodemcuv2.menu.lvl.HWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_HWDT_NOEXTRA4K
+nodemcuv2.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+nodemcuv2.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+nodemcuv2.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+nodemcuv2.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+nodemcuv2.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+nodemcuv2.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+nodemcuv2.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+nodemcuv2.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+nodemcuv2.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+nodemcuv2.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+nodemcuv2.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+nodemcuv2.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+nodemcuv2.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+nodemcuv2.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+nodemcuv2.menu.wipe.none=Only Sketch
+nodemcuv2.menu.wipe.none.upload.erase_cmd=
+nodemcuv2.menu.wipe.sdk=Sketch + WiFi Settings
+nodemcuv2.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
+nodemcuv2.menu.wipe.all=All Flash Contents
+nodemcuv2.menu.wipe.all.upload.erase_cmd=erase_flash
+nodemcuv2.menu.baud.115200=115200
+nodemcuv2.menu.baud.115200.upload.speed=115200
+nodemcuv2.menu.baud.57600=57600
+nodemcuv2.menu.baud.57600.upload.speed=57600
+nodemcuv2.menu.baud.230400.linux=230400
+nodemcuv2.menu.baud.230400.macosx=230400
+nodemcuv2.menu.baud.230400.upload.speed=230400
+nodemcuv2.menu.baud.256000.windows=256000
+nodemcuv2.menu.baud.256000.upload.speed=256000
+nodemcuv2.menu.baud.460800.linux=460800
+nodemcuv2.menu.baud.460800.macosx=460800
+nodemcuv2.menu.baud.460800.upload.speed=460800
+nodemcuv2.menu.baud.512000.windows=512000
+nodemcuv2.menu.baud.512000.upload.speed=512000
+nodemcuv2.menu.baud.921600=921600
+nodemcuv2.menu.baud.921600.upload.speed=921600
+nodemcuv2.menu.baud.3000000=3000000
+nodemcuv2.menu.baud.3000000.upload.speed=3000000
+nodemcuv2.menu.eesz.autoflash=Mapping defined by Hardware and Sketch
+nodemcuv2.menu.eesz.autoflash.build.flash_size=16M
+nodemcuv2.menu.eesz.autoflash.build.flash_ld=eagle.flash.auto.ld
+nodemcuv2.menu.eesz.autoflash.build.extra_flags=-DFLASH_MAP_SUPPORT=1
+nodemcuv2.menu.eesz.autoflash.upload.maximum_size=1044464
+nodemcuv2.menu.iramfloat.no=in IROM
+nodemcuv2.menu.iramfloat.no.build.iramfloat=-DFP_IN_IROM
+nodemcuv2.menu.iramfloat.yes=allowed in ISR
+nodemcuv2.menu.iramfloat.yes.build.iramfloat=-DFP_IN_IRAM
##############################################################
modwifi.name=Olimex MOD-WIFI-ESP8266(-DEV)
-
+modwifi.build.board=MOD_WIFI_ESP8266
+modwifi.build.variant=modwifi
modwifi.upload.tool=esptool
-modwifi.upload.speed=115200
-modwifi.upload.resetmethod=ck
-modwifi.upload.maximum_size=1044464
modwifi.upload.maximum_data_size=81920
modwifi.upload.wait_for_upload_port=true
+modwifi.upload.erase_cmd=
modwifi.serial.disableDTR=true
modwifi.serial.disableRTS=true
-
modwifi.build.mcu=esp8266
-modwifi.build.f_cpu=80000000L
-modwifi.build.board=MOD_WIFI_ESP8266
modwifi.build.core=esp8266
-modwifi.build.variant=generic
-# Winbond W25Q16 flash
-modwifi.build.flash_mode=qio
-modwifi.build.flash_size=2M
-modwifi.build.flash_freq=40
-modwifi.build.flash_ld=eagle.flash.2m.ld
-modwifi.build.spiffs_start=0x100000
-modwifi.build.spiffs_end=0x1FB000
modwifi.build.spiffs_pagesize=256
-modwifi.build.spiffs_blocksize=8192
+modwifi.build.debug_optim=
modwifi.build.debug_port=
modwifi.build.debug_level=
+modwifi.menu.xtal.80=80 MHz
+modwifi.menu.xtal.80.build.f_cpu=80000000L
+modwifi.menu.xtal.160=160 MHz
+modwifi.menu.xtal.160.build.f_cpu=160000000L
+modwifi.menu.vt.flash=Flash
+modwifi.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+modwifi.menu.vt.heap=Heap
+modwifi.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+modwifi.menu.vt.iram=IRAM
+modwifi.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+modwifi.menu.exception.disabled=Disabled (new aborts on oom)
+modwifi.menu.exception.disabled.build.exception_flags=-fno-exceptions
+modwifi.menu.exception.disabled.build.stdcpp_lib=-lstdc++
+modwifi.menu.exception.enabled=Enabled
+modwifi.menu.exception.enabled.build.exception_flags=-fexceptions
+modwifi.menu.exception.enabled.build.stdcpp_lib=-lstdc++-exc
+modwifi.menu.stacksmash.disabled=Disabled
+modwifi.menu.stacksmash.disabled.build.stacksmash_flags=
+modwifi.menu.stacksmash.enabled=Enabled
+modwifi.menu.stacksmash.enabled.build.stacksmash_flags=-fstack-protector
+modwifi.menu.ssl.all=All SSL ciphers (most compatible)
+modwifi.menu.ssl.all.build.sslflags=
+modwifi.menu.ssl.basic=Basic SSL ciphers (lower ROM use)
+modwifi.menu.ssl.basic.build.sslflags=-DBEARSSL_SSL_BASIC
+modwifi.menu.mmu.3232=32KB cache + 32KB IRAM (balanced)
+modwifi.menu.mmu.3232.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+modwifi.menu.mmu.4816=16KB cache + 48KB IRAM (IRAM)
+modwifi.menu.mmu.4816.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000
+modwifi.menu.mmu.4816H=16KB cache + 48KB IRAM and 2nd Heap (shared)
+modwifi.menu.mmu.4816H.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_IRAM_HEAP
+modwifi.menu.mmu.3216=16KB cache + 32KB IRAM + 16KB 2nd Heap (not shared)
+modwifi.menu.mmu.3216.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_SEC_HEAP=0x40108000 -DMMU_SEC_HEAP_SIZE=0x4000
+modwifi.menu.mmu.ext128k=128K Heap External 23LC1024
+modwifi.menu.mmu.ext128k.build.mmuflags=-DMMU_EXTERNAL_HEAP=128 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+modwifi.menu.mmu.ext8192k=8M w/256K Heap External 64 MBit PSRAM
+modwifi.menu.mmu.ext8192k.build.mmuflags=-DMMU_EXTERNAL_HEAP=256 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+modwifi.menu.non32xfer.fast=Use pgm_read macros for IRAM/PROGMEM
+modwifi.menu.non32xfer.fast.build.non32xferflags=
+modwifi.menu.non32xfer.safe=Byte/Word access to IRAM/PROGMEM (very slow)
+modwifi.menu.non32xfer.safe.build.non32xferflags=-DNON32XFER_HANDLER
+modwifi.menu.ResetMethod.nodemcu=dtr (aka nodemcu)
+modwifi.menu.ResetMethod.nodemcu.upload.resetmethod=--before default_reset --after hard_reset
+modwifi.menu.ResetMethod.ck=no dtr (aka ck)
+modwifi.menu.ResetMethod.ck.upload.resetmethod=--before no_reset --after soft_reset
+modwifi.menu.ResetMethod.nodtr_nosync=no dtr, no_sync
+modwifi.menu.ResetMethod.nodtr_nosync.upload.resetmethod=--before no_reset_no_sync --after soft_reset
+modwifi.menu.FlashMode.dout=DOUT (compatible)
+modwifi.menu.FlashMode.dout.build.flash_mode=dout
+modwifi.menu.FlashMode.dout.build.flash_flags=-DFLASHMODE_DOUT
+modwifi.menu.FlashMode.dio=DIO
+modwifi.menu.FlashMode.dio.build.flash_mode=dio
+modwifi.menu.FlashMode.dio.build.flash_flags=-DFLASHMODE_DIO
+modwifi.menu.FlashMode.qout=QOUT
+modwifi.menu.FlashMode.qout.build.flash_mode=qout
+modwifi.menu.FlashMode.qout.build.flash_flags=-DFLASHMODE_QOUT
+modwifi.menu.FlashMode.qio=QIO (fast)
+modwifi.menu.FlashMode.qio.build.flash_mode=qio
+modwifi.menu.FlashMode.qio.build.flash_flags=-DFLASHMODE_QIO
+modwifi.build.flash_freq=40
+modwifi.menu.eesz.2M64=2MB (FS:64KB OTA:~992KB)
+modwifi.menu.eesz.2M64.build.flash_size=2M
+modwifi.menu.eesz.2M64.build.flash_ld=eagle.flash.2m64.ld
+modwifi.menu.eesz.2M64.build.spiffs_pagesize=256
+modwifi.menu.eesz.2M64.build.rfcal_addr=0x1FC000
+modwifi.menu.eesz.2M64.build.spiffs_start=0x1F0000
+modwifi.menu.eesz.2M64.build.spiffs_end=0x1FB000
+modwifi.menu.eesz.2M64.build.spiffs_blocksize=4096
+modwifi.menu.eesz.2M128=2MB (FS:128KB OTA:~960KB)
+modwifi.menu.eesz.2M128.build.flash_size=2M
+modwifi.menu.eesz.2M128.build.flash_ld=eagle.flash.2m128.ld
+modwifi.menu.eesz.2M128.build.spiffs_pagesize=256
+modwifi.menu.eesz.2M128.build.rfcal_addr=0x1FC000
+modwifi.menu.eesz.2M128.build.spiffs_start=0x1E0000
+modwifi.menu.eesz.2M128.build.spiffs_end=0x1FB000
+modwifi.menu.eesz.2M128.build.spiffs_blocksize=4096
+modwifi.menu.eesz.2M256=2MB (FS:256KB OTA:~896KB)
+modwifi.menu.eesz.2M256.build.flash_size=2M
+modwifi.menu.eesz.2M256.build.flash_ld=eagle.flash.2m256.ld
+modwifi.menu.eesz.2M256.build.spiffs_pagesize=256
+modwifi.menu.eesz.2M256.build.rfcal_addr=0x1FC000
+modwifi.menu.eesz.2M256.build.spiffs_start=0x1C0000
+modwifi.menu.eesz.2M256.build.spiffs_end=0x1FB000
+modwifi.menu.eesz.2M256.build.spiffs_blocksize=4096
+modwifi.menu.eesz.2M512=2MB (FS:512KB OTA:~768KB)
+modwifi.menu.eesz.2M512.build.flash_size=2M
+modwifi.menu.eesz.2M512.build.flash_ld=eagle.flash.2m512.ld
+modwifi.menu.eesz.2M512.build.spiffs_pagesize=256
+modwifi.menu.eesz.2M512.build.rfcal_addr=0x1FC000
+modwifi.menu.eesz.2M512.build.spiffs_start=0x180000
+modwifi.menu.eesz.2M512.build.spiffs_end=0x1FA000
+modwifi.menu.eesz.2M512.build.spiffs_blocksize=8192
+modwifi.menu.eesz.2M1M=2MB (FS:1MB OTA:~512KB)
+modwifi.menu.eesz.2M1M.build.flash_size=2M
+modwifi.menu.eesz.2M1M.build.flash_ld=eagle.flash.2m1m.ld
+modwifi.menu.eesz.2M1M.build.spiffs_pagesize=256
+modwifi.menu.eesz.2M1M.build.rfcal_addr=0x1FC000
+modwifi.menu.eesz.2M1M.build.spiffs_start=0x100000
+modwifi.menu.eesz.2M1M.build.spiffs_end=0x1FA000
+modwifi.menu.eesz.2M1M.build.spiffs_blocksize=8192
+modwifi.menu.eesz.2M=2MB (FS:none OTA:~1019KB)
+modwifi.menu.eesz.2M.build.flash_size=2M
+modwifi.menu.eesz.2M.build.flash_ld=eagle.flash.2m.ld
+modwifi.menu.eesz.2M.build.spiffs_pagesize=256
+modwifi.menu.eesz.2M.build.rfcal_addr=0x1FC000
+modwifi.menu.ip.lm2f=v2 Lower Memory
+modwifi.menu.ip.lm2f.build.lwip_include=lwip2/include
+modwifi.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+modwifi.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+modwifi.menu.ip.hb2f=v2 Higher Bandwidth
+modwifi.menu.ip.hb2f.build.lwip_include=lwip2/include
+modwifi.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+modwifi.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+modwifi.menu.ip.lm2n=v2 Lower Memory (no features)
+modwifi.menu.ip.lm2n.build.lwip_include=lwip2/include
+modwifi.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+modwifi.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+modwifi.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+modwifi.menu.ip.hb2n.build.lwip_include=lwip2/include
+modwifi.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+modwifi.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+modwifi.menu.ip.lm6f=v2 IPv6 Lower Memory
+modwifi.menu.ip.lm6f.build.lwip_include=lwip2/include
+modwifi.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+modwifi.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+modwifi.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+modwifi.menu.ip.hb6f.build.lwip_include=lwip2/include
+modwifi.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+modwifi.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+modwifi.menu.dbg.Disabled=Disabled
+modwifi.menu.dbg.Disabled.build.debug_port=
+modwifi.menu.dbg.Serial=Serial
+modwifi.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+modwifi.menu.dbg.Serial1=Serial1
+modwifi.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+modwifi.menu.lvl.None____=None
+modwifi.menu.lvl.None____.build.debug_level=
+modwifi.menu.optim.Smallest=None
+modwifi.menu.optim.Smallest.build.debug_optim=-Os
+modwifi.menu.optim.Lite=Lite
+modwifi.menu.optim.Lite.build.debug_optim=-Os -fno-optimize-sibling-calls
+modwifi.menu.optim.Full=Optimum
+modwifi.menu.optim.Full.build.debug_optim=-Og
+modwifi.menu.lvl.SSL=SSL
+modwifi.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+modwifi.menu.lvl.TLS_MEM=TLS_MEM
+modwifi.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+modwifi.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+modwifi.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+modwifi.menu.lvl.HTTP_SERVER=HTTP_SERVER
+modwifi.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+modwifi.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+modwifi.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+modwifi.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+modwifi.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+modwifi.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+modwifi.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+modwifi.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+modwifi.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+modwifi.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+modwifi.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+modwifi.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+modwifi.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+modwifi.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+modwifi.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+modwifi.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+modwifi.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+modwifi.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+modwifi.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+modwifi.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+modwifi.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+modwifi.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+modwifi.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+modwifi.menu.lvl.CORE=CORE
+modwifi.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+modwifi.menu.lvl.WIFI=WIFI
+modwifi.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+modwifi.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+modwifi.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+modwifi.menu.lvl.UPDATER=UPDATER
+modwifi.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+modwifi.menu.lvl.OTA=OTA
+modwifi.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+modwifi.menu.lvl.OOM=OOM
+modwifi.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+modwifi.menu.lvl.MDNS=MDNS
+modwifi.menu.lvl.MDNS.build.debug_level= -DDEBUG_ESP_MDNS
+modwifi.menu.lvl.HWDT=HWDT
+modwifi.menu.lvl.HWDT.build.debug_level= -DDEBUG_ESP_HWDT
+modwifi.menu.lvl.HWDT_NOEXTRA4K=HWDT_NOEXTRA4K
+modwifi.menu.lvl.HWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_HWDT_NOEXTRA4K
+modwifi.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+modwifi.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+modwifi.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+modwifi.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+modwifi.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+modwifi.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+modwifi.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+modwifi.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+modwifi.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+modwifi.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+modwifi.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+modwifi.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+modwifi.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+modwifi.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+modwifi.menu.wipe.none=Only Sketch
+modwifi.menu.wipe.none.upload.erase_cmd=
+modwifi.menu.wipe.sdk=Sketch + WiFi Settings
+modwifi.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
+modwifi.menu.wipe.all=All Flash Contents
+modwifi.menu.wipe.all.upload.erase_cmd=erase_flash
+modwifi.menu.baud.115200=115200
+modwifi.menu.baud.115200.upload.speed=115200
+modwifi.menu.baud.57600=57600
+modwifi.menu.baud.57600.upload.speed=57600
+modwifi.menu.baud.230400.linux=230400
+modwifi.menu.baud.230400.macosx=230400
+modwifi.menu.baud.230400.upload.speed=230400
+modwifi.menu.baud.256000.windows=256000
+modwifi.menu.baud.256000.upload.speed=256000
+modwifi.menu.baud.460800.linux=460800
+modwifi.menu.baud.460800.macosx=460800
+modwifi.menu.baud.460800.upload.speed=460800
+modwifi.menu.baud.512000.windows=512000
+modwifi.menu.baud.512000.upload.speed=512000
+modwifi.menu.baud.921600=921600
+modwifi.menu.baud.921600.upload.speed=921600
+modwifi.menu.baud.3000000=3000000
+modwifi.menu.baud.3000000.upload.speed=3000000
+modwifi.menu.eesz.autoflash=Mapping defined by Hardware and Sketch
+modwifi.menu.eesz.autoflash.build.flash_size=16M
+modwifi.menu.eesz.autoflash.build.flash_ld=eagle.flash.auto.ld
+modwifi.menu.eesz.autoflash.build.extra_flags=-DFLASH_MAP_SUPPORT=1
+modwifi.menu.eesz.autoflash.upload.maximum_size=1044464
+modwifi.menu.iramfloat.no=in IROM
+modwifi.menu.iramfloat.no.build.iramfloat=-DFP_IN_IROM
+modwifi.menu.iramfloat.yes=allowed in ISR
+modwifi.menu.iramfloat.yes.build.iramfloat=-DFP_IN_IRAM
+
+##############################################################
+phoenix_v1.name=Phoenix 1.0
+phoenix_v1.build.board=ESP8266_PHOENIX_V1
+phoenix_v1.build.variant=phoenix_v1
+phoenix_v1.upload.tool=esptool
+phoenix_v1.upload.maximum_data_size=81920
+phoenix_v1.upload.wait_for_upload_port=true
+phoenix_v1.upload.erase_cmd=
+phoenix_v1.serial.disableDTR=true
+phoenix_v1.serial.disableRTS=true
+phoenix_v1.build.mcu=esp8266
+phoenix_v1.build.core=esp8266
+phoenix_v1.build.spiffs_pagesize=256
+phoenix_v1.build.debug_optim=
+phoenix_v1.build.debug_port=
+phoenix_v1.build.debug_level=
+phoenix_v1.menu.xtal.80=80 MHz
+phoenix_v1.menu.xtal.80.build.f_cpu=80000000L
+phoenix_v1.menu.xtal.160=160 MHz
+phoenix_v1.menu.xtal.160.build.f_cpu=160000000L
+phoenix_v1.menu.vt.flash=Flash
+phoenix_v1.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+phoenix_v1.menu.vt.heap=Heap
+phoenix_v1.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+phoenix_v1.menu.vt.iram=IRAM
+phoenix_v1.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+phoenix_v1.menu.exception.disabled=Disabled (new aborts on oom)
+phoenix_v1.menu.exception.disabled.build.exception_flags=-fno-exceptions
+phoenix_v1.menu.exception.disabled.build.stdcpp_lib=-lstdc++
+phoenix_v1.menu.exception.enabled=Enabled
+phoenix_v1.menu.exception.enabled.build.exception_flags=-fexceptions
+phoenix_v1.menu.exception.enabled.build.stdcpp_lib=-lstdc++-exc
+phoenix_v1.menu.stacksmash.disabled=Disabled
+phoenix_v1.menu.stacksmash.disabled.build.stacksmash_flags=
+phoenix_v1.menu.stacksmash.enabled=Enabled
+phoenix_v1.menu.stacksmash.enabled.build.stacksmash_flags=-fstack-protector
+phoenix_v1.menu.ssl.all=All SSL ciphers (most compatible)
+phoenix_v1.menu.ssl.all.build.sslflags=
+phoenix_v1.menu.ssl.basic=Basic SSL ciphers (lower ROM use)
+phoenix_v1.menu.ssl.basic.build.sslflags=-DBEARSSL_SSL_BASIC
+phoenix_v1.menu.mmu.3232=32KB cache + 32KB IRAM (balanced)
+phoenix_v1.menu.mmu.3232.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+phoenix_v1.menu.mmu.4816=16KB cache + 48KB IRAM (IRAM)
+phoenix_v1.menu.mmu.4816.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000
+phoenix_v1.menu.mmu.4816H=16KB cache + 48KB IRAM and 2nd Heap (shared)
+phoenix_v1.menu.mmu.4816H.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_IRAM_HEAP
+phoenix_v1.menu.mmu.3216=16KB cache + 32KB IRAM + 16KB 2nd Heap (not shared)
+phoenix_v1.menu.mmu.3216.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_SEC_HEAP=0x40108000 -DMMU_SEC_HEAP_SIZE=0x4000
+phoenix_v1.menu.mmu.ext128k=128K Heap External 23LC1024
+phoenix_v1.menu.mmu.ext128k.build.mmuflags=-DMMU_EXTERNAL_HEAP=128 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+phoenix_v1.menu.mmu.ext8192k=8M w/256K Heap External 64 MBit PSRAM
+phoenix_v1.menu.mmu.ext8192k.build.mmuflags=-DMMU_EXTERNAL_HEAP=256 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+phoenix_v1.menu.non32xfer.fast=Use pgm_read macros for IRAM/PROGMEM
+phoenix_v1.menu.non32xfer.fast.build.non32xferflags=
+phoenix_v1.menu.non32xfer.safe=Byte/Word access to IRAM/PROGMEM (very slow)
+phoenix_v1.menu.non32xfer.safe.build.non32xferflags=-DNON32XFER_HANDLER
+phoenix_v1.build.flash_mode=dio
+phoenix_v1.build.flash_flags=-DFLASHMODE_DIO
+phoenix_v1.build.flash_freq=40
+phoenix_v1.menu.eesz.4M2M=4MB (FS:2MB OTA:~1019KB)
+phoenix_v1.menu.eesz.4M2M.build.flash_size=4M
+phoenix_v1.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
+phoenix_v1.menu.eesz.4M2M.build.spiffs_pagesize=256
+phoenix_v1.menu.eesz.4M2M.build.rfcal_addr=0x3FC000
+phoenix_v1.menu.eesz.4M2M.build.spiffs_start=0x200000
+phoenix_v1.menu.eesz.4M2M.build.spiffs_end=0x3FA000
+phoenix_v1.menu.eesz.4M2M.build.spiffs_blocksize=8192
+phoenix_v1.menu.eesz.4M3M=4MB (FS:3MB OTA:~512KB)
+phoenix_v1.menu.eesz.4M3M.build.flash_size=4M
+phoenix_v1.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
+phoenix_v1.menu.eesz.4M3M.build.spiffs_pagesize=256
+phoenix_v1.menu.eesz.4M3M.build.rfcal_addr=0x3FC000
+phoenix_v1.menu.eesz.4M3M.build.spiffs_start=0x100000
+phoenix_v1.menu.eesz.4M3M.build.spiffs_end=0x3FA000
+phoenix_v1.menu.eesz.4M3M.build.spiffs_blocksize=8192
+phoenix_v1.menu.eesz.4M1M=4MB (FS:1MB OTA:~1019KB)
+phoenix_v1.menu.eesz.4M1M.build.flash_size=4M
+phoenix_v1.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
+phoenix_v1.menu.eesz.4M1M.build.spiffs_pagesize=256
+phoenix_v1.menu.eesz.4M1M.build.rfcal_addr=0x3FC000
+phoenix_v1.menu.eesz.4M1M.build.spiffs_start=0x300000
+phoenix_v1.menu.eesz.4M1M.build.spiffs_end=0x3FA000
+phoenix_v1.menu.eesz.4M1M.build.spiffs_blocksize=8192
+phoenix_v1.menu.eesz.4M=4MB (FS:none OTA:~1019KB)
+phoenix_v1.menu.eesz.4M.build.flash_size=4M
+phoenix_v1.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
+phoenix_v1.menu.eesz.4M.build.spiffs_pagesize=256
+phoenix_v1.menu.eesz.4M.build.rfcal_addr=0x3FC000
+phoenix_v1.menu.ResetMethod.nodemcu=dtr (aka nodemcu)
+phoenix_v1.menu.ResetMethod.nodemcu.upload.resetmethod=--before default_reset --after hard_reset
+phoenix_v1.menu.ResetMethod.ck=no dtr (aka ck)
+phoenix_v1.menu.ResetMethod.ck.upload.resetmethod=--before no_reset --after soft_reset
+phoenix_v1.menu.ip.lm2f=v2 Lower Memory
+phoenix_v1.menu.ip.lm2f.build.lwip_include=lwip2/include
+phoenix_v1.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+phoenix_v1.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+phoenix_v1.menu.ip.hb2f=v2 Higher Bandwidth
+phoenix_v1.menu.ip.hb2f.build.lwip_include=lwip2/include
+phoenix_v1.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+phoenix_v1.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+phoenix_v1.menu.ip.lm2n=v2 Lower Memory (no features)
+phoenix_v1.menu.ip.lm2n.build.lwip_include=lwip2/include
+phoenix_v1.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+phoenix_v1.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+phoenix_v1.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+phoenix_v1.menu.ip.hb2n.build.lwip_include=lwip2/include
+phoenix_v1.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+phoenix_v1.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+phoenix_v1.menu.ip.lm6f=v2 IPv6 Lower Memory
+phoenix_v1.menu.ip.lm6f.build.lwip_include=lwip2/include
+phoenix_v1.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+phoenix_v1.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+phoenix_v1.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+phoenix_v1.menu.ip.hb6f.build.lwip_include=lwip2/include
+phoenix_v1.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+phoenix_v1.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+phoenix_v1.menu.dbg.Disabled=Disabled
+phoenix_v1.menu.dbg.Disabled.build.debug_port=
+phoenix_v1.menu.dbg.Serial=Serial
+phoenix_v1.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+phoenix_v1.menu.dbg.Serial1=Serial1
+phoenix_v1.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+phoenix_v1.menu.lvl.None____=None
+phoenix_v1.menu.lvl.None____.build.debug_level=
+phoenix_v1.menu.optim.Smallest=None
+phoenix_v1.menu.optim.Smallest.build.debug_optim=-Os
+phoenix_v1.menu.optim.Lite=Lite
+phoenix_v1.menu.optim.Lite.build.debug_optim=-Os -fno-optimize-sibling-calls
+phoenix_v1.menu.optim.Full=Optimum
+phoenix_v1.menu.optim.Full.build.debug_optim=-Og
+phoenix_v1.menu.lvl.SSL=SSL
+phoenix_v1.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+phoenix_v1.menu.lvl.TLS_MEM=TLS_MEM
+phoenix_v1.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+phoenix_v1.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+phoenix_v1.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+phoenix_v1.menu.lvl.HTTP_SERVER=HTTP_SERVER
+phoenix_v1.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+phoenix_v1.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+phoenix_v1.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+phoenix_v1.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+phoenix_v1.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+phoenix_v1.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+phoenix_v1.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+phoenix_v1.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+phoenix_v1.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+phoenix_v1.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+phoenix_v1.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+phoenix_v1.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+phoenix_v1.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+phoenix_v1.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+phoenix_v1.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+phoenix_v1.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+phoenix_v1.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+phoenix_v1.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+phoenix_v1.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+phoenix_v1.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+phoenix_v1.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+phoenix_v1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+phoenix_v1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+phoenix_v1.menu.lvl.CORE=CORE
+phoenix_v1.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+phoenix_v1.menu.lvl.WIFI=WIFI
+phoenix_v1.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+phoenix_v1.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+phoenix_v1.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+phoenix_v1.menu.lvl.UPDATER=UPDATER
+phoenix_v1.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+phoenix_v1.menu.lvl.OTA=OTA
+phoenix_v1.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+phoenix_v1.menu.lvl.OOM=OOM
+phoenix_v1.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+phoenix_v1.menu.lvl.MDNS=MDNS
+phoenix_v1.menu.lvl.MDNS.build.debug_level= -DDEBUG_ESP_MDNS
+phoenix_v1.menu.lvl.HWDT=HWDT
+phoenix_v1.menu.lvl.HWDT.build.debug_level= -DDEBUG_ESP_HWDT
+phoenix_v1.menu.lvl.HWDT_NOEXTRA4K=HWDT_NOEXTRA4K
+phoenix_v1.menu.lvl.HWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_HWDT_NOEXTRA4K
+phoenix_v1.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+phoenix_v1.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+phoenix_v1.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+phoenix_v1.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+phoenix_v1.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+phoenix_v1.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+phoenix_v1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+phoenix_v1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+phoenix_v1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+phoenix_v1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+phoenix_v1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+phoenix_v1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+phoenix_v1.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+phoenix_v1.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+phoenix_v1.menu.wipe.none=Only Sketch
+phoenix_v1.menu.wipe.none.upload.erase_cmd=
+phoenix_v1.menu.wipe.sdk=Sketch + WiFi Settings
+phoenix_v1.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
+phoenix_v1.menu.wipe.all=All Flash Contents
+phoenix_v1.menu.wipe.all.upload.erase_cmd=erase_flash
+phoenix_v1.menu.baud.115200=115200
+phoenix_v1.menu.baud.115200.upload.speed=115200
+phoenix_v1.menu.baud.57600=57600
+phoenix_v1.menu.baud.57600.upload.speed=57600
+phoenix_v1.menu.baud.230400.linux=230400
+phoenix_v1.menu.baud.230400.macosx=230400
+phoenix_v1.menu.baud.230400.upload.speed=230400
+phoenix_v1.menu.baud.256000.windows=256000
+phoenix_v1.menu.baud.256000.upload.speed=256000
+phoenix_v1.menu.baud.460800.linux=460800
+phoenix_v1.menu.baud.460800.macosx=460800
+phoenix_v1.menu.baud.460800.upload.speed=460800
+phoenix_v1.menu.baud.512000.windows=512000
+phoenix_v1.menu.baud.512000.upload.speed=512000
+phoenix_v1.menu.baud.921600=921600
+phoenix_v1.menu.baud.921600.upload.speed=921600
+phoenix_v1.menu.baud.3000000=3000000
+phoenix_v1.menu.baud.3000000.upload.speed=3000000
+phoenix_v1.menu.eesz.autoflash=Mapping defined by Hardware and Sketch
+phoenix_v1.menu.eesz.autoflash.build.flash_size=16M
+phoenix_v1.menu.eesz.autoflash.build.flash_ld=eagle.flash.auto.ld
+phoenix_v1.menu.eesz.autoflash.build.extra_flags=-DFLASH_MAP_SUPPORT=1
+phoenix_v1.menu.eesz.autoflash.upload.maximum_size=1044464
+phoenix_v1.menu.iramfloat.no=in IROM
+phoenix_v1.menu.iramfloat.no.build.iramfloat=-DFP_IN_IROM
+phoenix_v1.menu.iramfloat.yes=allowed in ISR
+phoenix_v1.menu.iramfloat.yes.build.iramfloat=-DFP_IN_IRAM
-modwifi.menu.CpuFrequency.80=80 MHz
-modwifi.menu.CpuFrequency.80.build.f_cpu=80000000L
-modwifi.menu.CpuFrequency.160=160 MHz
-modwifi.menu.CpuFrequency.160.build.f_cpu=160000000L
+##############################################################
+phoenix_v2.name=Phoenix 2.0
+phoenix_v2.build.board=ESP8266_PHOENIX_V2
+phoenix_v2.build.variant=phoenix_v2
+phoenix_v2.upload.tool=esptool
+phoenix_v2.upload.maximum_data_size=81920
+phoenix_v2.upload.wait_for_upload_port=true
+phoenix_v2.upload.erase_cmd=
+phoenix_v2.serial.disableDTR=true
+phoenix_v2.serial.disableRTS=true
+phoenix_v2.build.mcu=esp8266
+phoenix_v2.build.core=esp8266
+phoenix_v2.build.spiffs_pagesize=256
+phoenix_v2.build.debug_optim=
+phoenix_v2.build.debug_port=
+phoenix_v2.build.debug_level=
+phoenix_v2.menu.xtal.80=80 MHz
+phoenix_v2.menu.xtal.80.build.f_cpu=80000000L
+phoenix_v2.menu.xtal.160=160 MHz
+phoenix_v2.menu.xtal.160.build.f_cpu=160000000L
+phoenix_v2.menu.vt.flash=Flash
+phoenix_v2.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+phoenix_v2.menu.vt.heap=Heap
+phoenix_v2.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+phoenix_v2.menu.vt.iram=IRAM
+phoenix_v2.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+phoenix_v2.menu.exception.disabled=Disabled (new aborts on oom)
+phoenix_v2.menu.exception.disabled.build.exception_flags=-fno-exceptions
+phoenix_v2.menu.exception.disabled.build.stdcpp_lib=-lstdc++
+phoenix_v2.menu.exception.enabled=Enabled
+phoenix_v2.menu.exception.enabled.build.exception_flags=-fexceptions
+phoenix_v2.menu.exception.enabled.build.stdcpp_lib=-lstdc++-exc
+phoenix_v2.menu.stacksmash.disabled=Disabled
+phoenix_v2.menu.stacksmash.disabled.build.stacksmash_flags=
+phoenix_v2.menu.stacksmash.enabled=Enabled
+phoenix_v2.menu.stacksmash.enabled.build.stacksmash_flags=-fstack-protector
+phoenix_v2.menu.ssl.all=All SSL ciphers (most compatible)
+phoenix_v2.menu.ssl.all.build.sslflags=
+phoenix_v2.menu.ssl.basic=Basic SSL ciphers (lower ROM use)
+phoenix_v2.menu.ssl.basic.build.sslflags=-DBEARSSL_SSL_BASIC
+phoenix_v2.menu.mmu.3232=32KB cache + 32KB IRAM (balanced)
+phoenix_v2.menu.mmu.3232.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+phoenix_v2.menu.mmu.4816=16KB cache + 48KB IRAM (IRAM)
+phoenix_v2.menu.mmu.4816.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000
+phoenix_v2.menu.mmu.4816H=16KB cache + 48KB IRAM and 2nd Heap (shared)
+phoenix_v2.menu.mmu.4816H.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_IRAM_HEAP
+phoenix_v2.menu.mmu.3216=16KB cache + 32KB IRAM + 16KB 2nd Heap (not shared)
+phoenix_v2.menu.mmu.3216.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_SEC_HEAP=0x40108000 -DMMU_SEC_HEAP_SIZE=0x4000
+phoenix_v2.menu.mmu.ext128k=128K Heap External 23LC1024
+phoenix_v2.menu.mmu.ext128k.build.mmuflags=-DMMU_EXTERNAL_HEAP=128 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+phoenix_v2.menu.mmu.ext8192k=8M w/256K Heap External 64 MBit PSRAM
+phoenix_v2.menu.mmu.ext8192k.build.mmuflags=-DMMU_EXTERNAL_HEAP=256 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+phoenix_v2.menu.non32xfer.fast=Use pgm_read macros for IRAM/PROGMEM
+phoenix_v2.menu.non32xfer.fast.build.non32xferflags=
+phoenix_v2.menu.non32xfer.safe=Byte/Word access to IRAM/PROGMEM (very slow)
+phoenix_v2.menu.non32xfer.safe.build.non32xferflags=-DNON32XFER_HANDLER
+phoenix_v2.build.flash_mode=dio
+phoenix_v2.build.flash_flags=-DFLASHMODE_DIO
+phoenix_v2.build.flash_freq=40
+phoenix_v2.menu.eesz.4M2M=4MB (FS:2MB OTA:~1019KB)
+phoenix_v2.menu.eesz.4M2M.build.flash_size=4M
+phoenix_v2.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
+phoenix_v2.menu.eesz.4M2M.build.spiffs_pagesize=256
+phoenix_v2.menu.eesz.4M2M.build.rfcal_addr=0x3FC000
+phoenix_v2.menu.eesz.4M2M.build.spiffs_start=0x200000
+phoenix_v2.menu.eesz.4M2M.build.spiffs_end=0x3FA000
+phoenix_v2.menu.eesz.4M2M.build.spiffs_blocksize=8192
+phoenix_v2.menu.eesz.4M3M=4MB (FS:3MB OTA:~512KB)
+phoenix_v2.menu.eesz.4M3M.build.flash_size=4M
+phoenix_v2.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
+phoenix_v2.menu.eesz.4M3M.build.spiffs_pagesize=256
+phoenix_v2.menu.eesz.4M3M.build.rfcal_addr=0x3FC000
+phoenix_v2.menu.eesz.4M3M.build.spiffs_start=0x100000
+phoenix_v2.menu.eesz.4M3M.build.spiffs_end=0x3FA000
+phoenix_v2.menu.eesz.4M3M.build.spiffs_blocksize=8192
+phoenix_v2.menu.eesz.4M1M=4MB (FS:1MB OTA:~1019KB)
+phoenix_v2.menu.eesz.4M1M.build.flash_size=4M
+phoenix_v2.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
+phoenix_v2.menu.eesz.4M1M.build.spiffs_pagesize=256
+phoenix_v2.menu.eesz.4M1M.build.rfcal_addr=0x3FC000
+phoenix_v2.menu.eesz.4M1M.build.spiffs_start=0x300000
+phoenix_v2.menu.eesz.4M1M.build.spiffs_end=0x3FA000
+phoenix_v2.menu.eesz.4M1M.build.spiffs_blocksize=8192
+phoenix_v2.menu.eesz.4M=4MB (FS:none OTA:~1019KB)
+phoenix_v2.menu.eesz.4M.build.flash_size=4M
+phoenix_v2.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
+phoenix_v2.menu.eesz.4M.build.spiffs_pagesize=256
+phoenix_v2.menu.eesz.4M.build.rfcal_addr=0x3FC000
+phoenix_v2.menu.ResetMethod.nodemcu=dtr (aka nodemcu)
+phoenix_v2.menu.ResetMethod.nodemcu.upload.resetmethod=--before default_reset --after hard_reset
+phoenix_v2.menu.ResetMethod.ck=no dtr (aka ck)
+phoenix_v2.menu.ResetMethod.ck.upload.resetmethod=--before no_reset --after soft_reset
+phoenix_v2.menu.ip.lm2f=v2 Lower Memory
+phoenix_v2.menu.ip.lm2f.build.lwip_include=lwip2/include
+phoenix_v2.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+phoenix_v2.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+phoenix_v2.menu.ip.hb2f=v2 Higher Bandwidth
+phoenix_v2.menu.ip.hb2f.build.lwip_include=lwip2/include
+phoenix_v2.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+phoenix_v2.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+phoenix_v2.menu.ip.lm2n=v2 Lower Memory (no features)
+phoenix_v2.menu.ip.lm2n.build.lwip_include=lwip2/include
+phoenix_v2.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+phoenix_v2.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+phoenix_v2.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+phoenix_v2.menu.ip.hb2n.build.lwip_include=lwip2/include
+phoenix_v2.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+phoenix_v2.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+phoenix_v2.menu.ip.lm6f=v2 IPv6 Lower Memory
+phoenix_v2.menu.ip.lm6f.build.lwip_include=lwip2/include
+phoenix_v2.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+phoenix_v2.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+phoenix_v2.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+phoenix_v2.menu.ip.hb6f.build.lwip_include=lwip2/include
+phoenix_v2.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+phoenix_v2.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+phoenix_v2.menu.dbg.Disabled=Disabled
+phoenix_v2.menu.dbg.Disabled.build.debug_port=
+phoenix_v2.menu.dbg.Serial=Serial
+phoenix_v2.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+phoenix_v2.menu.dbg.Serial1=Serial1
+phoenix_v2.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+phoenix_v2.menu.lvl.None____=None
+phoenix_v2.menu.lvl.None____.build.debug_level=
+phoenix_v2.menu.optim.Smallest=None
+phoenix_v2.menu.optim.Smallest.build.debug_optim=-Os
+phoenix_v2.menu.optim.Lite=Lite
+phoenix_v2.menu.optim.Lite.build.debug_optim=-Os -fno-optimize-sibling-calls
+phoenix_v2.menu.optim.Full=Optimum
+phoenix_v2.menu.optim.Full.build.debug_optim=-Og
+phoenix_v2.menu.lvl.SSL=SSL
+phoenix_v2.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+phoenix_v2.menu.lvl.TLS_MEM=TLS_MEM
+phoenix_v2.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+phoenix_v2.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+phoenix_v2.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+phoenix_v2.menu.lvl.HTTP_SERVER=HTTP_SERVER
+phoenix_v2.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+phoenix_v2.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+phoenix_v2.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+phoenix_v2.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+phoenix_v2.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+phoenix_v2.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+phoenix_v2.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+phoenix_v2.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+phoenix_v2.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+phoenix_v2.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+phoenix_v2.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+phoenix_v2.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+phoenix_v2.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+phoenix_v2.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+phoenix_v2.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+phoenix_v2.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+phoenix_v2.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+phoenix_v2.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+phoenix_v2.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+phoenix_v2.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+phoenix_v2.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+phoenix_v2.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+phoenix_v2.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+phoenix_v2.menu.lvl.CORE=CORE
+phoenix_v2.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+phoenix_v2.menu.lvl.WIFI=WIFI
+phoenix_v2.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+phoenix_v2.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+phoenix_v2.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+phoenix_v2.menu.lvl.UPDATER=UPDATER
+phoenix_v2.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+phoenix_v2.menu.lvl.OTA=OTA
+phoenix_v2.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+phoenix_v2.menu.lvl.OOM=OOM
+phoenix_v2.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+phoenix_v2.menu.lvl.MDNS=MDNS
+phoenix_v2.menu.lvl.MDNS.build.debug_level= -DDEBUG_ESP_MDNS
+phoenix_v2.menu.lvl.HWDT=HWDT
+phoenix_v2.menu.lvl.HWDT.build.debug_level= -DDEBUG_ESP_HWDT
+phoenix_v2.menu.lvl.HWDT_NOEXTRA4K=HWDT_NOEXTRA4K
+phoenix_v2.menu.lvl.HWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_HWDT_NOEXTRA4K
+phoenix_v2.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+phoenix_v2.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+phoenix_v2.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+phoenix_v2.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+phoenix_v2.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+phoenix_v2.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+phoenix_v2.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+phoenix_v2.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+phoenix_v2.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+phoenix_v2.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+phoenix_v2.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+phoenix_v2.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+phoenix_v2.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+phoenix_v2.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+phoenix_v2.menu.wipe.none=Only Sketch
+phoenix_v2.menu.wipe.none.upload.erase_cmd=
+phoenix_v2.menu.wipe.sdk=Sketch + WiFi Settings
+phoenix_v2.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
+phoenix_v2.menu.wipe.all=All Flash Contents
+phoenix_v2.menu.wipe.all.upload.erase_cmd=erase_flash
+phoenix_v2.menu.baud.115200=115200
+phoenix_v2.menu.baud.115200.upload.speed=115200
+phoenix_v2.menu.baud.57600=57600
+phoenix_v2.menu.baud.57600.upload.speed=57600
+phoenix_v2.menu.baud.230400.linux=230400
+phoenix_v2.menu.baud.230400.macosx=230400
+phoenix_v2.menu.baud.230400.upload.speed=230400
+phoenix_v2.menu.baud.256000.windows=256000
+phoenix_v2.menu.baud.256000.upload.speed=256000
+phoenix_v2.menu.baud.460800.linux=460800
+phoenix_v2.menu.baud.460800.macosx=460800
+phoenix_v2.menu.baud.460800.upload.speed=460800
+phoenix_v2.menu.baud.512000.windows=512000
+phoenix_v2.menu.baud.512000.upload.speed=512000
+phoenix_v2.menu.baud.921600=921600
+phoenix_v2.menu.baud.921600.upload.speed=921600
+phoenix_v2.menu.baud.3000000=3000000
+phoenix_v2.menu.baud.3000000.upload.speed=3000000
+phoenix_v2.menu.eesz.autoflash=Mapping defined by Hardware and Sketch
+phoenix_v2.menu.eesz.autoflash.build.flash_size=16M
+phoenix_v2.menu.eesz.autoflash.build.flash_ld=eagle.flash.auto.ld
+phoenix_v2.menu.eesz.autoflash.build.extra_flags=-DFLASH_MAP_SUPPORT=1
+phoenix_v2.menu.eesz.autoflash.upload.maximum_size=1044464
+phoenix_v2.menu.iramfloat.no=in IROM
+phoenix_v2.menu.iramfloat.no.build.iramfloat=-DFP_IN_IROM
+phoenix_v2.menu.iramfloat.yes=allowed in ISR
+phoenix_v2.menu.iramfloat.yes.build.iramfloat=-DFP_IN_IRAM
-modwifi.menu.UploadSpeed.115200=115200
-modwifi.menu.UploadSpeed.115200.upload.speed=115200
-modwifi.menu.UploadSpeed.9600=9600
-modwifi.menu.UploadSpeed.9600.upload.speed=9600
-modwifi.menu.UploadSpeed.57600=57600
-modwifi.menu.UploadSpeed.57600.upload.speed=57600
-modwifi.menu.UploadSpeed.256000.windows=256000
-modwifi.menu.UploadSpeed.256000.upload.speed=256000
-modwifi.menu.UploadSpeed.230400.linux=230400
-modwifi.menu.UploadSpeed.230400.macosx=230400
-modwifi.menu.UploadSpeed.230400.macosx=230400
-modwifi.menu.UploadSpeed.230400.upload.speed=230400
-modwifi.menu.UploadSpeed.460800.linux=460800
-modwifi.menu.UploadSpeed.460800.macosx=460800
-modwifi.menu.UploadSpeed.460800.upload.speed=460800
-modwifi.menu.UploadSpeed.512000.windows=512000
-modwifi.menu.UploadSpeed.512000.upload.speed=512000
-modwifi.menu.UploadSpeed.921600=921600
-modwifi.menu.UploadSpeed.921600.upload.speed=921600
+##############################################################
+eduinowifi.name=Schirmilabs Eduino WiFi
+eduinowifi.build.board=ESP8266_SCHIRMILABS_EDUINO_WIFI
+eduinowifi.build.variant=eduinowifi
+eduinowifi.upload.tool=esptool
+eduinowifi.upload.maximum_data_size=81920
+eduinowifi.upload.wait_for_upload_port=true
+eduinowifi.upload.erase_cmd=
+eduinowifi.serial.disableDTR=true
+eduinowifi.serial.disableRTS=true
+eduinowifi.build.mcu=esp8266
+eduinowifi.build.core=esp8266
+eduinowifi.build.spiffs_pagesize=256
+eduinowifi.build.debug_optim=
+eduinowifi.build.debug_port=
+eduinowifi.build.debug_level=
+eduinowifi.menu.xtal.80=80 MHz
+eduinowifi.menu.xtal.80.build.f_cpu=80000000L
+eduinowifi.menu.xtal.160=160 MHz
+eduinowifi.menu.xtal.160.build.f_cpu=160000000L
+eduinowifi.menu.vt.flash=Flash
+eduinowifi.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+eduinowifi.menu.vt.heap=Heap
+eduinowifi.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+eduinowifi.menu.vt.iram=IRAM
+eduinowifi.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+eduinowifi.menu.exception.disabled=Disabled (new aborts on oom)
+eduinowifi.menu.exception.disabled.build.exception_flags=-fno-exceptions
+eduinowifi.menu.exception.disabled.build.stdcpp_lib=-lstdc++
+eduinowifi.menu.exception.enabled=Enabled
+eduinowifi.menu.exception.enabled.build.exception_flags=-fexceptions
+eduinowifi.menu.exception.enabled.build.stdcpp_lib=-lstdc++-exc
+eduinowifi.menu.stacksmash.disabled=Disabled
+eduinowifi.menu.stacksmash.disabled.build.stacksmash_flags=
+eduinowifi.menu.stacksmash.enabled=Enabled
+eduinowifi.menu.stacksmash.enabled.build.stacksmash_flags=-fstack-protector
+eduinowifi.menu.ssl.all=All SSL ciphers (most compatible)
+eduinowifi.menu.ssl.all.build.sslflags=
+eduinowifi.menu.ssl.basic=Basic SSL ciphers (lower ROM use)
+eduinowifi.menu.ssl.basic.build.sslflags=-DBEARSSL_SSL_BASIC
+eduinowifi.menu.mmu.3232=32KB cache + 32KB IRAM (balanced)
+eduinowifi.menu.mmu.3232.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+eduinowifi.menu.mmu.4816=16KB cache + 48KB IRAM (IRAM)
+eduinowifi.menu.mmu.4816.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000
+eduinowifi.menu.mmu.4816H=16KB cache + 48KB IRAM and 2nd Heap (shared)
+eduinowifi.menu.mmu.4816H.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_IRAM_HEAP
+eduinowifi.menu.mmu.3216=16KB cache + 32KB IRAM + 16KB 2nd Heap (not shared)
+eduinowifi.menu.mmu.3216.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_SEC_HEAP=0x40108000 -DMMU_SEC_HEAP_SIZE=0x4000
+eduinowifi.menu.mmu.ext128k=128K Heap External 23LC1024
+eduinowifi.menu.mmu.ext128k.build.mmuflags=-DMMU_EXTERNAL_HEAP=128 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+eduinowifi.menu.mmu.ext8192k=8M w/256K Heap External 64 MBit PSRAM
+eduinowifi.menu.mmu.ext8192k.build.mmuflags=-DMMU_EXTERNAL_HEAP=256 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+eduinowifi.menu.non32xfer.fast=Use pgm_read macros for IRAM/PROGMEM
+eduinowifi.menu.non32xfer.fast.build.non32xferflags=
+eduinowifi.menu.non32xfer.safe=Byte/Word access to IRAM/PROGMEM (very slow)
+eduinowifi.menu.non32xfer.safe.build.non32xferflags=-DNON32XFER_HANDLER
+eduinowifi.upload.resetmethod=--before default_reset --after hard_reset
+eduinowifi.build.flash_mode=dio
+eduinowifi.build.flash_flags=-DFLASHMODE_DIO
+eduinowifi.build.flash_freq=40
+eduinowifi.menu.eesz.4M2M=4MB (FS:2MB OTA:~1019KB)
+eduinowifi.menu.eesz.4M2M.build.flash_size=4M
+eduinowifi.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
+eduinowifi.menu.eesz.4M2M.build.spiffs_pagesize=256
+eduinowifi.menu.eesz.4M2M.build.rfcal_addr=0x3FC000
+eduinowifi.menu.eesz.4M2M.build.spiffs_start=0x200000
+eduinowifi.menu.eesz.4M2M.build.spiffs_end=0x3FA000
+eduinowifi.menu.eesz.4M2M.build.spiffs_blocksize=8192
+eduinowifi.menu.eesz.4M3M=4MB (FS:3MB OTA:~512KB)
+eduinowifi.menu.eesz.4M3M.build.flash_size=4M
+eduinowifi.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
+eduinowifi.menu.eesz.4M3M.build.spiffs_pagesize=256
+eduinowifi.menu.eesz.4M3M.build.rfcal_addr=0x3FC000
+eduinowifi.menu.eesz.4M3M.build.spiffs_start=0x100000
+eduinowifi.menu.eesz.4M3M.build.spiffs_end=0x3FA000
+eduinowifi.menu.eesz.4M3M.build.spiffs_blocksize=8192
+eduinowifi.menu.eesz.4M1M=4MB (FS:1MB OTA:~1019KB)
+eduinowifi.menu.eesz.4M1M.build.flash_size=4M
+eduinowifi.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
+eduinowifi.menu.eesz.4M1M.build.spiffs_pagesize=256
+eduinowifi.menu.eesz.4M1M.build.rfcal_addr=0x3FC000
+eduinowifi.menu.eesz.4M1M.build.spiffs_start=0x300000
+eduinowifi.menu.eesz.4M1M.build.spiffs_end=0x3FA000
+eduinowifi.menu.eesz.4M1M.build.spiffs_blocksize=8192
+eduinowifi.menu.eesz.4M=4MB (FS:none OTA:~1019KB)
+eduinowifi.menu.eesz.4M.build.flash_size=4M
+eduinowifi.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
+eduinowifi.menu.eesz.4M.build.spiffs_pagesize=256
+eduinowifi.menu.eesz.4M.build.rfcal_addr=0x3FC000
+eduinowifi.menu.ip.lm2f=v2 Lower Memory
+eduinowifi.menu.ip.lm2f.build.lwip_include=lwip2/include
+eduinowifi.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+eduinowifi.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+eduinowifi.menu.ip.hb2f=v2 Higher Bandwidth
+eduinowifi.menu.ip.hb2f.build.lwip_include=lwip2/include
+eduinowifi.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+eduinowifi.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+eduinowifi.menu.ip.lm2n=v2 Lower Memory (no features)
+eduinowifi.menu.ip.lm2n.build.lwip_include=lwip2/include
+eduinowifi.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+eduinowifi.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+eduinowifi.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+eduinowifi.menu.ip.hb2n.build.lwip_include=lwip2/include
+eduinowifi.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+eduinowifi.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+eduinowifi.menu.ip.lm6f=v2 IPv6 Lower Memory
+eduinowifi.menu.ip.lm6f.build.lwip_include=lwip2/include
+eduinowifi.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+eduinowifi.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+eduinowifi.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+eduinowifi.menu.ip.hb6f.build.lwip_include=lwip2/include
+eduinowifi.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+eduinowifi.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+eduinowifi.menu.dbg.Disabled=Disabled
+eduinowifi.menu.dbg.Disabled.build.debug_port=
+eduinowifi.menu.dbg.Serial=Serial
+eduinowifi.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+eduinowifi.menu.dbg.Serial1=Serial1
+eduinowifi.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+eduinowifi.menu.lvl.None____=None
+eduinowifi.menu.lvl.None____.build.debug_level=
+eduinowifi.menu.optim.Smallest=None
+eduinowifi.menu.optim.Smallest.build.debug_optim=-Os
+eduinowifi.menu.optim.Lite=Lite
+eduinowifi.menu.optim.Lite.build.debug_optim=-Os -fno-optimize-sibling-calls
+eduinowifi.menu.optim.Full=Optimum
+eduinowifi.menu.optim.Full.build.debug_optim=-Og
+eduinowifi.menu.lvl.SSL=SSL
+eduinowifi.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+eduinowifi.menu.lvl.TLS_MEM=TLS_MEM
+eduinowifi.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+eduinowifi.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+eduinowifi.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+eduinowifi.menu.lvl.HTTP_SERVER=HTTP_SERVER
+eduinowifi.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+eduinowifi.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+eduinowifi.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+eduinowifi.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+eduinowifi.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+eduinowifi.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+eduinowifi.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+eduinowifi.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+eduinowifi.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+eduinowifi.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+eduinowifi.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+eduinowifi.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+eduinowifi.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+eduinowifi.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+eduinowifi.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+eduinowifi.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+eduinowifi.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+eduinowifi.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+eduinowifi.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+eduinowifi.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+eduinowifi.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+eduinowifi.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+eduinowifi.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+eduinowifi.menu.lvl.CORE=CORE
+eduinowifi.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+eduinowifi.menu.lvl.WIFI=WIFI
+eduinowifi.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+eduinowifi.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+eduinowifi.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+eduinowifi.menu.lvl.UPDATER=UPDATER
+eduinowifi.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+eduinowifi.menu.lvl.OTA=OTA
+eduinowifi.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+eduinowifi.menu.lvl.OOM=OOM
+eduinowifi.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+eduinowifi.menu.lvl.MDNS=MDNS
+eduinowifi.menu.lvl.MDNS.build.debug_level= -DDEBUG_ESP_MDNS
+eduinowifi.menu.lvl.HWDT=HWDT
+eduinowifi.menu.lvl.HWDT.build.debug_level= -DDEBUG_ESP_HWDT
+eduinowifi.menu.lvl.HWDT_NOEXTRA4K=HWDT_NOEXTRA4K
+eduinowifi.menu.lvl.HWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_HWDT_NOEXTRA4K
+eduinowifi.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+eduinowifi.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+eduinowifi.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+eduinowifi.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+eduinowifi.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+eduinowifi.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+eduinowifi.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+eduinowifi.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+eduinowifi.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+eduinowifi.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+eduinowifi.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+eduinowifi.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+eduinowifi.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+eduinowifi.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+eduinowifi.menu.wipe.none=Only Sketch
+eduinowifi.menu.wipe.none.upload.erase_cmd=
+eduinowifi.menu.wipe.sdk=Sketch + WiFi Settings
+eduinowifi.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
+eduinowifi.menu.wipe.all=All Flash Contents
+eduinowifi.menu.wipe.all.upload.erase_cmd=erase_flash
+eduinowifi.menu.baud.512000.windows=512000
+eduinowifi.menu.baud.512000.upload.speed=512000
+eduinowifi.menu.baud.57600=57600
+eduinowifi.menu.baud.57600.upload.speed=57600
+eduinowifi.menu.baud.115200=115200
+eduinowifi.menu.baud.115200.upload.speed=115200
+eduinowifi.menu.baud.230400.linux=230400
+eduinowifi.menu.baud.230400.macosx=230400
+eduinowifi.menu.baud.230400.upload.speed=230400
+eduinowifi.menu.baud.256000.windows=256000
+eduinowifi.menu.baud.256000.upload.speed=256000
+eduinowifi.menu.baud.460800.linux=460800
+eduinowifi.menu.baud.460800.macosx=460800
+eduinowifi.menu.baud.460800.upload.speed=460800
+eduinowifi.menu.baud.921600=921600
+eduinowifi.menu.baud.921600.upload.speed=921600
+eduinowifi.menu.baud.3000000=3000000
+eduinowifi.menu.baud.3000000.upload.speed=3000000
+eduinowifi.menu.eesz.autoflash=Mapping defined by Hardware and Sketch
+eduinowifi.menu.eesz.autoflash.build.flash_size=16M
+eduinowifi.menu.eesz.autoflash.build.flash_ld=eagle.flash.auto.ld
+eduinowifi.menu.eesz.autoflash.build.extra_flags=-DFLASH_MAP_SUPPORT=1
+eduinowifi.menu.eesz.autoflash.upload.maximum_size=1044464
+eduinowifi.menu.iramfloat.no=in IROM
+eduinowifi.menu.iramfloat.no.build.iramfloat=-DFP_IN_IROM
+eduinowifi.menu.iramfloat.yes=allowed in ISR
+eduinowifi.menu.iramfloat.yes.build.iramfloat=-DFP_IN_IRAM
##############################################################
-thing.name=SparkFun ESP8266 Thing
+wiolink.name=Seeed Wio Link
+wiolink.build.board=ESP8266_WIO_LINK
+wiolink.build.variant=wiolink
+wiolink.upload.tool=esptool
+wiolink.upload.maximum_data_size=81920
+wiolink.upload.wait_for_upload_port=true
+wiolink.upload.erase_cmd=
+wiolink.serial.disableDTR=true
+wiolink.serial.disableRTS=true
+wiolink.build.mcu=esp8266
+wiolink.build.core=esp8266
+wiolink.build.spiffs_pagesize=256
+wiolink.build.debug_optim=
+wiolink.build.debug_port=
+wiolink.build.debug_level=
+wiolink.menu.xtal.80=80 MHz
+wiolink.menu.xtal.80.build.f_cpu=80000000L
+wiolink.menu.xtal.160=160 MHz
+wiolink.menu.xtal.160.build.f_cpu=160000000L
+wiolink.menu.vt.flash=Flash
+wiolink.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+wiolink.menu.vt.heap=Heap
+wiolink.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+wiolink.menu.vt.iram=IRAM
+wiolink.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+wiolink.menu.exception.disabled=Disabled (new aborts on oom)
+wiolink.menu.exception.disabled.build.exception_flags=-fno-exceptions
+wiolink.menu.exception.disabled.build.stdcpp_lib=-lstdc++
+wiolink.menu.exception.enabled=Enabled
+wiolink.menu.exception.enabled.build.exception_flags=-fexceptions
+wiolink.menu.exception.enabled.build.stdcpp_lib=-lstdc++-exc
+wiolink.menu.stacksmash.disabled=Disabled
+wiolink.menu.stacksmash.disabled.build.stacksmash_flags=
+wiolink.menu.stacksmash.enabled=Enabled
+wiolink.menu.stacksmash.enabled.build.stacksmash_flags=-fstack-protector
+wiolink.menu.ssl.all=All SSL ciphers (most compatible)
+wiolink.menu.ssl.all.build.sslflags=
+wiolink.menu.ssl.basic=Basic SSL ciphers (lower ROM use)
+wiolink.menu.ssl.basic.build.sslflags=-DBEARSSL_SSL_BASIC
+wiolink.menu.mmu.3232=32KB cache + 32KB IRAM (balanced)
+wiolink.menu.mmu.3232.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+wiolink.menu.mmu.4816=16KB cache + 48KB IRAM (IRAM)
+wiolink.menu.mmu.4816.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000
+wiolink.menu.mmu.4816H=16KB cache + 48KB IRAM and 2nd Heap (shared)
+wiolink.menu.mmu.4816H.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_IRAM_HEAP
+wiolink.menu.mmu.3216=16KB cache + 32KB IRAM + 16KB 2nd Heap (not shared)
+wiolink.menu.mmu.3216.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_SEC_HEAP=0x40108000 -DMMU_SEC_HEAP_SIZE=0x4000
+wiolink.menu.mmu.ext128k=128K Heap External 23LC1024
+wiolink.menu.mmu.ext128k.build.mmuflags=-DMMU_EXTERNAL_HEAP=128 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+wiolink.menu.mmu.ext8192k=8M w/256K Heap External 64 MBit PSRAM
+wiolink.menu.mmu.ext8192k.build.mmuflags=-DMMU_EXTERNAL_HEAP=256 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+wiolink.menu.non32xfer.fast=Use pgm_read macros for IRAM/PROGMEM
+wiolink.menu.non32xfer.fast.build.non32xferflags=
+wiolink.menu.non32xfer.safe=Byte/Word access to IRAM/PROGMEM (very slow)
+wiolink.menu.non32xfer.safe.build.non32xferflags=-DNON32XFER_HANDLER
+wiolink.upload.resetmethod=--before default_reset --after hard_reset
+wiolink.build.flash_mode=qio
+wiolink.build.flash_flags=-DFLASHMODE_QIO
+wiolink.build.flash_freq=40
+wiolink.menu.eesz.4M2M=4MB (FS:2MB OTA:~1019KB)
+wiolink.menu.eesz.4M2M.build.flash_size=4M
+wiolink.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
+wiolink.menu.eesz.4M2M.build.spiffs_pagesize=256
+wiolink.menu.eesz.4M2M.build.rfcal_addr=0x3FC000
+wiolink.menu.eesz.4M2M.build.spiffs_start=0x200000
+wiolink.menu.eesz.4M2M.build.spiffs_end=0x3FA000
+wiolink.menu.eesz.4M2M.build.spiffs_blocksize=8192
+wiolink.menu.eesz.4M3M=4MB (FS:3MB OTA:~512KB)
+wiolink.menu.eesz.4M3M.build.flash_size=4M
+wiolink.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
+wiolink.menu.eesz.4M3M.build.spiffs_pagesize=256
+wiolink.menu.eesz.4M3M.build.rfcal_addr=0x3FC000
+wiolink.menu.eesz.4M3M.build.spiffs_start=0x100000
+wiolink.menu.eesz.4M3M.build.spiffs_end=0x3FA000
+wiolink.menu.eesz.4M3M.build.spiffs_blocksize=8192
+wiolink.menu.eesz.4M1M=4MB (FS:1MB OTA:~1019KB)
+wiolink.menu.eesz.4M1M.build.flash_size=4M
+wiolink.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
+wiolink.menu.eesz.4M1M.build.spiffs_pagesize=256
+wiolink.menu.eesz.4M1M.build.rfcal_addr=0x3FC000
+wiolink.menu.eesz.4M1M.build.spiffs_start=0x300000
+wiolink.menu.eesz.4M1M.build.spiffs_end=0x3FA000
+wiolink.menu.eesz.4M1M.build.spiffs_blocksize=8192
+wiolink.menu.eesz.4M=4MB (FS:none OTA:~1019KB)
+wiolink.menu.eesz.4M.build.flash_size=4M
+wiolink.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
+wiolink.menu.eesz.4M.build.spiffs_pagesize=256
+wiolink.menu.eesz.4M.build.rfcal_addr=0x3FC000
+wiolink.menu.ip.lm2f=v2 Lower Memory
+wiolink.menu.ip.lm2f.build.lwip_include=lwip2/include
+wiolink.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+wiolink.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+wiolink.menu.ip.hb2f=v2 Higher Bandwidth
+wiolink.menu.ip.hb2f.build.lwip_include=lwip2/include
+wiolink.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+wiolink.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+wiolink.menu.ip.lm2n=v2 Lower Memory (no features)
+wiolink.menu.ip.lm2n.build.lwip_include=lwip2/include
+wiolink.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+wiolink.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+wiolink.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+wiolink.menu.ip.hb2n.build.lwip_include=lwip2/include
+wiolink.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+wiolink.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+wiolink.menu.ip.lm6f=v2 IPv6 Lower Memory
+wiolink.menu.ip.lm6f.build.lwip_include=lwip2/include
+wiolink.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+wiolink.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+wiolink.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+wiolink.menu.ip.hb6f.build.lwip_include=lwip2/include
+wiolink.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+wiolink.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+wiolink.menu.dbg.Disabled=Disabled
+wiolink.menu.dbg.Disabled.build.debug_port=
+wiolink.menu.dbg.Serial=Serial
+wiolink.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+wiolink.menu.dbg.Serial1=Serial1
+wiolink.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+wiolink.menu.lvl.None____=None
+wiolink.menu.lvl.None____.build.debug_level=
+wiolink.menu.optim.Smallest=None
+wiolink.menu.optim.Smallest.build.debug_optim=-Os
+wiolink.menu.optim.Lite=Lite
+wiolink.menu.optim.Lite.build.debug_optim=-Os -fno-optimize-sibling-calls
+wiolink.menu.optim.Full=Optimum
+wiolink.menu.optim.Full.build.debug_optim=-Og
+wiolink.menu.lvl.SSL=SSL
+wiolink.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+wiolink.menu.lvl.TLS_MEM=TLS_MEM
+wiolink.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+wiolink.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+wiolink.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+wiolink.menu.lvl.HTTP_SERVER=HTTP_SERVER
+wiolink.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+wiolink.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+wiolink.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+wiolink.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+wiolink.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+wiolink.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+wiolink.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+wiolink.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+wiolink.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+wiolink.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+wiolink.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+wiolink.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+wiolink.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+wiolink.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+wiolink.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+wiolink.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+wiolink.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+wiolink.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+wiolink.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+wiolink.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+wiolink.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+wiolink.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+wiolink.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+wiolink.menu.lvl.CORE=CORE
+wiolink.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+wiolink.menu.lvl.WIFI=WIFI
+wiolink.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+wiolink.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+wiolink.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+wiolink.menu.lvl.UPDATER=UPDATER
+wiolink.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+wiolink.menu.lvl.OTA=OTA
+wiolink.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+wiolink.menu.lvl.OOM=OOM
+wiolink.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+wiolink.menu.lvl.MDNS=MDNS
+wiolink.menu.lvl.MDNS.build.debug_level= -DDEBUG_ESP_MDNS
+wiolink.menu.lvl.HWDT=HWDT
+wiolink.menu.lvl.HWDT.build.debug_level= -DDEBUG_ESP_HWDT
+wiolink.menu.lvl.HWDT_NOEXTRA4K=HWDT_NOEXTRA4K
+wiolink.menu.lvl.HWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_HWDT_NOEXTRA4K
+wiolink.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+wiolink.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+wiolink.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+wiolink.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+wiolink.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+wiolink.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+wiolink.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+wiolink.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+wiolink.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+wiolink.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+wiolink.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+wiolink.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+wiolink.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+wiolink.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+wiolink.menu.wipe.none=Only Sketch
+wiolink.menu.wipe.none.upload.erase_cmd=
+wiolink.menu.wipe.sdk=Sketch + WiFi Settings
+wiolink.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
+wiolink.menu.wipe.all=All Flash Contents
+wiolink.menu.wipe.all.upload.erase_cmd=erase_flash
+wiolink.menu.baud.115200=115200
+wiolink.menu.baud.115200.upload.speed=115200
+wiolink.menu.baud.57600=57600
+wiolink.menu.baud.57600.upload.speed=57600
+wiolink.menu.baud.230400.linux=230400
+wiolink.menu.baud.230400.macosx=230400
+wiolink.menu.baud.230400.upload.speed=230400
+wiolink.menu.baud.256000.windows=256000
+wiolink.menu.baud.256000.upload.speed=256000
+wiolink.menu.baud.460800.linux=460800
+wiolink.menu.baud.460800.macosx=460800
+wiolink.menu.baud.460800.upload.speed=460800
+wiolink.menu.baud.512000.windows=512000
+wiolink.menu.baud.512000.upload.speed=512000
+wiolink.menu.baud.921600=921600
+wiolink.menu.baud.921600.upload.speed=921600
+wiolink.menu.baud.3000000=3000000
+wiolink.menu.baud.3000000.upload.speed=3000000
+wiolink.menu.eesz.autoflash=Mapping defined by Hardware and Sketch
+wiolink.menu.eesz.autoflash.build.flash_size=16M
+wiolink.menu.eesz.autoflash.build.flash_ld=eagle.flash.auto.ld
+wiolink.menu.eesz.autoflash.build.extra_flags=-DFLASH_MAP_SUPPORT=1
+wiolink.menu.eesz.autoflash.upload.maximum_size=1044464
+wiolink.menu.iramfloat.no=in IROM
+wiolink.menu.iramfloat.no.build.iramfloat=-DFP_IN_IROM
+wiolink.menu.iramfloat.yes=allowed in ISR
+wiolink.menu.iramfloat.yes.build.iramfloat=-DFP_IN_IRAM
+##############################################################
+blynk.name=SparkFun Blynk Board
+blynk.build.board=ESP8266_THING
+blynk.build.variant=thing
+blynk.upload.tool=esptool
+blynk.upload.maximum_data_size=81920
+blynk.upload.wait_for_upload_port=true
+blynk.upload.erase_cmd=
+blynk.serial.disableDTR=true
+blynk.serial.disableRTS=true
+blynk.build.mcu=esp8266
+blynk.build.core=esp8266
+blynk.build.spiffs_pagesize=256
+blynk.build.debug_optim=
+blynk.build.debug_port=
+blynk.build.debug_level=
+blynk.menu.xtal.80=80 MHz
+blynk.menu.xtal.80.build.f_cpu=80000000L
+blynk.menu.xtal.160=160 MHz
+blynk.menu.xtal.160.build.f_cpu=160000000L
+blynk.menu.vt.flash=Flash
+blynk.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+blynk.menu.vt.heap=Heap
+blynk.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+blynk.menu.vt.iram=IRAM
+blynk.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+blynk.menu.exception.disabled=Disabled (new aborts on oom)
+blynk.menu.exception.disabled.build.exception_flags=-fno-exceptions
+blynk.menu.exception.disabled.build.stdcpp_lib=-lstdc++
+blynk.menu.exception.enabled=Enabled
+blynk.menu.exception.enabled.build.exception_flags=-fexceptions
+blynk.menu.exception.enabled.build.stdcpp_lib=-lstdc++-exc
+blynk.menu.stacksmash.disabled=Disabled
+blynk.menu.stacksmash.disabled.build.stacksmash_flags=
+blynk.menu.stacksmash.enabled=Enabled
+blynk.menu.stacksmash.enabled.build.stacksmash_flags=-fstack-protector
+blynk.menu.ssl.all=All SSL ciphers (most compatible)
+blynk.menu.ssl.all.build.sslflags=
+blynk.menu.ssl.basic=Basic SSL ciphers (lower ROM use)
+blynk.menu.ssl.basic.build.sslflags=-DBEARSSL_SSL_BASIC
+blynk.menu.mmu.3232=32KB cache + 32KB IRAM (balanced)
+blynk.menu.mmu.3232.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+blynk.menu.mmu.4816=16KB cache + 48KB IRAM (IRAM)
+blynk.menu.mmu.4816.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000
+blynk.menu.mmu.4816H=16KB cache + 48KB IRAM and 2nd Heap (shared)
+blynk.menu.mmu.4816H.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_IRAM_HEAP
+blynk.menu.mmu.3216=16KB cache + 32KB IRAM + 16KB 2nd Heap (not shared)
+blynk.menu.mmu.3216.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_SEC_HEAP=0x40108000 -DMMU_SEC_HEAP_SIZE=0x4000
+blynk.menu.mmu.ext128k=128K Heap External 23LC1024
+blynk.menu.mmu.ext128k.build.mmuflags=-DMMU_EXTERNAL_HEAP=128 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+blynk.menu.mmu.ext8192k=8M w/256K Heap External 64 MBit PSRAM
+blynk.menu.mmu.ext8192k.build.mmuflags=-DMMU_EXTERNAL_HEAP=256 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+blynk.menu.non32xfer.fast=Use pgm_read macros for IRAM/PROGMEM
+blynk.menu.non32xfer.fast.build.non32xferflags=
+blynk.menu.non32xfer.safe=Byte/Word access to IRAM/PROGMEM (very slow)
+blynk.menu.non32xfer.safe.build.non32xferflags=-DNON32XFER_HANDLER
+blynk.upload.resetmethod=--before default_reset --after hard_reset
+blynk.build.flash_mode=qio
+blynk.build.flash_flags=-DFLASHMODE_QIO
+blynk.build.flash_freq=40
+blynk.menu.eesz.4M2M=4MB (FS:2MB OTA:~1019KB)
+blynk.menu.eesz.4M2M.build.flash_size=4M
+blynk.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
+blynk.menu.eesz.4M2M.build.spiffs_pagesize=256
+blynk.menu.eesz.4M2M.build.rfcal_addr=0x3FC000
+blynk.menu.eesz.4M2M.build.spiffs_start=0x200000
+blynk.menu.eesz.4M2M.build.spiffs_end=0x3FA000
+blynk.menu.eesz.4M2M.build.spiffs_blocksize=8192
+blynk.menu.eesz.4M3M=4MB (FS:3MB OTA:~512KB)
+blynk.menu.eesz.4M3M.build.flash_size=4M
+blynk.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
+blynk.menu.eesz.4M3M.build.spiffs_pagesize=256
+blynk.menu.eesz.4M3M.build.rfcal_addr=0x3FC000
+blynk.menu.eesz.4M3M.build.spiffs_start=0x100000
+blynk.menu.eesz.4M3M.build.spiffs_end=0x3FA000
+blynk.menu.eesz.4M3M.build.spiffs_blocksize=8192
+blynk.menu.eesz.4M1M=4MB (FS:1MB OTA:~1019KB)
+blynk.menu.eesz.4M1M.build.flash_size=4M
+blynk.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
+blynk.menu.eesz.4M1M.build.spiffs_pagesize=256
+blynk.menu.eesz.4M1M.build.rfcal_addr=0x3FC000
+blynk.menu.eesz.4M1M.build.spiffs_start=0x300000
+blynk.menu.eesz.4M1M.build.spiffs_end=0x3FA000
+blynk.menu.eesz.4M1M.build.spiffs_blocksize=8192
+blynk.menu.eesz.4M=4MB (FS:none OTA:~1019KB)
+blynk.menu.eesz.4M.build.flash_size=4M
+blynk.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
+blynk.menu.eesz.4M.build.spiffs_pagesize=256
+blynk.menu.eesz.4M.build.rfcal_addr=0x3FC000
+blynk.menu.ip.lm2f=v2 Lower Memory
+blynk.menu.ip.lm2f.build.lwip_include=lwip2/include
+blynk.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+blynk.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+blynk.menu.ip.hb2f=v2 Higher Bandwidth
+blynk.menu.ip.hb2f.build.lwip_include=lwip2/include
+blynk.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+blynk.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+blynk.menu.ip.lm2n=v2 Lower Memory (no features)
+blynk.menu.ip.lm2n.build.lwip_include=lwip2/include
+blynk.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+blynk.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+blynk.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+blynk.menu.ip.hb2n.build.lwip_include=lwip2/include
+blynk.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+blynk.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+blynk.menu.ip.lm6f=v2 IPv6 Lower Memory
+blynk.menu.ip.lm6f.build.lwip_include=lwip2/include
+blynk.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+blynk.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+blynk.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+blynk.menu.ip.hb6f.build.lwip_include=lwip2/include
+blynk.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+blynk.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+blynk.menu.dbg.Disabled=Disabled
+blynk.menu.dbg.Disabled.build.debug_port=
+blynk.menu.dbg.Serial=Serial
+blynk.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+blynk.menu.dbg.Serial1=Serial1
+blynk.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+blynk.menu.lvl.None____=None
+blynk.menu.lvl.None____.build.debug_level=
+blynk.menu.optim.Smallest=None
+blynk.menu.optim.Smallest.build.debug_optim=-Os
+blynk.menu.optim.Lite=Lite
+blynk.menu.optim.Lite.build.debug_optim=-Os -fno-optimize-sibling-calls
+blynk.menu.optim.Full=Optimum
+blynk.menu.optim.Full.build.debug_optim=-Og
+blynk.menu.lvl.SSL=SSL
+blynk.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+blynk.menu.lvl.TLS_MEM=TLS_MEM
+blynk.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+blynk.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+blynk.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+blynk.menu.lvl.HTTP_SERVER=HTTP_SERVER
+blynk.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+blynk.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+blynk.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+blynk.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+blynk.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+blynk.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+blynk.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+blynk.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+blynk.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+blynk.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+blynk.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+blynk.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+blynk.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+blynk.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+blynk.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+blynk.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+blynk.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+blynk.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+blynk.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+blynk.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+blynk.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+blynk.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+blynk.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+blynk.menu.lvl.CORE=CORE
+blynk.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+blynk.menu.lvl.WIFI=WIFI
+blynk.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+blynk.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+blynk.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+blynk.menu.lvl.UPDATER=UPDATER
+blynk.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+blynk.menu.lvl.OTA=OTA
+blynk.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+blynk.menu.lvl.OOM=OOM
+blynk.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+blynk.menu.lvl.MDNS=MDNS
+blynk.menu.lvl.MDNS.build.debug_level= -DDEBUG_ESP_MDNS
+blynk.menu.lvl.HWDT=HWDT
+blynk.menu.lvl.HWDT.build.debug_level= -DDEBUG_ESP_HWDT
+blynk.menu.lvl.HWDT_NOEXTRA4K=HWDT_NOEXTRA4K
+blynk.menu.lvl.HWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_HWDT_NOEXTRA4K
+blynk.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+blynk.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+blynk.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+blynk.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+blynk.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+blynk.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+blynk.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+blynk.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+blynk.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+blynk.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+blynk.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+blynk.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+blynk.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+blynk.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+blynk.menu.wipe.none=Only Sketch
+blynk.menu.wipe.none.upload.erase_cmd=
+blynk.menu.wipe.sdk=Sketch + WiFi Settings
+blynk.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
+blynk.menu.wipe.all=All Flash Contents
+blynk.menu.wipe.all.upload.erase_cmd=erase_flash
+blynk.menu.baud.115200=115200
+blynk.menu.baud.115200.upload.speed=115200
+blynk.menu.baud.57600=57600
+blynk.menu.baud.57600.upload.speed=57600
+blynk.menu.baud.230400.linux=230400
+blynk.menu.baud.230400.macosx=230400
+blynk.menu.baud.230400.upload.speed=230400
+blynk.menu.baud.256000.windows=256000
+blynk.menu.baud.256000.upload.speed=256000
+blynk.menu.baud.460800.linux=460800
+blynk.menu.baud.460800.macosx=460800
+blynk.menu.baud.460800.upload.speed=460800
+blynk.menu.baud.512000.windows=512000
+blynk.menu.baud.512000.upload.speed=512000
+blynk.menu.baud.921600=921600
+blynk.menu.baud.921600.upload.speed=921600
+blynk.menu.baud.3000000=3000000
+blynk.menu.baud.3000000.upload.speed=3000000
+blynk.menu.eesz.autoflash=Mapping defined by Hardware and Sketch
+blynk.menu.eesz.autoflash.build.flash_size=16M
+blynk.menu.eesz.autoflash.build.flash_ld=eagle.flash.auto.ld
+blynk.menu.eesz.autoflash.build.extra_flags=-DFLASH_MAP_SUPPORT=1
+blynk.menu.eesz.autoflash.upload.maximum_size=1044464
+blynk.menu.iramfloat.no=in IROM
+blynk.menu.iramfloat.no.build.iramfloat=-DFP_IN_IROM
+blynk.menu.iramfloat.yes=allowed in ISR
+blynk.menu.iramfloat.yes.build.iramfloat=-DFP_IN_IRAM
+
+##############################################################
+thing.name=SparkFun ESP8266 Thing
+thing.build.board=ESP8266_THING
+thing.build.variant=thing
thing.upload.tool=esptool
-thing.upload.speed=921600
-thing.upload.resetmethod=ck
-thing.upload.maximum_size=434160
thing.upload.maximum_data_size=81920
thing.upload.wait_for_upload_port=true
+thing.upload.erase_cmd=
thing.serial.disableDTR=true
thing.serial.disableRTS=true
-
thing.build.mcu=esp8266
-thing.build.f_cpu=80000000L
-thing.build.board=ESP8266_THING
thing.build.core=esp8266
-thing.build.variant=thing
-thing.build.flash_mode=qio
-# flash chip: AT25SF041 (512 kbyte, 4Mbit)
-thing.build.flash_size=512K
-thing.build.flash_ld=eagle.flash.512k64.ld
-thing.build.flash_freq=40
-thing.build.spiffs_start=0x6B000
-thing.build.spiffs_end=0x7B000
-thing.build.spiffs_blocksize=4096
thing.build.spiffs_pagesize=256
+thing.build.debug_optim=
thing.build.debug_port=
thing.build.debug_level=
-
-thing.menu.CpuFrequency.80=80 MHz
-thing.menu.CpuFrequency.80.build.f_cpu=80000000L
-thing.menu.CpuFrequency.160=160 MHz
-thing.menu.CpuFrequency.160.build.f_cpu=160000000L
-
-thing.menu.UploadSpeed.115200=115200
-thing.menu.UploadSpeed.115200.upload.speed=115200
-thing.menu.UploadSpeed.9600=9600
-thing.menu.UploadSpeed.9600.upload.speed=9600
-thing.menu.UploadSpeed.57600=57600
-thing.menu.UploadSpeed.57600.upload.speed=57600
-thing.menu.UploadSpeed.256000.windows=256000
-thing.menu.UploadSpeed.256000.upload.speed=256000
-thing.menu.UploadSpeed.230400.linux=230400
-thing.menu.UploadSpeed.230400.macosx=230400
-thing.menu.UploadSpeed.230400.upload.speed=230400
-thing.menu.UploadSpeed.460800.linux=460800
-thing.menu.UploadSpeed.460800.macosx=460800
-thing.menu.UploadSpeed.460800.upload.speed=460800
-thing.menu.UploadSpeed.512000.windows=512000
-thing.menu.UploadSpeed.512000.upload.speed=512000
-thing.menu.UploadSpeed.921600=921600
-thing.menu.UploadSpeed.921600.upload.speed=921600
+thing.menu.xtal.80=80 MHz
+thing.menu.xtal.80.build.f_cpu=80000000L
+thing.menu.xtal.160=160 MHz
+thing.menu.xtal.160.build.f_cpu=160000000L
+thing.menu.vt.flash=Flash
+thing.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+thing.menu.vt.heap=Heap
+thing.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+thing.menu.vt.iram=IRAM
+thing.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+thing.menu.exception.disabled=Disabled (new aborts on oom)
+thing.menu.exception.disabled.build.exception_flags=-fno-exceptions
+thing.menu.exception.disabled.build.stdcpp_lib=-lstdc++
+thing.menu.exception.enabled=Enabled
+thing.menu.exception.enabled.build.exception_flags=-fexceptions
+thing.menu.exception.enabled.build.stdcpp_lib=-lstdc++-exc
+thing.menu.stacksmash.disabled=Disabled
+thing.menu.stacksmash.disabled.build.stacksmash_flags=
+thing.menu.stacksmash.enabled=Enabled
+thing.menu.stacksmash.enabled.build.stacksmash_flags=-fstack-protector
+thing.menu.ssl.all=All SSL ciphers (most compatible)
+thing.menu.ssl.all.build.sslflags=
+thing.menu.ssl.basic=Basic SSL ciphers (lower ROM use)
+thing.menu.ssl.basic.build.sslflags=-DBEARSSL_SSL_BASIC
+thing.menu.mmu.3232=32KB cache + 32KB IRAM (balanced)
+thing.menu.mmu.3232.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+thing.menu.mmu.4816=16KB cache + 48KB IRAM (IRAM)
+thing.menu.mmu.4816.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000
+thing.menu.mmu.4816H=16KB cache + 48KB IRAM and 2nd Heap (shared)
+thing.menu.mmu.4816H.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_IRAM_HEAP
+thing.menu.mmu.3216=16KB cache + 32KB IRAM + 16KB 2nd Heap (not shared)
+thing.menu.mmu.3216.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_SEC_HEAP=0x40108000 -DMMU_SEC_HEAP_SIZE=0x4000
+thing.menu.mmu.ext128k=128K Heap External 23LC1024
+thing.menu.mmu.ext128k.build.mmuflags=-DMMU_EXTERNAL_HEAP=128 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+thing.menu.mmu.ext8192k=8M w/256K Heap External 64 MBit PSRAM
+thing.menu.mmu.ext8192k.build.mmuflags=-DMMU_EXTERNAL_HEAP=256 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+thing.menu.non32xfer.fast=Use pgm_read macros for IRAM/PROGMEM
+thing.menu.non32xfer.fast.build.non32xferflags=
+thing.menu.non32xfer.safe=Byte/Word access to IRAM/PROGMEM (very slow)
+thing.menu.non32xfer.safe.build.non32xferflags=-DNON32XFER_HANDLER
+thing.upload.resetmethod=--before no_reset --after soft_reset
+thing.build.flash_mode=qio
+thing.build.flash_flags=-DFLASHMODE_QIO
+thing.build.flash_freq=40
+thing.menu.eesz.512K32=512KB (FS:32KB OTA:~230KB)
+thing.menu.eesz.512K32.build.flash_size=512K
+thing.menu.eesz.512K32.build.flash_ld=eagle.flash.512k32.ld
+thing.menu.eesz.512K32.build.spiffs_pagesize=256
+thing.menu.eesz.512K32.build.rfcal_addr=0x7C000
+thing.menu.eesz.512K32.build.spiffs_start=0x73000
+thing.menu.eesz.512K32.build.spiffs_end=0x7B000
+thing.menu.eesz.512K32.build.spiffs_blocksize=4096
+thing.menu.eesz.512K64=512KB (FS:64KB OTA:~214KB)
+thing.menu.eesz.512K64.build.flash_size=512K
+thing.menu.eesz.512K64.build.flash_ld=eagle.flash.512k64.ld
+thing.menu.eesz.512K64.build.spiffs_pagesize=256
+thing.menu.eesz.512K64.build.rfcal_addr=0x7C000
+thing.menu.eesz.512K64.build.spiffs_start=0x6B000
+thing.menu.eesz.512K64.build.spiffs_end=0x7B000
+thing.menu.eesz.512K64.build.spiffs_blocksize=4096
+thing.menu.eesz.512K128=512KB (FS:128KB OTA:~182KB)
+thing.menu.eesz.512K128.build.flash_size=512K
+thing.menu.eesz.512K128.build.flash_ld=eagle.flash.512k128.ld
+thing.menu.eesz.512K128.build.spiffs_pagesize=256
+thing.menu.eesz.512K128.build.rfcal_addr=0x7C000
+thing.menu.eesz.512K128.build.spiffs_start=0x5B000
+thing.menu.eesz.512K128.build.spiffs_end=0x7B000
+thing.menu.eesz.512K128.build.spiffs_blocksize=4096
+thing.menu.eesz.512K=512KB (FS:none OTA:~246KB)
+thing.menu.eesz.512K.build.flash_size=512K
+thing.menu.eesz.512K.build.flash_ld=eagle.flash.512k.ld
+thing.menu.eesz.512K.build.spiffs_pagesize=256
+thing.menu.eesz.512K.build.rfcal_addr=0x7C000
+thing.menu.ip.lm2f=v2 Lower Memory
+thing.menu.ip.lm2f.build.lwip_include=lwip2/include
+thing.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+thing.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+thing.menu.ip.hb2f=v2 Higher Bandwidth
+thing.menu.ip.hb2f.build.lwip_include=lwip2/include
+thing.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+thing.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+thing.menu.ip.lm2n=v2 Lower Memory (no features)
+thing.menu.ip.lm2n.build.lwip_include=lwip2/include
+thing.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+thing.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+thing.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+thing.menu.ip.hb2n.build.lwip_include=lwip2/include
+thing.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+thing.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+thing.menu.ip.lm6f=v2 IPv6 Lower Memory
+thing.menu.ip.lm6f.build.lwip_include=lwip2/include
+thing.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+thing.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+thing.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+thing.menu.ip.hb6f.build.lwip_include=lwip2/include
+thing.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+thing.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+thing.menu.dbg.Disabled=Disabled
+thing.menu.dbg.Disabled.build.debug_port=
+thing.menu.dbg.Serial=Serial
+thing.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+thing.menu.dbg.Serial1=Serial1
+thing.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+thing.menu.lvl.None____=None
+thing.menu.lvl.None____.build.debug_level=
+thing.menu.optim.Smallest=None
+thing.menu.optim.Smallest.build.debug_optim=-Os
+thing.menu.optim.Lite=Lite
+thing.menu.optim.Lite.build.debug_optim=-Os -fno-optimize-sibling-calls
+thing.menu.optim.Full=Optimum
+thing.menu.optim.Full.build.debug_optim=-Og
+thing.menu.lvl.SSL=SSL
+thing.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+thing.menu.lvl.TLS_MEM=TLS_MEM
+thing.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+thing.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+thing.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+thing.menu.lvl.HTTP_SERVER=HTTP_SERVER
+thing.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+thing.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+thing.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+thing.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+thing.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+thing.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+thing.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+thing.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+thing.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+thing.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+thing.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+thing.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+thing.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+thing.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+thing.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+thing.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+thing.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+thing.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+thing.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+thing.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+thing.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+thing.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+thing.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+thing.menu.lvl.CORE=CORE
+thing.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+thing.menu.lvl.WIFI=WIFI
+thing.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+thing.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+thing.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+thing.menu.lvl.UPDATER=UPDATER
+thing.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+thing.menu.lvl.OTA=OTA
+thing.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+thing.menu.lvl.OOM=OOM
+thing.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+thing.menu.lvl.MDNS=MDNS
+thing.menu.lvl.MDNS.build.debug_level= -DDEBUG_ESP_MDNS
+thing.menu.lvl.HWDT=HWDT
+thing.menu.lvl.HWDT.build.debug_level= -DDEBUG_ESP_HWDT
+thing.menu.lvl.HWDT_NOEXTRA4K=HWDT_NOEXTRA4K
+thing.menu.lvl.HWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_HWDT_NOEXTRA4K
+thing.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+thing.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+thing.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+thing.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+thing.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+thing.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+thing.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+thing.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+thing.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+thing.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+thing.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+thing.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+thing.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+thing.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+thing.menu.wipe.none=Only Sketch
+thing.menu.wipe.none.upload.erase_cmd=
+thing.menu.wipe.sdk=Sketch + WiFi Settings
+thing.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
+thing.menu.wipe.all=All Flash Contents
+thing.menu.wipe.all.upload.erase_cmd=erase_flash
+thing.menu.baud.115200=115200
+thing.menu.baud.115200.upload.speed=115200
+thing.menu.baud.57600=57600
+thing.menu.baud.57600.upload.speed=57600
+thing.menu.baud.230400.linux=230400
+thing.menu.baud.230400.macosx=230400
+thing.menu.baud.230400.upload.speed=230400
+thing.menu.baud.256000.windows=256000
+thing.menu.baud.256000.upload.speed=256000
+thing.menu.baud.460800.linux=460800
+thing.menu.baud.460800.macosx=460800
+thing.menu.baud.460800.upload.speed=460800
+thing.menu.baud.512000.windows=512000
+thing.menu.baud.512000.upload.speed=512000
+thing.menu.baud.921600=921600
+thing.menu.baud.921600.upload.speed=921600
+thing.menu.baud.3000000=3000000
+thing.menu.baud.3000000.upload.speed=3000000
+thing.menu.eesz.autoflash=Mapping defined by Hardware and Sketch
+thing.menu.eesz.autoflash.build.flash_size=16M
+thing.menu.eesz.autoflash.build.flash_ld=eagle.flash.auto.ld
+thing.menu.eesz.autoflash.build.extra_flags=-DFLASH_MAP_SUPPORT=1
+thing.menu.eesz.autoflash.upload.maximum_size=1044464
+thing.menu.iramfloat.no=in IROM
+thing.menu.iramfloat.no.build.iramfloat=-DFP_IN_IROM
+thing.menu.iramfloat.yes=allowed in ISR
+thing.menu.iramfloat.yes.build.iramfloat=-DFP_IN_IRAM
##############################################################
thingdev.name=SparkFun ESP8266 Thing Dev
-
+thingdev.build.board=ESP8266_THING_DEV
+thingdev.build.variant=thing
thingdev.upload.tool=esptool
-thingdev.upload.speed=921600
-thingdev.upload.resetmethod=nodemcu
-thingdev.upload.maximum_size=434160
thingdev.upload.maximum_data_size=81920
thingdev.upload.wait_for_upload_port=true
+thingdev.upload.erase_cmd=
thingdev.serial.disableDTR=true
thingdev.serial.disableRTS=true
-
thingdev.build.mcu=esp8266
-thingdev.build.f_cpu=80000000L
-thingdev.build.board=ESP8266_THING_DEV
thingdev.build.core=esp8266
-thingdev.build.variant=thing
-thingdev.build.flash_mode=dio
-# flash chip: AT25SF041 (512 kbyte, 4Mbit)
-thingdev.build.flash_size=512K
-thingdev.build.flash_ld=eagle.flash.512k64.ld
-thingdev.build.flash_freq=40
+thingdev.build.spiffs_pagesize=256
+thingdev.build.debug_optim=
thingdev.build.debug_port=
thingdev.build.debug_level=
-
-thingdev.menu.CpuFrequency.80=80 MHz
-thingdev.menu.CpuFrequency.80.build.f_cpu=80000000L
-thingdev.menu.CpuFrequency.160=160 MHz
-thingdev.menu.CpuFrequency.160.build.f_cpu=160000000L
-
-thingdev.menu.UploadSpeed.115200=115200
-thingdev.menu.UploadSpeed.115200.upload.speed=115200
-thingdev.menu.UploadSpeed.9600=9600
-thingdev.menu.UploadSpeed.9600.upload.speed=9600
-thingdev.menu.UploadSpeed.57600=57600
-thingdev.menu.UploadSpeed.57600.upload.speed=57600
-thingdev.menu.UploadSpeed.256000.windows=256000
-thingdev.menu.UploadSpeed.256000.upload.speed=256000
-thingdev.menu.UploadSpeed.230400.linux=230400
-thingdev.menu.UploadSpeed.230400.macosx=230400
-thingdev.menu.UploadSpeed.230400.upload.speed=230400
-thingdev.menu.UploadSpeed.460800.linux=460800
-thingdev.menu.UploadSpeed.460800.macosx=460800
-thingdev.menu.UploadSpeed.460800.upload.speed=460800
-thingdev.menu.UploadSpeed.512000.windows=512000
-thingdev.menu.UploadSpeed.512000.upload.speed=512000
-thingdev.menu.UploadSpeed.921600=921600
-thingdev.menu.UploadSpeed.921600.upload.speed=921600
+thingdev.menu.xtal.80=80 MHz
+thingdev.menu.xtal.80.build.f_cpu=80000000L
+thingdev.menu.xtal.160=160 MHz
+thingdev.menu.xtal.160.build.f_cpu=160000000L
+thingdev.menu.vt.flash=Flash
+thingdev.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+thingdev.menu.vt.heap=Heap
+thingdev.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+thingdev.menu.vt.iram=IRAM
+thingdev.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+thingdev.menu.exception.disabled=Disabled (new aborts on oom)
+thingdev.menu.exception.disabled.build.exception_flags=-fno-exceptions
+thingdev.menu.exception.disabled.build.stdcpp_lib=-lstdc++
+thingdev.menu.exception.enabled=Enabled
+thingdev.menu.exception.enabled.build.exception_flags=-fexceptions
+thingdev.menu.exception.enabled.build.stdcpp_lib=-lstdc++-exc
+thingdev.menu.stacksmash.disabled=Disabled
+thingdev.menu.stacksmash.disabled.build.stacksmash_flags=
+thingdev.menu.stacksmash.enabled=Enabled
+thingdev.menu.stacksmash.enabled.build.stacksmash_flags=-fstack-protector
+thingdev.menu.ssl.all=All SSL ciphers (most compatible)
+thingdev.menu.ssl.all.build.sslflags=
+thingdev.menu.ssl.basic=Basic SSL ciphers (lower ROM use)
+thingdev.menu.ssl.basic.build.sslflags=-DBEARSSL_SSL_BASIC
+thingdev.menu.mmu.3232=32KB cache + 32KB IRAM (balanced)
+thingdev.menu.mmu.3232.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+thingdev.menu.mmu.4816=16KB cache + 48KB IRAM (IRAM)
+thingdev.menu.mmu.4816.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000
+thingdev.menu.mmu.4816H=16KB cache + 48KB IRAM and 2nd Heap (shared)
+thingdev.menu.mmu.4816H.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_IRAM_HEAP
+thingdev.menu.mmu.3216=16KB cache + 32KB IRAM + 16KB 2nd Heap (not shared)
+thingdev.menu.mmu.3216.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_SEC_HEAP=0x40108000 -DMMU_SEC_HEAP_SIZE=0x4000
+thingdev.menu.mmu.ext128k=128K Heap External 23LC1024
+thingdev.menu.mmu.ext128k.build.mmuflags=-DMMU_EXTERNAL_HEAP=128 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+thingdev.menu.mmu.ext8192k=8M w/256K Heap External 64 MBit PSRAM
+thingdev.menu.mmu.ext8192k.build.mmuflags=-DMMU_EXTERNAL_HEAP=256 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+thingdev.menu.non32xfer.fast=Use pgm_read macros for IRAM/PROGMEM
+thingdev.menu.non32xfer.fast.build.non32xferflags=
+thingdev.menu.non32xfer.safe=Byte/Word access to IRAM/PROGMEM (very slow)
+thingdev.menu.non32xfer.safe.build.non32xferflags=-DNON32XFER_HANDLER
+thingdev.upload.resetmethod=--before default_reset --after hard_reset
+thingdev.build.flash_mode=dio
+thingdev.build.flash_flags=-DFLASHMODE_DIO
+thingdev.build.flash_freq=40
+thingdev.menu.eesz.512K32=512KB (FS:32KB OTA:~230KB)
+thingdev.menu.eesz.512K32.build.flash_size=512K
+thingdev.menu.eesz.512K32.build.flash_ld=eagle.flash.512k32.ld
+thingdev.menu.eesz.512K32.build.spiffs_pagesize=256
+thingdev.menu.eesz.512K32.build.rfcal_addr=0x7C000
+thingdev.menu.eesz.512K32.build.spiffs_start=0x73000
+thingdev.menu.eesz.512K32.build.spiffs_end=0x7B000
+thingdev.menu.eesz.512K32.build.spiffs_blocksize=4096
+thingdev.menu.eesz.512K64=512KB (FS:64KB OTA:~214KB)
+thingdev.menu.eesz.512K64.build.flash_size=512K
+thingdev.menu.eesz.512K64.build.flash_ld=eagle.flash.512k64.ld
+thingdev.menu.eesz.512K64.build.spiffs_pagesize=256
+thingdev.menu.eesz.512K64.build.rfcal_addr=0x7C000
+thingdev.menu.eesz.512K64.build.spiffs_start=0x6B000
+thingdev.menu.eesz.512K64.build.spiffs_end=0x7B000
+thingdev.menu.eesz.512K64.build.spiffs_blocksize=4096
+thingdev.menu.eesz.512K128=512KB (FS:128KB OTA:~182KB)
+thingdev.menu.eesz.512K128.build.flash_size=512K
+thingdev.menu.eesz.512K128.build.flash_ld=eagle.flash.512k128.ld
+thingdev.menu.eesz.512K128.build.spiffs_pagesize=256
+thingdev.menu.eesz.512K128.build.rfcal_addr=0x7C000
+thingdev.menu.eesz.512K128.build.spiffs_start=0x5B000
+thingdev.menu.eesz.512K128.build.spiffs_end=0x7B000
+thingdev.menu.eesz.512K128.build.spiffs_blocksize=4096
+thingdev.menu.eesz.512K=512KB (FS:none OTA:~246KB)
+thingdev.menu.eesz.512K.build.flash_size=512K
+thingdev.menu.eesz.512K.build.flash_ld=eagle.flash.512k.ld
+thingdev.menu.eesz.512K.build.spiffs_pagesize=256
+thingdev.menu.eesz.512K.build.rfcal_addr=0x7C000
+thingdev.menu.ip.lm2f=v2 Lower Memory
+thingdev.menu.ip.lm2f.build.lwip_include=lwip2/include
+thingdev.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+thingdev.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+thingdev.menu.ip.hb2f=v2 Higher Bandwidth
+thingdev.menu.ip.hb2f.build.lwip_include=lwip2/include
+thingdev.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+thingdev.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+thingdev.menu.ip.lm2n=v2 Lower Memory (no features)
+thingdev.menu.ip.lm2n.build.lwip_include=lwip2/include
+thingdev.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+thingdev.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+thingdev.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+thingdev.menu.ip.hb2n.build.lwip_include=lwip2/include
+thingdev.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+thingdev.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+thingdev.menu.ip.lm6f=v2 IPv6 Lower Memory
+thingdev.menu.ip.lm6f.build.lwip_include=lwip2/include
+thingdev.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+thingdev.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+thingdev.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+thingdev.menu.ip.hb6f.build.lwip_include=lwip2/include
+thingdev.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+thingdev.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+thingdev.menu.dbg.Disabled=Disabled
+thingdev.menu.dbg.Disabled.build.debug_port=
+thingdev.menu.dbg.Serial=Serial
+thingdev.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+thingdev.menu.dbg.Serial1=Serial1
+thingdev.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+thingdev.menu.lvl.None____=None
+thingdev.menu.lvl.None____.build.debug_level=
+thingdev.menu.optim.Smallest=None
+thingdev.menu.optim.Smallest.build.debug_optim=-Os
+thingdev.menu.optim.Lite=Lite
+thingdev.menu.optim.Lite.build.debug_optim=-Os -fno-optimize-sibling-calls
+thingdev.menu.optim.Full=Optimum
+thingdev.menu.optim.Full.build.debug_optim=-Og
+thingdev.menu.lvl.SSL=SSL
+thingdev.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+thingdev.menu.lvl.TLS_MEM=TLS_MEM
+thingdev.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+thingdev.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+thingdev.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+thingdev.menu.lvl.HTTP_SERVER=HTTP_SERVER
+thingdev.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+thingdev.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+thingdev.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+thingdev.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+thingdev.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+thingdev.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+thingdev.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+thingdev.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+thingdev.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+thingdev.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+thingdev.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+thingdev.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+thingdev.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+thingdev.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+thingdev.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+thingdev.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+thingdev.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+thingdev.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+thingdev.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+thingdev.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+thingdev.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+thingdev.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+thingdev.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+thingdev.menu.lvl.CORE=CORE
+thingdev.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+thingdev.menu.lvl.WIFI=WIFI
+thingdev.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+thingdev.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+thingdev.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+thingdev.menu.lvl.UPDATER=UPDATER
+thingdev.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+thingdev.menu.lvl.OTA=OTA
+thingdev.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+thingdev.menu.lvl.OOM=OOM
+thingdev.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+thingdev.menu.lvl.MDNS=MDNS
+thingdev.menu.lvl.MDNS.build.debug_level= -DDEBUG_ESP_MDNS
+thingdev.menu.lvl.HWDT=HWDT
+thingdev.menu.lvl.HWDT.build.debug_level= -DDEBUG_ESP_HWDT
+thingdev.menu.lvl.HWDT_NOEXTRA4K=HWDT_NOEXTRA4K
+thingdev.menu.lvl.HWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_HWDT_NOEXTRA4K
+thingdev.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+thingdev.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+thingdev.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+thingdev.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+thingdev.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+thingdev.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+thingdev.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+thingdev.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+thingdev.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+thingdev.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+thingdev.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+thingdev.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+thingdev.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+thingdev.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+thingdev.menu.wipe.none=Only Sketch
+thingdev.menu.wipe.none.upload.erase_cmd=
+thingdev.menu.wipe.sdk=Sketch + WiFi Settings
+thingdev.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
+thingdev.menu.wipe.all=All Flash Contents
+thingdev.menu.wipe.all.upload.erase_cmd=erase_flash
+thingdev.menu.baud.115200=115200
+thingdev.menu.baud.115200.upload.speed=115200
+thingdev.menu.baud.57600=57600
+thingdev.menu.baud.57600.upload.speed=57600
+thingdev.menu.baud.230400.linux=230400
+thingdev.menu.baud.230400.macosx=230400
+thingdev.menu.baud.230400.upload.speed=230400
+thingdev.menu.baud.256000.windows=256000
+thingdev.menu.baud.256000.upload.speed=256000
+thingdev.menu.baud.460800.linux=460800
+thingdev.menu.baud.460800.macosx=460800
+thingdev.menu.baud.460800.upload.speed=460800
+thingdev.menu.baud.512000.windows=512000
+thingdev.menu.baud.512000.upload.speed=512000
+thingdev.menu.baud.921600=921600
+thingdev.menu.baud.921600.upload.speed=921600
+thingdev.menu.baud.3000000=3000000
+thingdev.menu.baud.3000000.upload.speed=3000000
+thingdev.menu.eesz.autoflash=Mapping defined by Hardware and Sketch
+thingdev.menu.eesz.autoflash.build.flash_size=16M
+thingdev.menu.eesz.autoflash.build.flash_ld=eagle.flash.auto.ld
+thingdev.menu.eesz.autoflash.build.extra_flags=-DFLASH_MAP_SUPPORT=1
+thingdev.menu.eesz.autoflash.upload.maximum_size=1044464
+thingdev.menu.iramfloat.no=in IROM
+thingdev.menu.iramfloat.no.build.iramfloat=-DFP_IN_IROM
+thingdev.menu.iramfloat.yes=allowed in ISR
+thingdev.menu.iramfloat.yes.build.iramfloat=-DFP_IN_IRAM
##############################################################
esp210.name=SweetPea ESP-210
-
+esp210.build.board=ESP8266_ESP210
esp210.upload.tool=esptool
-esp210.upload.speed=115200
-esp210.upload.resetmethod=ck
-esp210.upload.maximum_size=1044464
esp210.upload.maximum_data_size=81920
esp210.upload.wait_for_upload_port=true
+esp210.upload.erase_cmd=
esp210.serial.disableDTR=true
esp210.serial.disableRTS=true
-
esp210.build.mcu=esp8266
-esp210.build.f_cpu=80000000L
-esp210.build.board=ESP8266_ESP210
esp210.build.core=esp8266
esp210.build.variant=generic
-esp210.build.flash_mode=qio
-esp210.build.flash_size=4M
-esp210.build.flash_freq=40
+esp210.build.spiffs_pagesize=256
+esp210.build.debug_optim=
esp210.build.debug_port=
esp210.build.debug_level=
-
-esp210.menu.CpuFrequency.80=80 MHz
-esp210.menu.CpuFrequency.80.build.f_cpu=80000000L
-esp210.menu.CpuFrequency.160=160 MHz
-esp210.menu.CpuFrequency.160.build.f_cpu=160000000L
-
-esp210.menu.UploadSpeed.57600=57600
-esp210.menu.UploadSpeed.57600.upload.speed=57600
-esp210.menu.UploadSpeed.115200=115200
-esp210.menu.UploadSpeed.115200.upload.speed=115200
-esp210.menu.UploadSpeed.256000.windows=256000
-esp210.menu.UploadSpeed.256000.upload.speed=256000
-esp210.menu.UploadSpeed.230400.linux=230400
-esp210.menu.UploadSpeed.230400.macosx=230400
-esp210.menu.UploadSpeed.230400.macosx=230400
-esp210.menu.UploadSpeed.230400.upload.speed=230400
-esp210.menu.UploadSpeed.460800.linux=460800
-esp210.menu.UploadSpeed.460800.macosx=460800
-esp210.menu.UploadSpeed.460800.upload.speed=460800
-esp210.menu.UploadSpeed.512000.windows=512000
-esp210.menu.UploadSpeed.512000.upload.speed=512000
-esp210.menu.UploadSpeed.921600=921600
-esp210.menu.UploadSpeed.921600.upload.speed=921600
-
-esp210.menu.FlashSize.4M3M=4M (3M SPIFFS)
-esp210.menu.FlashSize.4M3M.build.flash_size=4M
-esp210.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-esp210.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-esp210.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-esp210.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-esp210.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-
-esp210.menu.FlashSize.4M1M=4M (1M SPIFFS)
-esp210.menu.FlashSize.4M1M.build.flash_size=4M
-esp210.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-esp210.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-esp210.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-esp210.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-esp210.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-
-##############################################################
-# wifio.name=Wifio
-#
-# wifio.upload.tool=esptool
-# wifio.upload.speed=115200
-# wifio.upload.resetmethod=wifio
-# wifio.upload.maximum_size=524288
-# wifio.upload.wait_for_upload_port=true
-#
-# wifio.build.mcu=esp8266
-# wifio.build.f_cpu=80000000L
-# wifio.build.board=ESP8266_WIFIO
-# wifio.build.core=esp8266
-# wifio.build.variant=wifio
-# wifio.build.flash_mode=qio
-# wifio.build.flash_size=512K
-# wifio.build.flash_freq=40
-# wifio.build.flash_ld=eagle.flash.512k64.ld
-# wifio.build.spiffs_start=0x6B000
-# wifio.build.spiffs_end=0x7B000
-#
-# wifio.menu.CpuFrequency.80=80MHz
-# wifio.menu.CpuFrequency.80.build.f_cpu=80000000L
-# wifio.menu.CpuFrequency.160=160MHz
-# wifio.menu.CpuFrequency.160.build.f_cpu=160000000L
-#
-# wifio.upload.tool=esptool
-#
-
-##############################################################
-d1_mini.name=WeMos D1 R2 & mini
-
-d1_mini.upload.tool=esptool
-d1_mini.upload.speed=460800
-d1_mini.upload.resetmethod=nodemcu
-d1_mini.upload.maximum_size=1044464
-d1_mini.upload.maximum_data_size=81920
-d1_mini.upload.wait_for_upload_port=true
-d1_mini.serial.disableDTR=true
-d1_mini.serial.disableRTS=true
-
-d1_mini.build.mcu=esp8266
-d1_mini.build.f_cpu=80000000L
-d1_mini.build.board=ESP8266_ESP12
-d1_mini.build.core=esp8266
-d1_mini.build.variant=d1_mini
-d1_mini.build.flash_mode=dio
-d1_mini.build.flash_size=4M
-d1_mini.build.flash_freq=40
-d1_mini.build.debug_port=
-d1_mini.build.debug_level=
-
-d1_mini.menu.CpuFrequency.80=80 MHz
-d1_mini.menu.CpuFrequency.80.build.f_cpu=80000000L
-d1_mini.menu.CpuFrequency.160=160 MHz
-d1_mini.menu.CpuFrequency.160.build.f_cpu=160000000L
-
-d1_mini.menu.UploadSpeed.921600=921600
-d1_mini.menu.UploadSpeed.921600.upload.speed=921600
-d1_mini.menu.UploadSpeed.115200=115200
-d1_mini.menu.UploadSpeed.115200.upload.speed=115200
-d1_mini.menu.UploadSpeed.9600=9600
-d1_mini.menu.UploadSpeed.9600.upload.speed=9600
-d1_mini.menu.UploadSpeed.57600=57600
-d1_mini.menu.UploadSpeed.57600.upload.speed=57600
-d1_mini.menu.UploadSpeed.256000.windows=256000
-d1_mini.menu.UploadSpeed.256000.upload.speed=256000
-d1_mini.menu.UploadSpeed.230400.linux=230400
-d1_mini.menu.UploadSpeed.230400.macosx=230400
-d1_mini.menu.UploadSpeed.230400.macosx=230400
-d1_mini.menu.UploadSpeed.230400.upload.speed=230400
-d1_mini.menu.UploadSpeed.460800.linux=460800
-d1_mini.menu.UploadSpeed.460800.macosx=460800
-d1_mini.menu.UploadSpeed.460800.upload.speed=460800
-d1_mini.menu.UploadSpeed.512000.windows=512000
-d1_mini.menu.UploadSpeed.512000.upload.speed=512000
-
-
-d1_mini.menu.FlashSize.4M3M=4M (3M SPIFFS)
-d1_mini.menu.FlashSize.4M3M.build.flash_size=4M
-d1_mini.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-d1_mini.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-d1_mini.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-d1_mini.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-d1_mini.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-
-d1_mini.menu.FlashSize.4M1M=4M (1M SPIFFS)
-d1_mini.menu.FlashSize.4M1M.build.flash_size=4M
-d1_mini.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-d1_mini.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-d1_mini.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-d1_mini.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-d1_mini.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-
-
-##############################################################
-d1.name=WeMos D1(Retired)
-
-d1.upload.tool=esptool
-d1.upload.speed=460800
-d1.upload.resetmethod=nodemcu
-d1.upload.maximum_size=1044464
-d1.upload.maximum_data_size=81920
-d1.upload.wait_for_upload_port=true
-d1.serial.disableDTR=true
-d1.serial.disableRTS=true
-
-d1.build.mcu=esp8266
-d1.build.f_cpu=80000000L
-d1.build.board=ESP8266_ESP12
-d1.build.core=esp8266
-d1.build.variant=d1
-d1.build.flash_mode=dio
-d1.build.flash_size=4M
-d1.build.flash_freq=40
-d1.build.debug_port=
-d1.build.debug_level=
-
-d1.menu.CpuFrequency.80=80 MHz
-d1.menu.CpuFrequency.80.build.f_cpu=80000000L
-d1.menu.CpuFrequency.160=160 MHz
-d1.menu.CpuFrequency.160.build.f_cpu=160000000L
-
-d1.menu.UploadSpeed.921600=921600
-d1.menu.UploadSpeed.921600.upload.speed=921600
-d1.menu.UploadSpeed.115200=115200
-d1.menu.UploadSpeed.115200.upload.speed=115200
-d1.menu.UploadSpeed.9600=9600
-d1.menu.UploadSpeed.9600.upload.speed=9600
-d1.menu.UploadSpeed.57600=57600
-d1.menu.UploadSpeed.57600.upload.speed=57600
-d1.menu.UploadSpeed.256000.windows=256000
-d1.menu.UploadSpeed.256000.upload.speed=256000
-d1.menu.UploadSpeed.230400.linux=230400
-d1.menu.UploadSpeed.230400.macosx=230400
-d1.menu.UploadSpeed.230400.macosx=230400
-d1.menu.UploadSpeed.230400.upload.speed=230400
-d1.menu.UploadSpeed.460800.linux=460800
-d1.menu.UploadSpeed.460800.macosx=460800
-d1.menu.UploadSpeed.460800.upload.speed=460800
-d1.menu.UploadSpeed.512000.windows=512000
-d1.menu.UploadSpeed.512000.upload.speed=512000
-
-
-d1.menu.FlashSize.4M3M=4M (3M SPIFFS)
-d1.menu.FlashSize.4M3M.build.flash_size=4M
-d1.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-d1.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-d1.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-d1.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-d1.menu.FlashSize.4M3M.build.spiffs_pagesize=256
-
-d1.menu.FlashSize.4M1M=4M (1M SPIFFS)
-d1.menu.FlashSize.4M1M.build.flash_size=4M
-d1.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-d1.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-d1.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-d1.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-d1.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-
-
-##############################################################
-
-espino.name=ESPino (ESP-12 Module)
-
-espino.upload.tool=esptool
-espino.upload.speed=115200
-espino.upload.resetmethod=ck
-espino.upload.maximum_size=1044464
-espino.upload.maximum_data_size=81920
-espino.upload.wait_for_upload_port=true
-espino.serial.disableDTR=true
-espino.serial.disableRTS=true
-
-espino.build.mcu=esp8266
-espino.build.f_cpu=80000000L
-espino.build.board=ESP8266_ESP12
-espino.build.core=esp8266
-espino.build.variant=espino
-espino.build.flash_mode=qio
-espino.build.flash_size=4M
-espino.build.flash_freq=40
-espino.build.spiffs_pagesize=256
-espino.build.debug_port=
-espino.build.debug_level=
-
-espino.menu.CpuFrequency.80=80 MHz
-espino.menu.CpuFrequency.80.build.f_cpu=80000000L
-espino.menu.CpuFrequency.160=160 MHz
-espino.menu.CpuFrequency.160.build.f_cpu=160000000L
-
-espino.menu.FlashMode.dio=DIO
-espino.menu.FlashMode.dio.build.flash_mode=dio
-espino.menu.FlashMode.qio=QIO
-espino.menu.FlashMode.qio.build.flash_mode=qio
-
-espino.menu.UploadSpeed.115200=115200
-espino.menu.UploadSpeed.115200.upload.speed=115200
-espino.menu.UploadSpeed.9600=9600
-espino.menu.UploadSpeed.9600.upload.speed=9600
-espino.menu.UploadSpeed.57600=57600
-espino.menu.UploadSpeed.57600.upload.speed=57600
-espino.menu.UploadSpeed.256000.windows=256000
-espino.menu.UploadSpeed.256000.upload.speed=256000
-espino.menu.UploadSpeed.230400.linux=230400
-espino.menu.UploadSpeed.230400.macosx=230400
-espino.menu.UploadSpeed.230400.upload.speed=230400
-espino.menu.UploadSpeed.460800.linux=460800
-espino.menu.UploadSpeed.460800.macosx=460800
-espino.menu.UploadSpeed.460800.upload.speed=460800
-espino.menu.UploadSpeed.512000.windows=512000
-espino.menu.UploadSpeed.512000.upload.speed=512000
-espino.menu.UploadSpeed.921600=921600
-espino.menu.UploadSpeed.921600.upload.speed=921600
-
-espino.menu.FlashSize.4M1M=4M (1M SPIFFS)
-espino.menu.FlashSize.4M1M.build.flash_size=4M
-espino.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-espino.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-espino.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-espino.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-espino.menu.FlashSize.4M1M.build.spiffs_pagesize=256
-espino.menu.FlashSize.4M1M.upload.maximum_size=1044464
-
-espino.menu.FlashSize.4M3M=4M (3M SPIFFS)
-espino.menu.FlashSize.4M3M.build.flash_size=4M
-espino.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-espino.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-espino.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-espino.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-espino.menu.FlashSize.4M3M.upload.maximum_size=1044464
-
-espino.menu.ResetMethod.ck=ck
-espino.menu.ResetMethod.ck.upload.resetmethod=ck
-espino.menu.ResetMethod.nodemcu=nodemcu
-espino.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu
+esp210.menu.xtal.80=80 MHz
+esp210.menu.xtal.80.build.f_cpu=80000000L
+esp210.menu.xtal.160=160 MHz
+esp210.menu.xtal.160.build.f_cpu=160000000L
+esp210.menu.vt.flash=Flash
+esp210.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+esp210.menu.vt.heap=Heap
+esp210.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+esp210.menu.vt.iram=IRAM
+esp210.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+esp210.menu.exception.disabled=Disabled (new aborts on oom)
+esp210.menu.exception.disabled.build.exception_flags=-fno-exceptions
+esp210.menu.exception.disabled.build.stdcpp_lib=-lstdc++
+esp210.menu.exception.enabled=Enabled
+esp210.menu.exception.enabled.build.exception_flags=-fexceptions
+esp210.menu.exception.enabled.build.stdcpp_lib=-lstdc++-exc
+esp210.menu.stacksmash.disabled=Disabled
+esp210.menu.stacksmash.disabled.build.stacksmash_flags=
+esp210.menu.stacksmash.enabled=Enabled
+esp210.menu.stacksmash.enabled.build.stacksmash_flags=-fstack-protector
+esp210.menu.ssl.all=All SSL ciphers (most compatible)
+esp210.menu.ssl.all.build.sslflags=
+esp210.menu.ssl.basic=Basic SSL ciphers (lower ROM use)
+esp210.menu.ssl.basic.build.sslflags=-DBEARSSL_SSL_BASIC
+esp210.menu.mmu.3232=32KB cache + 32KB IRAM (balanced)
+esp210.menu.mmu.3232.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+esp210.menu.mmu.4816=16KB cache + 48KB IRAM (IRAM)
+esp210.menu.mmu.4816.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000
+esp210.menu.mmu.4816H=16KB cache + 48KB IRAM and 2nd Heap (shared)
+esp210.menu.mmu.4816H.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_IRAM_HEAP
+esp210.menu.mmu.3216=16KB cache + 32KB IRAM + 16KB 2nd Heap (not shared)
+esp210.menu.mmu.3216.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_SEC_HEAP=0x40108000 -DMMU_SEC_HEAP_SIZE=0x4000
+esp210.menu.mmu.ext128k=128K Heap External 23LC1024
+esp210.menu.mmu.ext128k.build.mmuflags=-DMMU_EXTERNAL_HEAP=128 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+esp210.menu.mmu.ext8192k=8M w/256K Heap External 64 MBit PSRAM
+esp210.menu.mmu.ext8192k.build.mmuflags=-DMMU_EXTERNAL_HEAP=256 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+esp210.menu.non32xfer.fast=Use pgm_read macros for IRAM/PROGMEM
+esp210.menu.non32xfer.fast.build.non32xferflags=
+esp210.menu.non32xfer.safe=Byte/Word access to IRAM/PROGMEM (very slow)
+esp210.menu.non32xfer.safe.build.non32xferflags=-DNON32XFER_HANDLER
+esp210.upload.resetmethod=--before no_reset --after soft_reset
+esp210.build.flash_mode=qio
+esp210.build.flash_flags=-DFLASHMODE_QIO
+esp210.build.flash_freq=40
+esp210.menu.eesz.4M2M=4MB (FS:2MB OTA:~1019KB)
+esp210.menu.eesz.4M2M.build.flash_size=4M
+esp210.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
+esp210.menu.eesz.4M2M.build.spiffs_pagesize=256
+esp210.menu.eesz.4M2M.build.rfcal_addr=0x3FC000
+esp210.menu.eesz.4M2M.build.spiffs_start=0x200000
+esp210.menu.eesz.4M2M.build.spiffs_end=0x3FA000
+esp210.menu.eesz.4M2M.build.spiffs_blocksize=8192
+esp210.menu.eesz.4M3M=4MB (FS:3MB OTA:~512KB)
+esp210.menu.eesz.4M3M.build.flash_size=4M
+esp210.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
+esp210.menu.eesz.4M3M.build.spiffs_pagesize=256
+esp210.menu.eesz.4M3M.build.rfcal_addr=0x3FC000
+esp210.menu.eesz.4M3M.build.spiffs_start=0x100000
+esp210.menu.eesz.4M3M.build.spiffs_end=0x3FA000
+esp210.menu.eesz.4M3M.build.spiffs_blocksize=8192
+esp210.menu.eesz.4M1M=4MB (FS:1MB OTA:~1019KB)
+esp210.menu.eesz.4M1M.build.flash_size=4M
+esp210.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
+esp210.menu.eesz.4M1M.build.spiffs_pagesize=256
+esp210.menu.eesz.4M1M.build.rfcal_addr=0x3FC000
+esp210.menu.eesz.4M1M.build.spiffs_start=0x300000
+esp210.menu.eesz.4M1M.build.spiffs_end=0x3FA000
+esp210.menu.eesz.4M1M.build.spiffs_blocksize=8192
+esp210.menu.eesz.4M=4MB (FS:none OTA:~1019KB)
+esp210.menu.eesz.4M.build.flash_size=4M
+esp210.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
+esp210.menu.eesz.4M.build.spiffs_pagesize=256
+esp210.menu.eesz.4M.build.rfcal_addr=0x3FC000
+esp210.menu.ip.lm2f=v2 Lower Memory
+esp210.menu.ip.lm2f.build.lwip_include=lwip2/include
+esp210.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+esp210.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+esp210.menu.ip.hb2f=v2 Higher Bandwidth
+esp210.menu.ip.hb2f.build.lwip_include=lwip2/include
+esp210.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+esp210.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+esp210.menu.ip.lm2n=v2 Lower Memory (no features)
+esp210.menu.ip.lm2n.build.lwip_include=lwip2/include
+esp210.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+esp210.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+esp210.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+esp210.menu.ip.hb2n.build.lwip_include=lwip2/include
+esp210.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+esp210.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+esp210.menu.ip.lm6f=v2 IPv6 Lower Memory
+esp210.menu.ip.lm6f.build.lwip_include=lwip2/include
+esp210.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+esp210.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+esp210.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+esp210.menu.ip.hb6f.build.lwip_include=lwip2/include
+esp210.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+esp210.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+esp210.menu.dbg.Disabled=Disabled
+esp210.menu.dbg.Disabled.build.debug_port=
+esp210.menu.dbg.Serial=Serial
+esp210.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+esp210.menu.dbg.Serial1=Serial1
+esp210.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+esp210.menu.lvl.None____=None
+esp210.menu.lvl.None____.build.debug_level=
+esp210.menu.optim.Smallest=None
+esp210.menu.optim.Smallest.build.debug_optim=-Os
+esp210.menu.optim.Lite=Lite
+esp210.menu.optim.Lite.build.debug_optim=-Os -fno-optimize-sibling-calls
+esp210.menu.optim.Full=Optimum
+esp210.menu.optim.Full.build.debug_optim=-Og
+esp210.menu.lvl.SSL=SSL
+esp210.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+esp210.menu.lvl.TLS_MEM=TLS_MEM
+esp210.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+esp210.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+esp210.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+esp210.menu.lvl.HTTP_SERVER=HTTP_SERVER
+esp210.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+esp210.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+esp210.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+esp210.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+esp210.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+esp210.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+esp210.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+esp210.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+esp210.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+esp210.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+esp210.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+esp210.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+esp210.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+esp210.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+esp210.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+esp210.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+esp210.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+esp210.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+esp210.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+esp210.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+esp210.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+esp210.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+esp210.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+esp210.menu.lvl.CORE=CORE
+esp210.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+esp210.menu.lvl.WIFI=WIFI
+esp210.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+esp210.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+esp210.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+esp210.menu.lvl.UPDATER=UPDATER
+esp210.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+esp210.menu.lvl.OTA=OTA
+esp210.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+esp210.menu.lvl.OOM=OOM
+esp210.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+esp210.menu.lvl.MDNS=MDNS
+esp210.menu.lvl.MDNS.build.debug_level= -DDEBUG_ESP_MDNS
+esp210.menu.lvl.HWDT=HWDT
+esp210.menu.lvl.HWDT.build.debug_level= -DDEBUG_ESP_HWDT
+esp210.menu.lvl.HWDT_NOEXTRA4K=HWDT_NOEXTRA4K
+esp210.menu.lvl.HWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_HWDT_NOEXTRA4K
+esp210.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+esp210.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+esp210.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+esp210.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+esp210.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+esp210.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+esp210.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+esp210.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+esp210.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+esp210.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+esp210.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+esp210.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+esp210.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+esp210.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+esp210.menu.wipe.none=Only Sketch
+esp210.menu.wipe.none.upload.erase_cmd=
+esp210.menu.wipe.sdk=Sketch + WiFi Settings
+esp210.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
+esp210.menu.wipe.all=All Flash Contents
+esp210.menu.wipe.all.upload.erase_cmd=erase_flash
+esp210.menu.baud.57600=57600
+esp210.menu.baud.57600.upload.speed=57600
+esp210.menu.baud.115200=115200
+esp210.menu.baud.115200.upload.speed=115200
+esp210.menu.baud.230400.linux=230400
+esp210.menu.baud.230400.macosx=230400
+esp210.menu.baud.230400.upload.speed=230400
+esp210.menu.baud.256000.windows=256000
+esp210.menu.baud.256000.upload.speed=256000
+esp210.menu.baud.460800.linux=460800
+esp210.menu.baud.460800.macosx=460800
+esp210.menu.baud.460800.upload.speed=460800
+esp210.menu.baud.512000.windows=512000
+esp210.menu.baud.512000.upload.speed=512000
+esp210.menu.baud.921600=921600
+esp210.menu.baud.921600.upload.speed=921600
+esp210.menu.baud.3000000=3000000
+esp210.menu.baud.3000000.upload.speed=3000000
+esp210.menu.eesz.autoflash=Mapping defined by Hardware and Sketch
+esp210.menu.eesz.autoflash.build.flash_size=16M
+esp210.menu.eesz.autoflash.build.flash_ld=eagle.flash.auto.ld
+esp210.menu.eesz.autoflash.build.extra_flags=-DFLASH_MAP_SUPPORT=1
+esp210.menu.eesz.autoflash.upload.maximum_size=1044464
+esp210.menu.iramfloat.no=in IROM
+esp210.menu.iramfloat.no.build.iramfloat=-DFP_IN_IROM
+esp210.menu.iramfloat.yes=allowed in ISR
+esp210.menu.iramfloat.yes.build.iramfloat=-DFP_IN_IRAM
##############################################################
espinotee.name=ThaiEasyElec's ESPino
-
+espinotee.build.board=ESP8266_ESPINO_ESP13
+espinotee.build.variant=espinotee
espinotee.upload.tool=esptool
-espinotee.upload.speed=115200
-espinotee.upload.resetmethod=nodemcu
-espinotee.upload.maximum_size=1044464
espinotee.upload.maximum_data_size=81920
espinotee.upload.wait_for_upload_port=true
+espinotee.upload.erase_cmd=
espinotee.serial.disableDTR=true
espinotee.serial.disableRTS=true
-
espinotee.build.mcu=esp8266
-espinotee.build.f_cpu=80000000L
-espinotee.build.board=ESP8266_ESP13
espinotee.build.core=esp8266
-espinotee.build.variant=espinotee
-espinotee.build.flash_mode=qio
-espinotee.build.flash_size=4M
-espinotee.build.flash_freq=40
+espinotee.build.spiffs_pagesize=256
+espinotee.build.debug_optim=
espinotee.build.debug_port=
espinotee.build.debug_level=
+espinotee.menu.xtal.80=80 MHz
+espinotee.menu.xtal.80.build.f_cpu=80000000L
+espinotee.menu.xtal.160=160 MHz
+espinotee.menu.xtal.160.build.f_cpu=160000000L
+espinotee.menu.vt.flash=Flash
+espinotee.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+espinotee.menu.vt.heap=Heap
+espinotee.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+espinotee.menu.vt.iram=IRAM
+espinotee.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+espinotee.menu.exception.disabled=Disabled (new aborts on oom)
+espinotee.menu.exception.disabled.build.exception_flags=-fno-exceptions
+espinotee.menu.exception.disabled.build.stdcpp_lib=-lstdc++
+espinotee.menu.exception.enabled=Enabled
+espinotee.menu.exception.enabled.build.exception_flags=-fexceptions
+espinotee.menu.exception.enabled.build.stdcpp_lib=-lstdc++-exc
+espinotee.menu.stacksmash.disabled=Disabled
+espinotee.menu.stacksmash.disabled.build.stacksmash_flags=
+espinotee.menu.stacksmash.enabled=Enabled
+espinotee.menu.stacksmash.enabled.build.stacksmash_flags=-fstack-protector
+espinotee.menu.ssl.all=All SSL ciphers (most compatible)
+espinotee.menu.ssl.all.build.sslflags=
+espinotee.menu.ssl.basic=Basic SSL ciphers (lower ROM use)
+espinotee.menu.ssl.basic.build.sslflags=-DBEARSSL_SSL_BASIC
+espinotee.menu.mmu.3232=32KB cache + 32KB IRAM (balanced)
+espinotee.menu.mmu.3232.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+espinotee.menu.mmu.4816=16KB cache + 48KB IRAM (IRAM)
+espinotee.menu.mmu.4816.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000
+espinotee.menu.mmu.4816H=16KB cache + 48KB IRAM and 2nd Heap (shared)
+espinotee.menu.mmu.4816H.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_IRAM_HEAP
+espinotee.menu.mmu.3216=16KB cache + 32KB IRAM + 16KB 2nd Heap (not shared)
+espinotee.menu.mmu.3216.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_SEC_HEAP=0x40108000 -DMMU_SEC_HEAP_SIZE=0x4000
+espinotee.menu.mmu.ext128k=128K Heap External 23LC1024
+espinotee.menu.mmu.ext128k.build.mmuflags=-DMMU_EXTERNAL_HEAP=128 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+espinotee.menu.mmu.ext8192k=8M w/256K Heap External 64 MBit PSRAM
+espinotee.menu.mmu.ext8192k.build.mmuflags=-DMMU_EXTERNAL_HEAP=256 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+espinotee.menu.non32xfer.fast=Use pgm_read macros for IRAM/PROGMEM
+espinotee.menu.non32xfer.fast.build.non32xferflags=
+espinotee.menu.non32xfer.safe=Byte/Word access to IRAM/PROGMEM (very slow)
+espinotee.menu.non32xfer.safe.build.non32xferflags=-DNON32XFER_HANDLER
+espinotee.upload.resetmethod=--before default_reset --after hard_reset
+espinotee.build.flash_mode=qio
+espinotee.build.flash_flags=-DFLASHMODE_QIO
+espinotee.build.flash_freq=40
+espinotee.menu.eesz.4M2M=4MB (FS:2MB OTA:~1019KB)
+espinotee.menu.eesz.4M2M.build.flash_size=4M
+espinotee.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
+espinotee.menu.eesz.4M2M.build.spiffs_pagesize=256
+espinotee.menu.eesz.4M2M.build.rfcal_addr=0x3FC000
+espinotee.menu.eesz.4M2M.build.spiffs_start=0x200000
+espinotee.menu.eesz.4M2M.build.spiffs_end=0x3FA000
+espinotee.menu.eesz.4M2M.build.spiffs_blocksize=8192
+espinotee.menu.eesz.4M3M=4MB (FS:3MB OTA:~512KB)
+espinotee.menu.eesz.4M3M.build.flash_size=4M
+espinotee.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
+espinotee.menu.eesz.4M3M.build.spiffs_pagesize=256
+espinotee.menu.eesz.4M3M.build.rfcal_addr=0x3FC000
+espinotee.menu.eesz.4M3M.build.spiffs_start=0x100000
+espinotee.menu.eesz.4M3M.build.spiffs_end=0x3FA000
+espinotee.menu.eesz.4M3M.build.spiffs_blocksize=8192
+espinotee.menu.eesz.4M1M=4MB (FS:1MB OTA:~1019KB)
+espinotee.menu.eesz.4M1M.build.flash_size=4M
+espinotee.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
+espinotee.menu.eesz.4M1M.build.spiffs_pagesize=256
+espinotee.menu.eesz.4M1M.build.rfcal_addr=0x3FC000
+espinotee.menu.eesz.4M1M.build.spiffs_start=0x300000
+espinotee.menu.eesz.4M1M.build.spiffs_end=0x3FA000
+espinotee.menu.eesz.4M1M.build.spiffs_blocksize=8192
+espinotee.menu.eesz.4M=4MB (FS:none OTA:~1019KB)
+espinotee.menu.eesz.4M.build.flash_size=4M
+espinotee.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
+espinotee.menu.eesz.4M.build.spiffs_pagesize=256
+espinotee.menu.eesz.4M.build.rfcal_addr=0x3FC000
+espinotee.menu.ip.lm2f=v2 Lower Memory
+espinotee.menu.ip.lm2f.build.lwip_include=lwip2/include
+espinotee.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+espinotee.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+espinotee.menu.ip.hb2f=v2 Higher Bandwidth
+espinotee.menu.ip.hb2f.build.lwip_include=lwip2/include
+espinotee.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+espinotee.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+espinotee.menu.ip.lm2n=v2 Lower Memory (no features)
+espinotee.menu.ip.lm2n.build.lwip_include=lwip2/include
+espinotee.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+espinotee.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+espinotee.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+espinotee.menu.ip.hb2n.build.lwip_include=lwip2/include
+espinotee.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+espinotee.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+espinotee.menu.ip.lm6f=v2 IPv6 Lower Memory
+espinotee.menu.ip.lm6f.build.lwip_include=lwip2/include
+espinotee.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+espinotee.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+espinotee.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+espinotee.menu.ip.hb6f.build.lwip_include=lwip2/include
+espinotee.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+espinotee.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+espinotee.menu.dbg.Disabled=Disabled
+espinotee.menu.dbg.Disabled.build.debug_port=
+espinotee.menu.dbg.Serial=Serial
+espinotee.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+espinotee.menu.dbg.Serial1=Serial1
+espinotee.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+espinotee.menu.lvl.None____=None
+espinotee.menu.lvl.None____.build.debug_level=
+espinotee.menu.optim.Smallest=None
+espinotee.menu.optim.Smallest.build.debug_optim=-Os
+espinotee.menu.optim.Lite=Lite
+espinotee.menu.optim.Lite.build.debug_optim=-Os -fno-optimize-sibling-calls
+espinotee.menu.optim.Full=Optimum
+espinotee.menu.optim.Full.build.debug_optim=-Og
+espinotee.menu.lvl.SSL=SSL
+espinotee.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+espinotee.menu.lvl.TLS_MEM=TLS_MEM
+espinotee.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+espinotee.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+espinotee.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+espinotee.menu.lvl.HTTP_SERVER=HTTP_SERVER
+espinotee.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+espinotee.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+espinotee.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+espinotee.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+espinotee.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+espinotee.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+espinotee.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+espinotee.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+espinotee.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+espinotee.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+espinotee.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+espinotee.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+espinotee.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+espinotee.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+espinotee.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+espinotee.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+espinotee.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+espinotee.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+espinotee.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+espinotee.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+espinotee.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+espinotee.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+espinotee.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+espinotee.menu.lvl.CORE=CORE
+espinotee.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+espinotee.menu.lvl.WIFI=WIFI
+espinotee.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+espinotee.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+espinotee.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+espinotee.menu.lvl.UPDATER=UPDATER
+espinotee.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+espinotee.menu.lvl.OTA=OTA
+espinotee.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+espinotee.menu.lvl.OOM=OOM
+espinotee.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+espinotee.menu.lvl.MDNS=MDNS
+espinotee.menu.lvl.MDNS.build.debug_level= -DDEBUG_ESP_MDNS
+espinotee.menu.lvl.HWDT=HWDT
+espinotee.menu.lvl.HWDT.build.debug_level= -DDEBUG_ESP_HWDT
+espinotee.menu.lvl.HWDT_NOEXTRA4K=HWDT_NOEXTRA4K
+espinotee.menu.lvl.HWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_HWDT_NOEXTRA4K
+espinotee.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+espinotee.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+espinotee.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+espinotee.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+espinotee.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+espinotee.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+espinotee.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+espinotee.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+espinotee.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+espinotee.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+espinotee.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+espinotee.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+espinotee.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+espinotee.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+espinotee.menu.wipe.none=Only Sketch
+espinotee.menu.wipe.none.upload.erase_cmd=
+espinotee.menu.wipe.sdk=Sketch + WiFi Settings
+espinotee.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
+espinotee.menu.wipe.all=All Flash Contents
+espinotee.menu.wipe.all.upload.erase_cmd=erase_flash
+espinotee.menu.baud.115200=115200
+espinotee.menu.baud.115200.upload.speed=115200
+espinotee.menu.baud.57600=57600
+espinotee.menu.baud.57600.upload.speed=57600
+espinotee.menu.baud.230400.linux=230400
+espinotee.menu.baud.230400.macosx=230400
+espinotee.menu.baud.230400.upload.speed=230400
+espinotee.menu.baud.256000.windows=256000
+espinotee.menu.baud.256000.upload.speed=256000
+espinotee.menu.baud.460800.linux=460800
+espinotee.menu.baud.460800.macosx=460800
+espinotee.menu.baud.460800.upload.speed=460800
+espinotee.menu.baud.512000.windows=512000
+espinotee.menu.baud.512000.upload.speed=512000
+espinotee.menu.baud.921600=921600
+espinotee.menu.baud.921600.upload.speed=921600
+espinotee.menu.baud.3000000=3000000
+espinotee.menu.baud.3000000.upload.speed=3000000
+espinotee.menu.eesz.autoflash=Mapping defined by Hardware and Sketch
+espinotee.menu.eesz.autoflash.build.flash_size=16M
+espinotee.menu.eesz.autoflash.build.flash_ld=eagle.flash.auto.ld
+espinotee.menu.eesz.autoflash.build.extra_flags=-DFLASH_MAP_SUPPORT=1
+espinotee.menu.eesz.autoflash.upload.maximum_size=1044464
+espinotee.menu.iramfloat.no=in IROM
+espinotee.menu.iramfloat.no.build.iramfloat=-DFP_IN_IROM
+espinotee.menu.iramfloat.yes=allowed in ISR
+espinotee.menu.iramfloat.yes.build.iramfloat=-DFP_IN_IRAM
-espinotee.menu.CpuFrequency.80=80 MHz
-espinotee.menu.CpuFrequency.80.build.f_cpu=80000000L
-espinotee.menu.CpuFrequency.160=160 MHz
-espinotee.menu.CpuFrequency.160.build.f_cpu=160000000L
-
-espinotee.menu.UploadSpeed.115200=115200
-espinotee.menu.UploadSpeed.115200.upload.speed=115200
-espinotee.menu.UploadSpeed.9600=9600
-espinotee.menu.UploadSpeed.9600.upload.speed=9600
-espinotee.menu.UploadSpeed.57600=57600
-espinotee.menu.UploadSpeed.57600.upload.speed=57600
-espinotee.menu.UploadSpeed.256000.windows=256000
-espinotee.menu.UploadSpeed.256000.upload.speed=256000
-espinotee.menu.UploadSpeed.230400.linux=230400
-espinotee.menu.UploadSpeed.230400.macosx=230400
-espinotee.menu.UploadSpeed.230400.macosx=230400
-espinotee.menu.UploadSpeed.230400.upload.speed=230400
-espinotee.menu.UploadSpeed.460800.linux=460800
-espinotee.menu.UploadSpeed.460800.macosx=460800
-espinotee.menu.UploadSpeed.460800.upload.speed=460800
-espinotee.menu.UploadSpeed.512000.windows=512000
-espinotee.menu.UploadSpeed.512000.upload.speed=512000
-espinotee.menu.UploadSpeed.921600=921600
-espinotee.menu.UploadSpeed.921600.upload.speed=921600
-
-espinotee.menu.FlashSize.4M3M=4M (3M SPIFFS)
-espinotee.menu.FlashSize.4M3M.build.flash_size=4M
-espinotee.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld
-espinotee.menu.FlashSize.4M3M.build.spiffs_start=0x100000
-espinotee.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000
-espinotee.menu.FlashSize.4M3M.build.spiffs_blocksize=8192
-espinotee.menu.FlashSize.4M3M.build.spiffs_pagesize=256
+##############################################################
+wifi_kit_8.name=WiFi Kit 8
+wifi_kit_8.build.board=wifi_kit_8
+wifi_kit_8.build.variant=wifi_kit_8
+wifi_kit_8.upload.tool=esptool
+wifi_kit_8.upload.maximum_data_size=81920
+wifi_kit_8.upload.wait_for_upload_port=true
+wifi_kit_8.upload.erase_cmd=
+wifi_kit_8.serial.disableDTR=true
+wifi_kit_8.serial.disableRTS=true
+wifi_kit_8.build.mcu=esp8266
+wifi_kit_8.build.core=esp8266
+wifi_kit_8.build.spiffs_pagesize=256
+wifi_kit_8.build.debug_optim=
+wifi_kit_8.build.debug_port=
+wifi_kit_8.build.debug_level=
+wifi_kit_8.menu.xtal.80=80 MHz
+wifi_kit_8.menu.xtal.80.build.f_cpu=80000000L
+wifi_kit_8.menu.xtal.160=160 MHz
+wifi_kit_8.menu.xtal.160.build.f_cpu=160000000L
+wifi_kit_8.menu.vt.flash=Flash
+wifi_kit_8.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+wifi_kit_8.menu.vt.heap=Heap
+wifi_kit_8.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+wifi_kit_8.menu.vt.iram=IRAM
+wifi_kit_8.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+wifi_kit_8.menu.exception.disabled=Disabled (new aborts on oom)
+wifi_kit_8.menu.exception.disabled.build.exception_flags=-fno-exceptions
+wifi_kit_8.menu.exception.disabled.build.stdcpp_lib=-lstdc++
+wifi_kit_8.menu.exception.enabled=Enabled
+wifi_kit_8.menu.exception.enabled.build.exception_flags=-fexceptions
+wifi_kit_8.menu.exception.enabled.build.stdcpp_lib=-lstdc++-exc
+wifi_kit_8.menu.stacksmash.disabled=Disabled
+wifi_kit_8.menu.stacksmash.disabled.build.stacksmash_flags=
+wifi_kit_8.menu.stacksmash.enabled=Enabled
+wifi_kit_8.menu.stacksmash.enabled.build.stacksmash_flags=-fstack-protector
+wifi_kit_8.menu.ssl.all=All SSL ciphers (most compatible)
+wifi_kit_8.menu.ssl.all.build.sslflags=
+wifi_kit_8.menu.ssl.basic=Basic SSL ciphers (lower ROM use)
+wifi_kit_8.menu.ssl.basic.build.sslflags=-DBEARSSL_SSL_BASIC
+wifi_kit_8.menu.mmu.3232=32KB cache + 32KB IRAM (balanced)
+wifi_kit_8.menu.mmu.3232.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+wifi_kit_8.menu.mmu.4816=16KB cache + 48KB IRAM (IRAM)
+wifi_kit_8.menu.mmu.4816.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000
+wifi_kit_8.menu.mmu.4816H=16KB cache + 48KB IRAM and 2nd Heap (shared)
+wifi_kit_8.menu.mmu.4816H.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_IRAM_HEAP
+wifi_kit_8.menu.mmu.3216=16KB cache + 32KB IRAM + 16KB 2nd Heap (not shared)
+wifi_kit_8.menu.mmu.3216.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_SEC_HEAP=0x40108000 -DMMU_SEC_HEAP_SIZE=0x4000
+wifi_kit_8.menu.mmu.ext128k=128K Heap External 23LC1024
+wifi_kit_8.menu.mmu.ext128k.build.mmuflags=-DMMU_EXTERNAL_HEAP=128 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+wifi_kit_8.menu.mmu.ext8192k=8M w/256K Heap External 64 MBit PSRAM
+wifi_kit_8.menu.mmu.ext8192k.build.mmuflags=-DMMU_EXTERNAL_HEAP=256 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+wifi_kit_8.menu.non32xfer.fast=Use pgm_read macros for IRAM/PROGMEM
+wifi_kit_8.menu.non32xfer.fast.build.non32xferflags=
+wifi_kit_8.menu.non32xfer.safe=Byte/Word access to IRAM/PROGMEM (very slow)
+wifi_kit_8.menu.non32xfer.safe.build.non32xferflags=-DNON32XFER_HANDLER
+wifi_kit_8.upload.resetmethod=--before default_reset --after hard_reset
+wifi_kit_8.build.flash_mode=dio
+wifi_kit_8.build.flash_flags=-DFLASHMODE_DIO
+wifi_kit_8.build.flash_freq=40
+wifi_kit_8.menu.eesz.4M2M=4MB (FS:2MB OTA:~1019KB)
+wifi_kit_8.menu.eesz.4M2M.build.flash_size=4M
+wifi_kit_8.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
+wifi_kit_8.menu.eesz.4M2M.build.spiffs_pagesize=256
+wifi_kit_8.menu.eesz.4M2M.build.rfcal_addr=0x3FC000
+wifi_kit_8.menu.eesz.4M2M.build.spiffs_start=0x200000
+wifi_kit_8.menu.eesz.4M2M.build.spiffs_end=0x3FA000
+wifi_kit_8.menu.eesz.4M2M.build.spiffs_blocksize=8192
+wifi_kit_8.menu.eesz.4M3M=4MB (FS:3MB OTA:~512KB)
+wifi_kit_8.menu.eesz.4M3M.build.flash_size=4M
+wifi_kit_8.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
+wifi_kit_8.menu.eesz.4M3M.build.spiffs_pagesize=256
+wifi_kit_8.menu.eesz.4M3M.build.rfcal_addr=0x3FC000
+wifi_kit_8.menu.eesz.4M3M.build.spiffs_start=0x100000
+wifi_kit_8.menu.eesz.4M3M.build.spiffs_end=0x3FA000
+wifi_kit_8.menu.eesz.4M3M.build.spiffs_blocksize=8192
+wifi_kit_8.menu.eesz.4M1M=4MB (FS:1MB OTA:~1019KB)
+wifi_kit_8.menu.eesz.4M1M.build.flash_size=4M
+wifi_kit_8.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
+wifi_kit_8.menu.eesz.4M1M.build.spiffs_pagesize=256
+wifi_kit_8.menu.eesz.4M1M.build.rfcal_addr=0x3FC000
+wifi_kit_8.menu.eesz.4M1M.build.spiffs_start=0x300000
+wifi_kit_8.menu.eesz.4M1M.build.spiffs_end=0x3FA000
+wifi_kit_8.menu.eesz.4M1M.build.spiffs_blocksize=8192
+wifi_kit_8.menu.eesz.4M=4MB (FS:none OTA:~1019KB)
+wifi_kit_8.menu.eesz.4M.build.flash_size=4M
+wifi_kit_8.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
+wifi_kit_8.menu.eesz.4M.build.spiffs_pagesize=256
+wifi_kit_8.menu.eesz.4M.build.rfcal_addr=0x3FC000
+wifi_kit_8.menu.ip.lm2f=v2 Lower Memory
+wifi_kit_8.menu.ip.lm2f.build.lwip_include=lwip2/include
+wifi_kit_8.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+wifi_kit_8.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+wifi_kit_8.menu.ip.hb2f=v2 Higher Bandwidth
+wifi_kit_8.menu.ip.hb2f.build.lwip_include=lwip2/include
+wifi_kit_8.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+wifi_kit_8.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+wifi_kit_8.menu.ip.lm2n=v2 Lower Memory (no features)
+wifi_kit_8.menu.ip.lm2n.build.lwip_include=lwip2/include
+wifi_kit_8.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+wifi_kit_8.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+wifi_kit_8.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+wifi_kit_8.menu.ip.hb2n.build.lwip_include=lwip2/include
+wifi_kit_8.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+wifi_kit_8.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+wifi_kit_8.menu.ip.lm6f=v2 IPv6 Lower Memory
+wifi_kit_8.menu.ip.lm6f.build.lwip_include=lwip2/include
+wifi_kit_8.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+wifi_kit_8.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+wifi_kit_8.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+wifi_kit_8.menu.ip.hb6f.build.lwip_include=lwip2/include
+wifi_kit_8.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+wifi_kit_8.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+wifi_kit_8.menu.dbg.Disabled=Disabled
+wifi_kit_8.menu.dbg.Disabled.build.debug_port=
+wifi_kit_8.menu.dbg.Serial=Serial
+wifi_kit_8.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+wifi_kit_8.menu.dbg.Serial1=Serial1
+wifi_kit_8.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+wifi_kit_8.menu.lvl.None____=None
+wifi_kit_8.menu.lvl.None____.build.debug_level=
+wifi_kit_8.menu.optim.Smallest=None
+wifi_kit_8.menu.optim.Smallest.build.debug_optim=-Os
+wifi_kit_8.menu.optim.Lite=Lite
+wifi_kit_8.menu.optim.Lite.build.debug_optim=-Os -fno-optimize-sibling-calls
+wifi_kit_8.menu.optim.Full=Optimum
+wifi_kit_8.menu.optim.Full.build.debug_optim=-Og
+wifi_kit_8.menu.lvl.SSL=SSL
+wifi_kit_8.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+wifi_kit_8.menu.lvl.TLS_MEM=TLS_MEM
+wifi_kit_8.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+wifi_kit_8.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+wifi_kit_8.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+wifi_kit_8.menu.lvl.HTTP_SERVER=HTTP_SERVER
+wifi_kit_8.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+wifi_kit_8.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+wifi_kit_8.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+wifi_kit_8.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+wifi_kit_8.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+wifi_kit_8.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+wifi_kit_8.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+wifi_kit_8.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+wifi_kit_8.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+wifi_kit_8.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+wifi_kit_8.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+wifi_kit_8.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+wifi_kit_8.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+wifi_kit_8.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+wifi_kit_8.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+wifi_kit_8.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+wifi_kit_8.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+wifi_kit_8.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+wifi_kit_8.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+wifi_kit_8.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+wifi_kit_8.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+wifi_kit_8.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+wifi_kit_8.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+wifi_kit_8.menu.lvl.CORE=CORE
+wifi_kit_8.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+wifi_kit_8.menu.lvl.WIFI=WIFI
+wifi_kit_8.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+wifi_kit_8.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+wifi_kit_8.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+wifi_kit_8.menu.lvl.UPDATER=UPDATER
+wifi_kit_8.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+wifi_kit_8.menu.lvl.OTA=OTA
+wifi_kit_8.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+wifi_kit_8.menu.lvl.OOM=OOM
+wifi_kit_8.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+wifi_kit_8.menu.lvl.MDNS=MDNS
+wifi_kit_8.menu.lvl.MDNS.build.debug_level= -DDEBUG_ESP_MDNS
+wifi_kit_8.menu.lvl.HWDT=HWDT
+wifi_kit_8.menu.lvl.HWDT.build.debug_level= -DDEBUG_ESP_HWDT
+wifi_kit_8.menu.lvl.HWDT_NOEXTRA4K=HWDT_NOEXTRA4K
+wifi_kit_8.menu.lvl.HWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_HWDT_NOEXTRA4K
+wifi_kit_8.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+wifi_kit_8.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+wifi_kit_8.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+wifi_kit_8.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+wifi_kit_8.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+wifi_kit_8.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+wifi_kit_8.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+wifi_kit_8.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+wifi_kit_8.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+wifi_kit_8.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+wifi_kit_8.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+wifi_kit_8.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+wifi_kit_8.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+wifi_kit_8.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+wifi_kit_8.menu.wipe.none=Only Sketch
+wifi_kit_8.menu.wipe.none.upload.erase_cmd=
+wifi_kit_8.menu.wipe.sdk=Sketch + WiFi Settings
+wifi_kit_8.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
+wifi_kit_8.menu.wipe.all=All Flash Contents
+wifi_kit_8.menu.wipe.all.upload.erase_cmd=erase_flash
+wifi_kit_8.menu.baud.115200=115200
+wifi_kit_8.menu.baud.115200.upload.speed=115200
+wifi_kit_8.menu.baud.57600=57600
+wifi_kit_8.menu.baud.57600.upload.speed=57600
+wifi_kit_8.menu.baud.230400.linux=230400
+wifi_kit_8.menu.baud.230400.macosx=230400
+wifi_kit_8.menu.baud.230400.upload.speed=230400
+wifi_kit_8.menu.baud.256000.windows=256000
+wifi_kit_8.menu.baud.256000.upload.speed=256000
+wifi_kit_8.menu.baud.460800.linux=460800
+wifi_kit_8.menu.baud.460800.macosx=460800
+wifi_kit_8.menu.baud.460800.upload.speed=460800
+wifi_kit_8.menu.baud.512000.windows=512000
+wifi_kit_8.menu.baud.512000.upload.speed=512000
+wifi_kit_8.menu.baud.921600=921600
+wifi_kit_8.menu.baud.921600.upload.speed=921600
+wifi_kit_8.menu.baud.3000000=3000000
+wifi_kit_8.menu.baud.3000000.upload.speed=3000000
+wifi_kit_8.menu.eesz.autoflash=Mapping defined by Hardware and Sketch
+wifi_kit_8.menu.eesz.autoflash.build.flash_size=16M
+wifi_kit_8.menu.eesz.autoflash.build.flash_ld=eagle.flash.auto.ld
+wifi_kit_8.menu.eesz.autoflash.build.extra_flags=-DFLASH_MAP_SUPPORT=1
+wifi_kit_8.menu.eesz.autoflash.upload.maximum_size=1044464
+wifi_kit_8.menu.iramfloat.no=in IROM
+wifi_kit_8.menu.iramfloat.no.build.iramfloat=-DFP_IN_IROM
+wifi_kit_8.menu.iramfloat.yes=allowed in ISR
+wifi_kit_8.menu.iramfloat.yes.build.iramfloat=-DFP_IN_IRAM
-espinotee.menu.FlashSize.4M1M=4M (1M SPIFFS)
-espinotee.menu.FlashSize.4M1M.build.flash_size=4M
-espinotee.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-espinotee.menu.FlashSize.4M1M.build.spiffs_start=0x300000
-espinotee.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000
-espinotee.menu.FlashSize.4M1M.build.spiffs_blocksize=8192
-espinotee.menu.FlashSize.4M1M.build.spiffs_pagesize=256
+##############################################################
+wifiduino.name=WiFiduino
+wifiduino.build.board=WIFIDUINO_ESP8266
+wifiduino.build.variant=wifiduino
+wifiduino.upload.tool=esptool
+wifiduino.upload.maximum_data_size=81920
+wifiduino.upload.wait_for_upload_port=true
+wifiduino.upload.erase_cmd=
+wifiduino.serial.disableDTR=true
+wifiduino.serial.disableRTS=true
+wifiduino.build.mcu=esp8266
+wifiduino.build.core=esp8266
+wifiduino.build.spiffs_pagesize=256
+wifiduino.build.debug_optim=
+wifiduino.build.debug_port=
+wifiduino.build.debug_level=
+wifiduino.menu.xtal.80=80 MHz
+wifiduino.menu.xtal.80.build.f_cpu=80000000L
+wifiduino.menu.xtal.160=160 MHz
+wifiduino.menu.xtal.160.build.f_cpu=160000000L
+wifiduino.menu.vt.flash=Flash
+wifiduino.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+wifiduino.menu.vt.heap=Heap
+wifiduino.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+wifiduino.menu.vt.iram=IRAM
+wifiduino.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+wifiduino.menu.exception.disabled=Disabled (new aborts on oom)
+wifiduino.menu.exception.disabled.build.exception_flags=-fno-exceptions
+wifiduino.menu.exception.disabled.build.stdcpp_lib=-lstdc++
+wifiduino.menu.exception.enabled=Enabled
+wifiduino.menu.exception.enabled.build.exception_flags=-fexceptions
+wifiduino.menu.exception.enabled.build.stdcpp_lib=-lstdc++-exc
+wifiduino.menu.stacksmash.disabled=Disabled
+wifiduino.menu.stacksmash.disabled.build.stacksmash_flags=
+wifiduino.menu.stacksmash.enabled=Enabled
+wifiduino.menu.stacksmash.enabled.build.stacksmash_flags=-fstack-protector
+wifiduino.menu.ssl.all=All SSL ciphers (most compatible)
+wifiduino.menu.ssl.all.build.sslflags=
+wifiduino.menu.ssl.basic=Basic SSL ciphers (lower ROM use)
+wifiduino.menu.ssl.basic.build.sslflags=-DBEARSSL_SSL_BASIC
+wifiduino.menu.mmu.3232=32KB cache + 32KB IRAM (balanced)
+wifiduino.menu.mmu.3232.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+wifiduino.menu.mmu.4816=16KB cache + 48KB IRAM (IRAM)
+wifiduino.menu.mmu.4816.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000
+wifiduino.menu.mmu.4816H=16KB cache + 48KB IRAM and 2nd Heap (shared)
+wifiduino.menu.mmu.4816H.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_IRAM_HEAP
+wifiduino.menu.mmu.3216=16KB cache + 32KB IRAM + 16KB 2nd Heap (not shared)
+wifiduino.menu.mmu.3216.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_SEC_HEAP=0x40108000 -DMMU_SEC_HEAP_SIZE=0x4000
+wifiduino.menu.mmu.ext128k=128K Heap External 23LC1024
+wifiduino.menu.mmu.ext128k.build.mmuflags=-DMMU_EXTERNAL_HEAP=128 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+wifiduino.menu.mmu.ext8192k=8M w/256K Heap External 64 MBit PSRAM
+wifiduino.menu.mmu.ext8192k.build.mmuflags=-DMMU_EXTERNAL_HEAP=256 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+wifiduino.menu.non32xfer.fast=Use pgm_read macros for IRAM/PROGMEM
+wifiduino.menu.non32xfer.fast.build.non32xferflags=
+wifiduino.menu.non32xfer.safe=Byte/Word access to IRAM/PROGMEM (very slow)
+wifiduino.menu.non32xfer.safe.build.non32xferflags=-DNON32XFER_HANDLER
+wifiduino.upload.resetmethod=--before default_reset --after hard_reset
+wifiduino.build.flash_mode=dio
+wifiduino.build.flash_flags=-DFLASHMODE_DIO
+wifiduino.build.flash_freq=40
+wifiduino.menu.eesz.4M2M=4MB (FS:2MB OTA:~1019KB)
+wifiduino.menu.eesz.4M2M.build.flash_size=4M
+wifiduino.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
+wifiduino.menu.eesz.4M2M.build.spiffs_pagesize=256
+wifiduino.menu.eesz.4M2M.build.rfcal_addr=0x3FC000
+wifiduino.menu.eesz.4M2M.build.spiffs_start=0x200000
+wifiduino.menu.eesz.4M2M.build.spiffs_end=0x3FA000
+wifiduino.menu.eesz.4M2M.build.spiffs_blocksize=8192
+wifiduino.menu.eesz.4M3M=4MB (FS:3MB OTA:~512KB)
+wifiduino.menu.eesz.4M3M.build.flash_size=4M
+wifiduino.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
+wifiduino.menu.eesz.4M3M.build.spiffs_pagesize=256
+wifiduino.menu.eesz.4M3M.build.rfcal_addr=0x3FC000
+wifiduino.menu.eesz.4M3M.build.spiffs_start=0x100000
+wifiduino.menu.eesz.4M3M.build.spiffs_end=0x3FA000
+wifiduino.menu.eesz.4M3M.build.spiffs_blocksize=8192
+wifiduino.menu.eesz.4M1M=4MB (FS:1MB OTA:~1019KB)
+wifiduino.menu.eesz.4M1M.build.flash_size=4M
+wifiduino.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
+wifiduino.menu.eesz.4M1M.build.spiffs_pagesize=256
+wifiduino.menu.eesz.4M1M.build.rfcal_addr=0x3FC000
+wifiduino.menu.eesz.4M1M.build.spiffs_start=0x300000
+wifiduino.menu.eesz.4M1M.build.spiffs_end=0x3FA000
+wifiduino.menu.eesz.4M1M.build.spiffs_blocksize=8192
+wifiduino.menu.eesz.4M=4MB (FS:none OTA:~1019KB)
+wifiduino.menu.eesz.4M.build.flash_size=4M
+wifiduino.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
+wifiduino.menu.eesz.4M.build.spiffs_pagesize=256
+wifiduino.menu.eesz.4M.build.rfcal_addr=0x3FC000
+wifiduino.menu.ip.lm2f=v2 Lower Memory
+wifiduino.menu.ip.lm2f.build.lwip_include=lwip2/include
+wifiduino.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+wifiduino.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+wifiduino.menu.ip.hb2f=v2 Higher Bandwidth
+wifiduino.menu.ip.hb2f.build.lwip_include=lwip2/include
+wifiduino.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+wifiduino.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+wifiduino.menu.ip.lm2n=v2 Lower Memory (no features)
+wifiduino.menu.ip.lm2n.build.lwip_include=lwip2/include
+wifiduino.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+wifiduino.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+wifiduino.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+wifiduino.menu.ip.hb2n.build.lwip_include=lwip2/include
+wifiduino.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+wifiduino.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+wifiduino.menu.ip.lm6f=v2 IPv6 Lower Memory
+wifiduino.menu.ip.lm6f.build.lwip_include=lwip2/include
+wifiduino.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+wifiduino.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+wifiduino.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+wifiduino.menu.ip.hb6f.build.lwip_include=lwip2/include
+wifiduino.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+wifiduino.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+wifiduino.menu.dbg.Disabled=Disabled
+wifiduino.menu.dbg.Disabled.build.debug_port=
+wifiduino.menu.dbg.Serial=Serial
+wifiduino.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+wifiduino.menu.dbg.Serial1=Serial1
+wifiduino.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+wifiduino.menu.lvl.None____=None
+wifiduino.menu.lvl.None____.build.debug_level=
+wifiduino.menu.optim.Smallest=None
+wifiduino.menu.optim.Smallest.build.debug_optim=-Os
+wifiduino.menu.optim.Lite=Lite
+wifiduino.menu.optim.Lite.build.debug_optim=-Os -fno-optimize-sibling-calls
+wifiduino.menu.optim.Full=Optimum
+wifiduino.menu.optim.Full.build.debug_optim=-Og
+wifiduino.menu.lvl.SSL=SSL
+wifiduino.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+wifiduino.menu.lvl.TLS_MEM=TLS_MEM
+wifiduino.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+wifiduino.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+wifiduino.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+wifiduino.menu.lvl.HTTP_SERVER=HTTP_SERVER
+wifiduino.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+wifiduino.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+wifiduino.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+wifiduino.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+wifiduino.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+wifiduino.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+wifiduino.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+wifiduino.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+wifiduino.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+wifiduino.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+wifiduino.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+wifiduino.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+wifiduino.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+wifiduino.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+wifiduino.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+wifiduino.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+wifiduino.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+wifiduino.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+wifiduino.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+wifiduino.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+wifiduino.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+wifiduino.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+wifiduino.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+wifiduino.menu.lvl.CORE=CORE
+wifiduino.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+wifiduino.menu.lvl.WIFI=WIFI
+wifiduino.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+wifiduino.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+wifiduino.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+wifiduino.menu.lvl.UPDATER=UPDATER
+wifiduino.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+wifiduino.menu.lvl.OTA=OTA
+wifiduino.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+wifiduino.menu.lvl.OOM=OOM
+wifiduino.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+wifiduino.menu.lvl.MDNS=MDNS
+wifiduino.menu.lvl.MDNS.build.debug_level= -DDEBUG_ESP_MDNS
+wifiduino.menu.lvl.HWDT=HWDT
+wifiduino.menu.lvl.HWDT.build.debug_level= -DDEBUG_ESP_HWDT
+wifiduino.menu.lvl.HWDT_NOEXTRA4K=HWDT_NOEXTRA4K
+wifiduino.menu.lvl.HWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_HWDT_NOEXTRA4K
+wifiduino.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+wifiduino.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+wifiduino.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+wifiduino.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+wifiduino.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+wifiduino.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+wifiduino.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+wifiduino.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+wifiduino.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+wifiduino.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+wifiduino.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+wifiduino.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+wifiduino.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+wifiduino.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+wifiduino.menu.wipe.none=Only Sketch
+wifiduino.menu.wipe.none.upload.erase_cmd=
+wifiduino.menu.wipe.sdk=Sketch + WiFi Settings
+wifiduino.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
+wifiduino.menu.wipe.all=All Flash Contents
+wifiduino.menu.wipe.all.upload.erase_cmd=erase_flash
+wifiduino.menu.baud.921600=921600
+wifiduino.menu.baud.921600.upload.speed=921600
+wifiduino.menu.baud.57600=57600
+wifiduino.menu.baud.57600.upload.speed=57600
+wifiduino.menu.baud.115200=115200
+wifiduino.menu.baud.115200.upload.speed=115200
+wifiduino.menu.baud.230400.linux=230400
+wifiduino.menu.baud.230400.macosx=230400
+wifiduino.menu.baud.230400.upload.speed=230400
+wifiduino.menu.baud.256000.windows=256000
+wifiduino.menu.baud.256000.upload.speed=256000
+wifiduino.menu.baud.460800.linux=460800
+wifiduino.menu.baud.460800.macosx=460800
+wifiduino.menu.baud.460800.upload.speed=460800
+wifiduino.menu.baud.512000.windows=512000
+wifiduino.menu.baud.512000.upload.speed=512000
+wifiduino.menu.baud.3000000=3000000
+wifiduino.menu.baud.3000000.upload.speed=3000000
+wifiduino.menu.eesz.autoflash=Mapping defined by Hardware and Sketch
+wifiduino.menu.eesz.autoflash.build.flash_size=16M
+wifiduino.menu.eesz.autoflash.build.flash_ld=eagle.flash.auto.ld
+wifiduino.menu.eesz.autoflash.build.extra_flags=-DFLASH_MAP_SUPPORT=1
+wifiduino.menu.eesz.autoflash.upload.maximum_size=1044464
+wifiduino.menu.iramfloat.no=in IROM
+wifiduino.menu.iramfloat.no.build.iramfloat=-DFP_IN_IROM
+wifiduino.menu.iramfloat.yes=allowed in ISR
+wifiduino.menu.iramfloat.yes.build.iramfloat=-DFP_IN_IRAM
##############################################################
wifinfo.name=WifInfo
-
-wifinfo.upload.tool=esptool
-wifinfo.upload.speed=115200
-wifinfo.upload.resetmethod=nodemcu
-wifinfo.upload.maximum_size=434160
-wifinfo.upload.maximum_data_size=81920
-wifinfo.upload.wait_for_upload_port=true
-wifinfo.serial.disableDTR=true
-wifinfo.serial.disableRTS=true
-
-wifinfo.build.mcu=esp8266
-wifinfo.build.f_cpu=160000000L
-wifinfo.build.core=esp8266
+wifinfo.build.board=WIFINFO
wifinfo.build.variant=wifinfo
-wifinfo.build.flash_mode=qio
-wifinfo.build.board=ESP8266_ESP12
-wifinfo.build.spiffs_pagesize=256
-wifinfo.build.debug_port=Serial1
-wifinfo.build.debug_level=Wifinfo
-
-wifinfo.menu.Debug.Disabled=Disabled
-wifinfo.menu.Debug.Disabled.build.debug_port=
-wifinfo.menu.Debug.Serial=Serial
-wifinfo.menu.Debug.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
-wifinfo.menu.Debug.Serial1=Serial1
-wifinfo.menu.Debug.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
-
-wifinfo.menu.DebugLevel.None=None
-wifinfo.menu.DebugLevel.None.build.debug_level=
-wifinfo.menu.DebugLevel.Wifinfo=Wifinfo
-wifinfo.menu.DebugLevel.Wifinfo.build.debug_level=-DDEBUG_ESP_WIFINFO
-
-#wifinfo.menu.ESPModule.ESP07512=ESP07 (1M/512K SPIFFS)
-#wifinfo.menu.ESPModule.ESP07512.build.board=ESP8266_ESP07
-#wifinfo.menu.ESPModule.ESP07512.build.flash_size=1M
-#wifinfo.menu.ESPModule.ESP07512.build.flash_ld=eagle.flash.1m512.ld
-#wifinfo.menu.ESPModule.ESP07512.build.spiffs_start=0x7B000
-#wifinfo.menu.ESPModule.ESP07512.build.spiffs_end=0xFB000
-#wifinfo.menu.ESPModule.ESP07512.build.spiffs_blocksize=8192
-#wifinfo.menu.ESPModule.ESP07512.upload.maximum_size=499696
-
-#wifinfo.menu.ESPModule.ESP07256=ESP07 (1M/256K SPIFFS)
-#wifinfo.menu.ESPModule.ESP07256.build.board=ESP8266_ESP07
-#wifinfo.menu.ESPModule.ESP07256.build.flash_size=1M
-#wifinfo.menu.ESPModule.ESP07256.build.flash_ld=eagle.flash.1m256.ld
-#wifinfo.menu.ESPModule.ESP07256.build.spiffs_start=0xBB000
-#wifinfo.menu.ESPModule.ESP07256.build.spiffs_end=0xFB000
-##wifinfo.menu.ESPModule.ESP07256.build.spiffs_blocksize=4096
-#wifinfo.menu.ESPModule.ESP07256.upload.maximum_size=761840
-
-wifinfo.menu.ESPModule.ESP07192=ESP07 (1M/192K SPIFFS)
+wifinfo.menu.ESPModule.ESP07192=ESP07 (1M/192K FS)
wifinfo.menu.ESPModule.ESP07192.build.board=ESP8266_ESP07
-wifinfo.menu.ESPModule.ESP07192.build.flash_size=1M
wifinfo.menu.ESPModule.ESP07192.build.flash_ld=eagle.flash.1m192.ld
-wifinfo.menu.ESPModule.ESP07192.build.spiffs_start=0xCB000
-wifinfo.menu.ESPModule.ESP07192.build.spiffs_end=0xFB000
+wifinfo.menu.ESPModule.ESP07192.build.flash_size=1M
wifinfo.menu.ESPModule.ESP07192.build.spiffs_blocksize=4096
+wifinfo.menu.ESPModule.ESP07192.build.spiffs_end=0xFB000
+wifinfo.menu.ESPModule.ESP07192.build.spiffs_start=0xCB000
wifinfo.menu.ESPModule.ESP07192.upload.maximum_size=827376
-
-#wifinfo.menu.ESPModule.ESP07160=ESP07 (1M/160K SPIFFS)
-#wifinfo.menu.ESPModule.ESP07160.build.board=ESP8266_ESP07
-#wifinfo.menu.ESPModule.ESP07160.build.flash_size=1M
-#wifinfo.menu.ESPModule.ESP07160.build.flash_ld=eagle.flash.1m160.ld
-#wifinfo.menu.ESPModule.ESP07160.build.spiffs_start=0xD3000
-#wifinfo.menu.ESPModule.ESP07160.build.spiffs_end=0xFB000
-#wifinfo.menu.ESPModule.ESP07160.build.spiffs_blocksize=4096
-#wifinfo.menu.ESPModule.ESP07160.upload.maximum_size=860144
-#
-#wifinfo.menu.ESPModule.ESP07144=ESP07 (1M/144K SPIFFS)
-#wifinfo.menu.ESPModule.ESP07144.build.board=ESP8266_ESP07
-#wifinfo.menu.ESPModule.ESP07144.build.flash_size=1M
-#wifinfo.menu.ESPModule.ESP07144.build.flash_ld=eagle.flash.1m144.ld
-#wifinfo.menu.ESPModule.ESP07144.build.spiffs_start=0xD7000
-#wifinfo.menu.ESPModule.ESP07144.build.spiffs_end=0xFB000
-#wifinfo.menu.ESPModule.ESP07144.build.spiffs_blocksize=4096
-#wifinfo.menu.ESPModule.ESP07144.upload.maximum_size=876528
-#
-#wifinfo.menu.ESPModule.ESP07=ESP07 (1M/64K SPIFFS)
-#wifinfo.menu.ESPModule.ESP07.build.board=ESP8266_ESP07
-#wifinfo.menu.ESPModule.ESP07.build.flash_size=1M
-#wifinfo.menu.ESPModule.ESP07.build.flash_ld=eagle.flash.1m64.ld
-#wifinfo.menu.ESPModule.ESP07.build.spiffs_start=0xEB000
-#wifinfo.menu.ESPModule.ESP07.build.spiffs_end=0xFB000
-#wifinfo.menu.ESPModule.ESP07.build.spiffs_blocksize=4096
-#wifinfo.menu.ESPModule.ESP07.upload.maximum_size=958448
-
-wifinfo.menu.ESPModule.ESP12=ESP12 (4M/1M SPIFFS)
+wifinfo.menu.ESPModule.ESP12=ESP12 (4M/1M FS)
wifinfo.menu.ESPModule.ESP12.build.board=ESP8266_ESP12
-wifinfo.menu.ESPModule.ESP12.build.flash_size=4M
wifinfo.menu.ESPModule.ESP12.build.flash_ld=eagle.flash.4m1m.ld
-wifinfo.menu.ESPModule.ESP12.build.spiffs_start=0x300000
-wifinfo.menu.ESPModule.ESP12.build.spiffs_end=0x3FB000
+wifinfo.menu.ESPModule.ESP12.build.flash_size=4M
wifinfo.menu.ESPModule.ESP12.build.spiffs_blocksize=8192
+wifinfo.menu.ESPModule.ESP12.build.spiffs_end=0x3FB000
wifinfo.menu.ESPModule.ESP12.build.spiffs_pagesize=256
+wifinfo.menu.ESPModule.ESP12.build.spiffs_start=0x300000
wifinfo.menu.ESPModule.ESP12.upload.maximum_size=1044464
-
-wifinfo.menu.CpuFrequency.80=80 MHz
-wifinfo.menu.CpuFrequency.80.build.f_cpu=80000000L
-wifinfo.menu.CpuFrequency.160=160 MHz
-wifinfo.menu.CpuFrequency.160.build.f_cpu=160000000L
-
+wifinfo.upload.tool=esptool
+wifinfo.upload.maximum_data_size=81920
+wifinfo.upload.wait_for_upload_port=true
+wifinfo.upload.erase_cmd=
+wifinfo.serial.disableDTR=true
+wifinfo.serial.disableRTS=true
+wifinfo.build.mcu=esp8266
+wifinfo.build.core=esp8266
+wifinfo.build.spiffs_pagesize=256
+wifinfo.build.debug_optim=
+wifinfo.build.debug_port=
+wifinfo.build.debug_level=
+wifinfo.menu.xtal.80=80 MHz
+wifinfo.menu.xtal.80.build.f_cpu=80000000L
+wifinfo.menu.xtal.160=160 MHz
+wifinfo.menu.xtal.160.build.f_cpu=160000000L
+wifinfo.menu.vt.flash=Flash
+wifinfo.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+wifinfo.menu.vt.heap=Heap
+wifinfo.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+wifinfo.menu.vt.iram=IRAM
+wifinfo.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+wifinfo.menu.exception.disabled=Disabled (new aborts on oom)
+wifinfo.menu.exception.disabled.build.exception_flags=-fno-exceptions
+wifinfo.menu.exception.disabled.build.stdcpp_lib=-lstdc++
+wifinfo.menu.exception.enabled=Enabled
+wifinfo.menu.exception.enabled.build.exception_flags=-fexceptions
+wifinfo.menu.exception.enabled.build.stdcpp_lib=-lstdc++-exc
+wifinfo.menu.stacksmash.disabled=Disabled
+wifinfo.menu.stacksmash.disabled.build.stacksmash_flags=
+wifinfo.menu.stacksmash.enabled=Enabled
+wifinfo.menu.stacksmash.enabled.build.stacksmash_flags=-fstack-protector
+wifinfo.menu.ssl.all=All SSL ciphers (most compatible)
+wifinfo.menu.ssl.all.build.sslflags=
+wifinfo.menu.ssl.basic=Basic SSL ciphers (lower ROM use)
+wifinfo.menu.ssl.basic.build.sslflags=-DBEARSSL_SSL_BASIC
+wifinfo.menu.mmu.3232=32KB cache + 32KB IRAM (balanced)
+wifinfo.menu.mmu.3232.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+wifinfo.menu.mmu.4816=16KB cache + 48KB IRAM (IRAM)
+wifinfo.menu.mmu.4816.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000
+wifinfo.menu.mmu.4816H=16KB cache + 48KB IRAM and 2nd Heap (shared)
+wifinfo.menu.mmu.4816H.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_IRAM_HEAP
+wifinfo.menu.mmu.3216=16KB cache + 32KB IRAM + 16KB 2nd Heap (not shared)
+wifinfo.menu.mmu.3216.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_SEC_HEAP=0x40108000 -DMMU_SEC_HEAP_SIZE=0x4000
+wifinfo.menu.mmu.ext128k=128K Heap External 23LC1024
+wifinfo.menu.mmu.ext128k.build.mmuflags=-DMMU_EXTERNAL_HEAP=128 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+wifinfo.menu.mmu.ext8192k=8M w/256K Heap External 64 MBit PSRAM
+wifinfo.menu.mmu.ext8192k.build.mmuflags=-DMMU_EXTERNAL_HEAP=256 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+wifinfo.menu.non32xfer.fast=Use pgm_read macros for IRAM/PROGMEM
+wifinfo.menu.non32xfer.fast.build.non32xferflags=
+wifinfo.menu.non32xfer.safe=Byte/Word access to IRAM/PROGMEM (very slow)
+wifinfo.menu.non32xfer.safe.build.non32xferflags=-DNON32XFER_HANDLER
+wifinfo.upload.resetmethod=--before default_reset --after hard_reset
+wifinfo.build.flash_mode=qio
+wifinfo.build.flash_flags=-DFLASHMODE_QIO
wifinfo.menu.FlashFreq.40=40MHz
wifinfo.menu.FlashFreq.40.build.flash_freq=40
wifinfo.menu.FlashFreq.80=80MHz
wifinfo.menu.FlashFreq.80.build.flash_freq=80
+wifinfo.menu.FlashFreq.20=20MHz
+wifinfo.menu.FlashFreq.20.build.flash_freq=20
+wifinfo.menu.FlashFreq.26=26MHz
+wifinfo.menu.FlashFreq.26.build.flash_freq=26
+wifinfo.menu.eesz.1M64=1MB (FS:64KB OTA:~470KB)
+wifinfo.menu.eesz.1M64.build.flash_size=1M
+wifinfo.menu.eesz.1M64.build.flash_ld=eagle.flash.1m64.ld
+wifinfo.menu.eesz.1M64.build.spiffs_pagesize=256
+wifinfo.menu.eesz.1M64.build.rfcal_addr=0xFC000
+wifinfo.menu.eesz.1M64.build.spiffs_start=0xEB000
+wifinfo.menu.eesz.1M64.build.spiffs_end=0xFB000
+wifinfo.menu.eesz.1M64.build.spiffs_blocksize=4096
+wifinfo.menu.eesz.1M128=1MB (FS:128KB OTA:~438KB)
+wifinfo.menu.eesz.1M128.build.flash_size=1M
+wifinfo.menu.eesz.1M128.build.flash_ld=eagle.flash.1m128.ld
+wifinfo.menu.eesz.1M128.build.spiffs_pagesize=256
+wifinfo.menu.eesz.1M128.build.rfcal_addr=0xFC000
+wifinfo.menu.eesz.1M128.build.spiffs_start=0xDB000
+wifinfo.menu.eesz.1M128.build.spiffs_end=0xFB000
+wifinfo.menu.eesz.1M128.build.spiffs_blocksize=4096
+wifinfo.menu.eesz.1M144=1MB (FS:144KB OTA:~430KB)
+wifinfo.menu.eesz.1M144.build.flash_size=1M
+wifinfo.menu.eesz.1M144.build.flash_ld=eagle.flash.1m144.ld
+wifinfo.menu.eesz.1M144.build.spiffs_pagesize=256
+wifinfo.menu.eesz.1M144.build.rfcal_addr=0xFC000
+wifinfo.menu.eesz.1M144.build.spiffs_start=0xD7000
+wifinfo.menu.eesz.1M144.build.spiffs_end=0xFB000
+wifinfo.menu.eesz.1M144.build.spiffs_blocksize=4096
+wifinfo.menu.eesz.1M160=1MB (FS:160KB OTA:~422KB)
+wifinfo.menu.eesz.1M160.build.flash_size=1M
+wifinfo.menu.eesz.1M160.build.flash_ld=eagle.flash.1m160.ld
+wifinfo.menu.eesz.1M160.build.spiffs_pagesize=256
+wifinfo.menu.eesz.1M160.build.rfcal_addr=0xFC000
+wifinfo.menu.eesz.1M160.build.spiffs_start=0xD3000
+wifinfo.menu.eesz.1M160.build.spiffs_end=0xFB000
+wifinfo.menu.eesz.1M160.build.spiffs_blocksize=4096
+wifinfo.menu.eesz.1M192=1MB (FS:192KB OTA:~406KB)
+wifinfo.menu.eesz.1M192.build.flash_size=1M
+wifinfo.menu.eesz.1M192.build.flash_ld=eagle.flash.1m192.ld
+wifinfo.menu.eesz.1M192.build.spiffs_pagesize=256
+wifinfo.menu.eesz.1M192.build.rfcal_addr=0xFC000
+wifinfo.menu.eesz.1M192.build.spiffs_start=0xCB000
+wifinfo.menu.eesz.1M192.build.spiffs_end=0xFB000
+wifinfo.menu.eesz.1M192.build.spiffs_blocksize=4096
+wifinfo.menu.eesz.1M256=1MB (FS:256KB OTA:~374KB)
+wifinfo.menu.eesz.1M256.build.flash_size=1M
+wifinfo.menu.eesz.1M256.build.flash_ld=eagle.flash.1m256.ld
+wifinfo.menu.eesz.1M256.build.spiffs_pagesize=256
+wifinfo.menu.eesz.1M256.build.rfcal_addr=0xFC000
+wifinfo.menu.eesz.1M256.build.spiffs_start=0xBB000
+wifinfo.menu.eesz.1M256.build.spiffs_end=0xFB000
+wifinfo.menu.eesz.1M256.build.spiffs_blocksize=4096
+wifinfo.menu.eesz.1M512=1MB (FS:512KB OTA:~246KB)
+wifinfo.menu.eesz.1M512.build.flash_size=1M
+wifinfo.menu.eesz.1M512.build.flash_ld=eagle.flash.1m512.ld
+wifinfo.menu.eesz.1M512.build.spiffs_pagesize=256
+wifinfo.menu.eesz.1M512.build.rfcal_addr=0xFC000
+wifinfo.menu.eesz.1M512.build.spiffs_start=0x7B000
+wifinfo.menu.eesz.1M512.build.spiffs_end=0xFB000
+wifinfo.menu.eesz.1M512.build.spiffs_blocksize=8192
+wifinfo.menu.eesz.1M=1MB (FS:none OTA:~502KB)
+wifinfo.menu.eesz.1M.build.flash_size=1M
+wifinfo.menu.eesz.1M.build.flash_ld=eagle.flash.1m.ld
+wifinfo.menu.eesz.1M.build.spiffs_pagesize=256
+wifinfo.menu.eesz.1M.build.rfcal_addr=0xFC000
+wifinfo.menu.ip.lm2f=v2 Lower Memory
+wifinfo.menu.ip.lm2f.build.lwip_include=lwip2/include
+wifinfo.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+wifinfo.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+wifinfo.menu.ip.hb2f=v2 Higher Bandwidth
+wifinfo.menu.ip.hb2f.build.lwip_include=lwip2/include
+wifinfo.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+wifinfo.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+wifinfo.menu.ip.lm2n=v2 Lower Memory (no features)
+wifinfo.menu.ip.lm2n.build.lwip_include=lwip2/include
+wifinfo.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+wifinfo.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+wifinfo.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+wifinfo.menu.ip.hb2n.build.lwip_include=lwip2/include
+wifinfo.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+wifinfo.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+wifinfo.menu.ip.lm6f=v2 IPv6 Lower Memory
+wifinfo.menu.ip.lm6f.build.lwip_include=lwip2/include
+wifinfo.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+wifinfo.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+wifinfo.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+wifinfo.menu.ip.hb6f.build.lwip_include=lwip2/include
+wifinfo.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+wifinfo.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+wifinfo.menu.dbg.Disabled=Disabled
+wifinfo.menu.dbg.Disabled.build.debug_port=
+wifinfo.menu.dbg.Serial=Serial
+wifinfo.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+wifinfo.menu.dbg.Serial1=Serial1
+wifinfo.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+wifinfo.menu.lvl.None____=None
+wifinfo.menu.lvl.None____.build.debug_level=
+wifinfo.menu.optim.Smallest=None
+wifinfo.menu.optim.Smallest.build.debug_optim=-Os
+wifinfo.menu.optim.Lite=Lite
+wifinfo.menu.optim.Lite.build.debug_optim=-Os -fno-optimize-sibling-calls
+wifinfo.menu.optim.Full=Optimum
+wifinfo.menu.optim.Full.build.debug_optim=-Og
+wifinfo.menu.lvl.SSL=SSL
+wifinfo.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+wifinfo.menu.lvl.TLS_MEM=TLS_MEM
+wifinfo.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+wifinfo.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+wifinfo.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+wifinfo.menu.lvl.HTTP_SERVER=HTTP_SERVER
+wifinfo.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+wifinfo.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+wifinfo.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+wifinfo.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+wifinfo.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+wifinfo.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+wifinfo.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+wifinfo.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+wifinfo.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+wifinfo.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+wifinfo.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+wifinfo.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+wifinfo.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+wifinfo.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+wifinfo.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+wifinfo.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+wifinfo.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+wifinfo.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+wifinfo.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+wifinfo.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+wifinfo.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+wifinfo.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+wifinfo.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+wifinfo.menu.lvl.CORE=CORE
+wifinfo.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+wifinfo.menu.lvl.WIFI=WIFI
+wifinfo.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+wifinfo.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+wifinfo.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+wifinfo.menu.lvl.UPDATER=UPDATER
+wifinfo.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+wifinfo.menu.lvl.OTA=OTA
+wifinfo.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+wifinfo.menu.lvl.OOM=OOM
+wifinfo.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+wifinfo.menu.lvl.MDNS=MDNS
+wifinfo.menu.lvl.MDNS.build.debug_level= -DDEBUG_ESP_MDNS
+wifinfo.menu.lvl.HWDT=HWDT
+wifinfo.menu.lvl.HWDT.build.debug_level= -DDEBUG_ESP_HWDT
+wifinfo.menu.lvl.HWDT_NOEXTRA4K=HWDT_NOEXTRA4K
+wifinfo.menu.lvl.HWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_HWDT_NOEXTRA4K
+wifinfo.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+wifinfo.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+wifinfo.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+wifinfo.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+wifinfo.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+wifinfo.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+wifinfo.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+wifinfo.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+wifinfo.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+wifinfo.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+wifinfo.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+wifinfo.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+wifinfo.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+wifinfo.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+wifinfo.menu.wipe.none=Only Sketch
+wifinfo.menu.wipe.none.upload.erase_cmd=
+wifinfo.menu.wipe.sdk=Sketch + WiFi Settings
+wifinfo.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
+wifinfo.menu.wipe.all=All Flash Contents
+wifinfo.menu.wipe.all.upload.erase_cmd=erase_flash
+wifinfo.menu.baud.115200=115200
+wifinfo.menu.baud.115200.upload.speed=115200
+wifinfo.menu.baud.57600=57600
+wifinfo.menu.baud.57600.upload.speed=57600
+wifinfo.menu.baud.230400.linux=230400
+wifinfo.menu.baud.230400.macosx=230400
+wifinfo.menu.baud.230400.upload.speed=230400
+wifinfo.menu.baud.256000.windows=256000
+wifinfo.menu.baud.256000.upload.speed=256000
+wifinfo.menu.baud.460800.linux=460800
+wifinfo.menu.baud.460800.macosx=460800
+wifinfo.menu.baud.460800.upload.speed=460800
+wifinfo.menu.baud.512000.windows=512000
+wifinfo.menu.baud.512000.upload.speed=512000
+wifinfo.menu.baud.921600=921600
+wifinfo.menu.baud.921600.upload.speed=921600
+wifinfo.menu.baud.3000000=3000000
+wifinfo.menu.baud.3000000.upload.speed=3000000
+wifinfo.menu.eesz.autoflash=Mapping defined by Hardware and Sketch
+wifinfo.menu.eesz.autoflash.build.flash_size=16M
+wifinfo.menu.eesz.autoflash.build.flash_ld=eagle.flash.auto.ld
+wifinfo.menu.eesz.autoflash.build.extra_flags=-DFLASH_MAP_SUPPORT=1
+wifinfo.menu.eesz.autoflash.upload.maximum_size=1044464
+wifinfo.menu.iramfloat.no=in IROM
+wifinfo.menu.iramfloat.no.build.iramfloat=-DFP_IN_IROM
+wifinfo.menu.iramfloat.yes=allowed in ISR
+wifinfo.menu.iramfloat.yes.build.iramfloat=-DFP_IN_IRAM
-wifinfo.menu.FlashMode.dio=DIO
-wifinfo.menu.FlashMode.dio.build.flash_mode=dio
-wifinfo.menu.FlashMode.qio=QIO
-wifinfo.menu.FlashMode.qio.build.flash_mode=qio
+##############################################################
+cw01.name=XinaBox CW01
+cw01.build.board=ESP8266_XINABOX_CW01
+cw01.build.variant=xinabox
+cw01.upload.tool=esptool
+cw01.upload.maximum_data_size=81920
+cw01.upload.wait_for_upload_port=true
+cw01.upload.erase_cmd=
+cw01.serial.disableDTR=true
+cw01.serial.disableRTS=true
+cw01.build.mcu=esp8266
+cw01.build.core=esp8266
+cw01.build.spiffs_pagesize=256
+cw01.build.debug_optim=
+cw01.build.debug_port=
+cw01.build.debug_level=
+cw01.menu.xtal.80=80 MHz
+cw01.menu.xtal.80.build.f_cpu=80000000L
+cw01.menu.xtal.160=160 MHz
+cw01.menu.xtal.160.build.f_cpu=160000000L
+cw01.menu.vt.flash=Flash
+cw01.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH
+cw01.menu.vt.heap=Heap
+cw01.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM
+cw01.menu.vt.iram=IRAM
+cw01.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM
+cw01.menu.exception.disabled=Disabled (new aborts on oom)
+cw01.menu.exception.disabled.build.exception_flags=-fno-exceptions
+cw01.menu.exception.disabled.build.stdcpp_lib=-lstdc++
+cw01.menu.exception.enabled=Enabled
+cw01.menu.exception.enabled.build.exception_flags=-fexceptions
+cw01.menu.exception.enabled.build.stdcpp_lib=-lstdc++-exc
+cw01.menu.stacksmash.disabled=Disabled
+cw01.menu.stacksmash.disabled.build.stacksmash_flags=
+cw01.menu.stacksmash.enabled=Enabled
+cw01.menu.stacksmash.enabled.build.stacksmash_flags=-fstack-protector
+cw01.menu.ssl.all=All SSL ciphers (most compatible)
+cw01.menu.ssl.all.build.sslflags=
+cw01.menu.ssl.basic=Basic SSL ciphers (lower ROM use)
+cw01.menu.ssl.basic.build.sslflags=-DBEARSSL_SSL_BASIC
+cw01.menu.mmu.3232=32KB cache + 32KB IRAM (balanced)
+cw01.menu.mmu.3232.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+cw01.menu.mmu.4816=16KB cache + 48KB IRAM (IRAM)
+cw01.menu.mmu.4816.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000
+cw01.menu.mmu.4816H=16KB cache + 48KB IRAM and 2nd Heap (shared)
+cw01.menu.mmu.4816H.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_IRAM_HEAP
+cw01.menu.mmu.3216=16KB cache + 32KB IRAM + 16KB 2nd Heap (not shared)
+cw01.menu.mmu.3216.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_SEC_HEAP=0x40108000 -DMMU_SEC_HEAP_SIZE=0x4000
+cw01.menu.mmu.ext128k=128K Heap External 23LC1024
+cw01.menu.mmu.ext128k.build.mmuflags=-DMMU_EXTERNAL_HEAP=128 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+cw01.menu.mmu.ext8192k=8M w/256K Heap External 64 MBit PSRAM
+cw01.menu.mmu.ext8192k.build.mmuflags=-DMMU_EXTERNAL_HEAP=256 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000
+cw01.menu.non32xfer.fast=Use pgm_read macros for IRAM/PROGMEM
+cw01.menu.non32xfer.fast.build.non32xferflags=
+cw01.menu.non32xfer.safe=Byte/Word access to IRAM/PROGMEM (very slow)
+cw01.menu.non32xfer.safe.build.non32xferflags=-DNON32XFER_HANDLER
+cw01.upload.resetmethod=--before default_reset --after hard_reset
+cw01.menu.CrystalFreq.26=26 MHz
+cw01.menu.CrystalFreq.40=40 MHz
+cw01.menu.CrystalFreq.40.build.extra_flags=-DF_CRYSTAL=40000000
+cw01.build.flash_mode=dio
+cw01.build.flash_flags=-DFLASHMODE_DIO
+cw01.build.flash_freq=40
+cw01.menu.eesz.4M2M=4MB (FS:2MB OTA:~1019KB)
+cw01.menu.eesz.4M2M.build.flash_size=4M
+cw01.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
+cw01.menu.eesz.4M2M.build.spiffs_pagesize=256
+cw01.menu.eesz.4M2M.build.rfcal_addr=0x3FC000
+cw01.menu.eesz.4M2M.build.spiffs_start=0x200000
+cw01.menu.eesz.4M2M.build.spiffs_end=0x3FA000
+cw01.menu.eesz.4M2M.build.spiffs_blocksize=8192
+cw01.menu.eesz.4M3M=4MB (FS:3MB OTA:~512KB)
+cw01.menu.eesz.4M3M.build.flash_size=4M
+cw01.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
+cw01.menu.eesz.4M3M.build.spiffs_pagesize=256
+cw01.menu.eesz.4M3M.build.rfcal_addr=0x3FC000
+cw01.menu.eesz.4M3M.build.spiffs_start=0x100000
+cw01.menu.eesz.4M3M.build.spiffs_end=0x3FA000
+cw01.menu.eesz.4M3M.build.spiffs_blocksize=8192
+cw01.menu.eesz.4M1M=4MB (FS:1MB OTA:~1019KB)
+cw01.menu.eesz.4M1M.build.flash_size=4M
+cw01.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
+cw01.menu.eesz.4M1M.build.spiffs_pagesize=256
+cw01.menu.eesz.4M1M.build.rfcal_addr=0x3FC000
+cw01.menu.eesz.4M1M.build.spiffs_start=0x300000
+cw01.menu.eesz.4M1M.build.spiffs_end=0x3FA000
+cw01.menu.eesz.4M1M.build.spiffs_blocksize=8192
+cw01.menu.eesz.4M=4MB (FS:none OTA:~1019KB)
+cw01.menu.eesz.4M.build.flash_size=4M
+cw01.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
+cw01.menu.eesz.4M.build.spiffs_pagesize=256
+cw01.menu.eesz.4M.build.rfcal_addr=0x3FC000
+cw01.menu.ip.lm2f=v2 Lower Memory
+cw01.menu.ip.lm2f.build.lwip_include=lwip2/include
+cw01.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat
+cw01.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+cw01.menu.ip.hb2f=v2 Higher Bandwidth
+cw01.menu.ip.hb2f.build.lwip_include=lwip2/include
+cw01.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat
+cw01.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0
+cw01.menu.ip.lm2n=v2 Lower Memory (no features)
+cw01.menu.ip.lm2n.build.lwip_include=lwip2/include
+cw01.menu.ip.lm2n.build.lwip_lib=-llwip2-536
+cw01.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+cw01.menu.ip.hb2n=v2 Higher Bandwidth (no features)
+cw01.menu.ip.hb2n.build.lwip_include=lwip2/include
+cw01.menu.ip.hb2n.build.lwip_lib=-llwip2-1460
+cw01.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0
+cw01.menu.ip.lm6f=v2 IPv6 Lower Memory
+cw01.menu.ip.lm6f.build.lwip_include=lwip2/include
+cw01.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat
+cw01.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+cw01.menu.ip.hb6f=v2 IPv6 Higher Bandwidth
+cw01.menu.ip.hb6f.build.lwip_include=lwip2/include
+cw01.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat
+cw01.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1
+cw01.menu.dbg.Disabled=Disabled
+cw01.menu.dbg.Disabled.build.debug_port=
+cw01.menu.dbg.Serial=Serial
+cw01.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial
+cw01.menu.dbg.Serial1=Serial1
+cw01.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1
+cw01.menu.lvl.None____=None
+cw01.menu.lvl.None____.build.debug_level=
+cw01.menu.optim.Smallest=None
+cw01.menu.optim.Smallest.build.debug_optim=-Os
+cw01.menu.optim.Lite=Lite
+cw01.menu.optim.Lite.build.debug_optim=-Os -fno-optimize-sibling-calls
+cw01.menu.optim.Full=Optimum
+cw01.menu.optim.Full.build.debug_optim=-Og
+cw01.menu.lvl.SSL=SSL
+cw01.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL
+cw01.menu.lvl.TLS_MEM=TLS_MEM
+cw01.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM
+cw01.menu.lvl.HTTP_CLIENT=HTTP_CLIENT
+cw01.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT
+cw01.menu.lvl.HTTP_SERVER=HTTP_SERVER
+cw01.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER
+cw01.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM
+cw01.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM
+cw01.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT
+cw01.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT
+cw01.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER
+cw01.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER
+cw01.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT
+cw01.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+cw01.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER
+cw01.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+cw01.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER
+cw01.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+cw01.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT
+cw01.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT
+cw01.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER
+cw01.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER
+cw01.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER
+cw01.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+cw01.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+cw01.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+cw01.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER
+cw01.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER
+cw01.menu.lvl.CORE=CORE
+cw01.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE
+cw01.menu.lvl.WIFI=WIFI
+cw01.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI
+cw01.menu.lvl.HTTP_UPDATE=HTTP_UPDATE
+cw01.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE
+cw01.menu.lvl.UPDATER=UPDATER
+cw01.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER
+cw01.menu.lvl.OTA=OTA
+cw01.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA
+cw01.menu.lvl.OOM=OOM
+cw01.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM
+cw01.menu.lvl.MDNS=MDNS
+cw01.menu.lvl.MDNS.build.debug_level= -DDEBUG_ESP_MDNS
+cw01.menu.lvl.HWDT=HWDT
+cw01.menu.lvl.HWDT.build.debug_level= -DDEBUG_ESP_HWDT
+cw01.menu.lvl.HWDT_NOEXTRA4K=HWDT_NOEXTRA4K
+cw01.menu.lvl.HWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_HWDT_NOEXTRA4K
+cw01.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+cw01.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+cw01.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+cw01.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+cw01.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+cw01.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+cw01.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS
+cw01.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS
+cw01.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT
+cw01.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT
+cw01.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K
+cw01.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K
+cw01.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
+cw01.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
+cw01.menu.wipe.none=Only Sketch
+cw01.menu.wipe.none.upload.erase_cmd=
+cw01.menu.wipe.sdk=Sketch + WiFi Settings
+cw01.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
+cw01.menu.wipe.all=All Flash Contents
+cw01.menu.wipe.all.upload.erase_cmd=erase_flash
+cw01.menu.baud.115200=115200
+cw01.menu.baud.115200.upload.speed=115200
+cw01.menu.baud.57600=57600
+cw01.menu.baud.57600.upload.speed=57600
+cw01.menu.baud.230400.linux=230400
+cw01.menu.baud.230400.macosx=230400
+cw01.menu.baud.230400.upload.speed=230400
+cw01.menu.baud.256000.windows=256000
+cw01.menu.baud.256000.upload.speed=256000
+cw01.menu.baud.460800.linux=460800
+cw01.menu.baud.460800.macosx=460800
+cw01.menu.baud.460800.upload.speed=460800
+cw01.menu.baud.512000.windows=512000
+cw01.menu.baud.512000.upload.speed=512000
+cw01.menu.baud.921600=921600
+cw01.menu.baud.921600.upload.speed=921600
+cw01.menu.baud.3000000=3000000
+cw01.menu.baud.3000000.upload.speed=3000000
+cw01.menu.eesz.autoflash=Mapping defined by Hardware and Sketch
+cw01.menu.eesz.autoflash.build.flash_size=16M
+cw01.menu.eesz.autoflash.build.flash_ld=eagle.flash.auto.ld
+cw01.menu.eesz.autoflash.build.extra_flags=-DFLASH_MAP_SUPPORT=1
+cw01.menu.eesz.autoflash.upload.maximum_size=1044464
+cw01.menu.iramfloat.no=in IROM
+cw01.menu.iramfloat.no.build.iramfloat=-DFP_IN_IROM
+cw01.menu.iramfloat.yes=allowed in ISR
+cw01.menu.iramfloat.yes.build.iramfloat=-DFP_IN_IRAM
-wifinfo.menu.UploadSpeed.115200=115200
-wifinfo.menu.UploadSpeed.115200.upload.speed=115200
-wifinfo.menu.UploadSpeed.9600=9600
-wifinfo.menu.UploadSpeed.9600.upload.speed=9600
-wifinfo.menu.UploadSpeed.57600=57600
-wifinfo.menu.UploadSpeed.57600.upload.speed=57600
-wifinfo.menu.UploadSpeed.256000.windows=256000
-wifinfo.menu.UploadSpeed.256000.upload.speed=256000
-wifinfo.menu.UploadSpeed.230400.linux=230400
-wifinfo.menu.UploadSpeed.230400.macosx=230400
-wifinfo.menu.UploadSpeed.230400.upload.speed=230400
-wifinfo.menu.UploadSpeed.460800.linux=460800
-wifinfo.menu.UploadSpeed.460800.macosx=460800
-wifinfo.menu.UploadSpeed.460800.upload.speed=460800
-wifinfo.menu.UploadSpeed.512000.windows=512000
-wifinfo.menu.UploadSpeed.512000.upload.speed=512000
-wifinfo.menu.UploadSpeed.921600=921600
-wifinfo.menu.UploadSpeed.921600.upload.speed=921600
diff --git a/bootloaders/eboot/Makefile b/bootloaders/eboot/Makefile
index e078263caa..3eb9fc58f4 100644
--- a/bootloaders/eboot/Makefile
+++ b/bootloaders/eboot/Makefile
@@ -6,47 +6,57 @@ TARGET_DIR := ./
TARGET_OBJ_FILES := \
eboot.o \
- eboot_command.o \
-
+ eboot_command.o
TARGET_OBJ_PATHS := $(addprefix $(TARGET_DIR)/,$(TARGET_OBJ_FILES))
+UZLIB_PATH := ../../tools/sdk/uzlib/src
+UZLIB_FLAGS := -DRUNTIME_BITS_TABLES
+
CC := $(XTENSA_TOOLCHAIN)xtensa-lx106-elf-gcc
CXX := $(XTENSA_TOOLCHAIN)xtensa-lx106-elf-g++
AR := $(XTENSA_TOOLCHAIN)xtensa-lx106-elf-ar
LD := $(XTENSA_TOOLCHAIN)xtensa-lx106-elf-gcc
OBJDUMP := $(XTENSA_TOOLCHAIN)xtensa-lx106-elf-objdump
+INC += -I../../tools/sdk/include -I../../tools/sdk/uzlib/src
+
+CFLAGS += -std=gnu17
-CFLAGS += -std=gnu99
+CFLAGS += -Os -fcommon -g -Wall -Wpointer-arith -Wno-implicit-function-declaration -Wl,-EL -fno-inline-functions -nostdlib -mlongcalls -mno-text-section-literals -ffunction-sections -fdata-sections -free -fipa-pta
-CFLAGS += -O0 -g -Wpointer-arith -Wno-implicit-function-declaration -Wl,-EL -fno-inline-functions -nostdlib -mlongcalls -mno-text-section-literals
+CFLAGS += $(INC)
-LDFLAGS += -nostdlib -Wl,--no-check-sections -umain
+CFLAGS += $(UZLIB_FLAGS)
+
+LDFLAGS += -nostdlib -Wl,--no-check-sections -Wl,--gc-sections -umain -Wl,-Map,$(@:.elf=.map)
LD_SCRIPT := -Teboot.ld
-APP_OUT:= eboot.elf
-APP_AR := eboot.a
-APP_FW := eboot.bin
+APP_OUT := eboot.elf
+APP_AR := eboot.a
+APP_FW := eboot.bin
-all: $(APP_FW)
-$(APP_AR): $(TARGET_OBJ_PATHS)
- $(AR) cru $@ $^
+all: $(APP_OUT)
+tinflate.o: $(UZLIB_PATH)/tinflate.c $(UZLIB_PATH)/uzlib.h $(UZLIB_PATH)/uzlib_conf.h Makefile
+ $(CC) $(CFLAGS) -c -o tinflate.o $(UZLIB_PATH)/tinflate.c
-$(APP_OUT): $(APP_AR)
- $(LD) $(LD_SCRIPT) $(LDFLAGS) -Wl,--start-group -Wl,--whole-archive $(APP_AR) -Wl,--end-group -o $@
+tinfgzip.o: $(UZLIB_PATH)/tinfgzip.c $(UZLIB_PATH)/uzlib.h $(UZLIB_PATH)/uzlib_conf.h Makefile
+ $(CC) $(CFLAGS) -c -o tinfgzip.o $(UZLIB_PATH)/tinfgzip.c
-$(APP_FW): $(APP_OUT)
- $(ESPTOOL) -vvv -eo $(APP_OUT) -bo $@ -bs .text -bs .data -bs .rodata -bc -ec || true
+$(APP_AR): $(TARGET_OBJ_PATHS) tinflate.o tinfgzip.o Makefile
+ $(AR) cru $@ $^
+$(APP_OUT): $(APP_AR) eboot.ld | Makefile
+ $(LD) $(LD_SCRIPT) $(LDFLAGS) -Wl,--start-group -Wl,--sort-common $(APP_AR) -Wl,--end-group -o $@
clean:
rm -f *.o
rm -f $(APP_AR)
rm -f $(APP_OUT)
+ rm -f *.map
.PHONY: all clean default
diff --git a/bootloaders/eboot/eboot.c b/bootloaders/eboot/eboot.c
index f53d3c9125..c3d0c278f7 100644
--- a/bootloaders/eboot/eboot.c
+++ b/bootloaders/eboot/eboot.c
@@ -9,13 +9,57 @@
#include
#include
#include
+#include
#include "flash.h"
#include "eboot_command.h"
+#include
+
#define SWRST do { (*((volatile uint32_t*) 0x60000700)) |= 0x80000000; } while(0);
-extern void ets_wdt_enable(void);
-extern void ets_wdt_disable(void);
+/*
+ After Power Enable Pin, EXT_RST, or HWDT event, at "main()" in eboot, WDT is
+ disabled. Key WDT hardware registers are zero.
+
+ After "ESP.restart()" and other soft restarts, at "main()" in eboot, WDT is enabled.
+
+ References for the under-documented ets_wdt_* API
+ https://mongoose-os.com/blog/esp8266-watchdog-timer/
+ http://cholla.mmto.org/esp8266/bootrom/boot.txt
+
+ After looking at esp8266-watchdog-timer some more, `ets_wdt_enable(4, 12, 12)`
+ is good for eboot's needs. From a ".map" the NON-OS SDK does not use the
+ ets_wdt_* APIs, so our choices are not too critical.
+ The SDK will set up the WDT as it wants it.
+
+ A rationale for keeping the "ets_wdt_enable()" line, if the system is not
+ stable during a "soft restart," the HWDT would provide a recovery reboot.
+*/
+extern void ets_wdt_enable(uint32_t mode, uint32_t arg1, uint32_t arg2);
+/*
+ "ets_wdt_disable"
+
+ Diables WDT, then feeds the dog.
+ For current modes other than 1 or 2, returns the current mode.
+ For current mode 1, calls ets_timer_disarm, then return the current mode.
+ For current mode 2, calls ets_isr_mask, then return the current mode.
+
+ I always see a return value of 0xFFFFFFFF.
+
+ The return value would normally be used with ets_wdt_restore; however, that is
+ not an option since a valid prior call to ets_wdt_enable() may not have been done.
+*/
+extern uint32_t ets_wdt_disable(void);
+
+int print_version(const uint32_t flash_addr)
+{
+ uint32_t ver;
+ if (SPIRead(flash_addr + APP_START_OFFSET + sizeof(image_header_t) + sizeof(section_header_t), &ver, sizeof(ver))) {
+ return 1;
+ }
+ ets_printf("v%08x\n", ver);
+ return 0;
+}
int load_app_from_flash_raw(const uint32_t flash_addr)
{
@@ -46,7 +90,9 @@ int load_app_from_flash_raw(const uint32_t flash_addr)
load = true;
}
- if (address >= 0x40100000 && address < 0x40108000) {
+ // The final IRAM size, once boot has completed, can be either 32K or 48K.
+ // Allow for the higher in range testing.
+ if (address >= 0x40100000 && address < 0x4010C000) {
load = true;
}
@@ -65,40 +111,124 @@ int load_app_from_flash_raw(const uint32_t flash_addr)
pos += section_header.size;
}
- register uint32_t sp asm("a1") = 0x3ffffff0;
- register uint32_t pc asm("a3") = image_header.entry;
- __asm__ __volatile__ ("jx a3");
+ asm volatile("" ::: "memory");
+ asm volatile ("mov.n a1, %0\n"
+ "mov.n a3, %1\n"
+ "jx a3\n" : : "r" (0x3ffffff0), "r" (image_header.entry) );
+ __builtin_unreachable(); // Save a few bytes by letting GCC know no need to pop regs/return
return 0;
}
+uint8_t read_flash_byte(const uint32_t addr)
+{
+ uint8_t __attribute__((aligned(4))) buff[4];
+ SPIRead(addr & ~3, buff, 4);
+ return buff[addr & 3];
+}
+unsigned char __attribute__((aligned(4))) uzlib_flash_read_cb_buff[4096];
+uint32_t uzlib_flash_read_cb_addr;
+int uzlib_flash_read_cb(struct uzlib_uncomp *m)
+{
+ m->source = uzlib_flash_read_cb_buff;
+ m->source_limit = uzlib_flash_read_cb_buff + sizeof(uzlib_flash_read_cb_buff);
+ SPIRead(uzlib_flash_read_cb_addr, uzlib_flash_read_cb_buff, sizeof(uzlib_flash_read_cb_buff));
+ uzlib_flash_read_cb_addr += sizeof(uzlib_flash_read_cb_buff);
+ return *(m->source++);
+}
+unsigned char gzip_dict[32768];
+uint8_t buffer2[FLASH_SECTOR_SIZE]; // no room for this on the stack
int copy_raw(const uint32_t src_addr,
const uint32_t dst_addr,
- const uint32_t size)
+ const uint32_t size,
+ const bool verify)
{
// require regions to be aligned
- if (src_addr & 0xfff != 0 ||
- dst_addr & 0xfff != 0) {
+ if ((src_addr & 0xfff) != 0 ||
+ (dst_addr & 0xfff) != 0) {
return 1;
}
const uint32_t buffer_size = FLASH_SECTOR_SIZE;
uint8_t buffer[buffer_size];
- uint32_t left = ((size+buffer_size-1) & ~(buffer_size-1));
+ int32_t left = ((size+buffer_size-1) & ~(buffer_size-1));
uint32_t saddr = src_addr;
uint32_t daddr = dst_addr;
-
- while (left) {
- if (SPIEraseSector(daddr/buffer_size)) {
- return 2;
+ struct uzlib_uncomp m_uncomp;
+ bool gzip = false;
+
+ // Check if we are uncompressing a GZIP upload or not
+ if ((read_flash_byte(saddr) == 0x1f) && (read_flash_byte(saddr + 1) == 0x8b)) {
+ // GZIP signature matched. Find real size as encoded at the end
+ left = read_flash_byte(saddr + size - 4);
+ left += read_flash_byte(saddr + size - 3)<<8;
+ left += read_flash_byte(saddr + size - 2)<<16;
+ left += read_flash_byte(saddr + size - 1)<<24;
+
+ uzlib_init();
+
+ /* all 3 fields below must be initialized by user */
+ m_uncomp.source = NULL;
+ m_uncomp.source_limit = NULL;
+ uzlib_flash_read_cb_addr = src_addr;
+ m_uncomp.source_read_cb = uzlib_flash_read_cb;
+ uzlib_uncompress_init(&m_uncomp, gzip_dict, sizeof(gzip_dict));
+
+ int res = uzlib_gzip_parse_header(&m_uncomp);
+ if (res != TINF_OK) {
+ return 5; // Error uncompress header read
}
- if (SPIRead(saddr, buffer, buffer_size)) {
- return 3;
+ gzip = true;
+ }
+ while (left > 0) {
+ if (!gzip) {
+ if (SPIRead(saddr, buffer, buffer_size)) {
+ return 3;
+ }
+ } else {
+ m_uncomp.dest_start = buffer;
+ m_uncomp.dest = buffer;
+ int to_read = (left > buffer_size) ? buffer_size : left;
+ m_uncomp.dest_limit = buffer + to_read;
+ int res = uzlib_uncompress(&m_uncomp);
+ if ((res != TINF_DONE) && (res != TINF_OK)) {
+ return 6;
+ }
+ // Fill any remaining with 0xff
+ for (int i = to_read; i < buffer_size; i++) {
+ buffer[i] = 0xff;
+ }
}
- if (SPIWrite(daddr, buffer, buffer_size)) {
- return 4;
+ if (verify) {
+ if (SPIRead(daddr, buffer2, buffer_size)) {
+ return 4;
+ }
+ if (memcmp(buffer, buffer2, buffer_size)) {
+ return 9;
+ }
+ } else {
+ // Special treatment for address 0 (bootloader). Only erase and
+ // rewrite if the data is different (i.e. very rarely).
+ bool skip = false;
+ if (daddr == 0) {
+ if (SPIRead(daddr, buffer2, buffer_size)) {
+ return 4;
+ }
+ if (!memcmp(buffer2, buffer, buffer_size)) {
+ ets_putc('B'); // Note we skipped the bootloader in output
+ skip = true; // And skip erase/write
+ }
+ }
+ if (!skip) {
+ if (SPIEraseSector(daddr/buffer_size)) {
+ return 2;
+ }
+ if (SPIWrite(daddr, buffer, buffer_size)) {
+ return 4;
+ }
+ }
}
saddr += buffer_size;
daddr += buffer_size;
@@ -108,16 +238,27 @@ int copy_raw(const uint32_t src_addr,
return 0;
}
-
-
-void main()
+int main()
{
int res = 9;
+ bool clear_cmd = false;
struct eboot_command cmd;
+// BSS init commented out for now to save space. If any static variables set
+// to 0 are used, need to uncomment it or else the BSS will not be cleared and
+// the static vars will power on with random values.
+#if 0
+ // Clear BSS ourselves, we don't have handy C runtime
+ extern char _bss_start;
+ extern char _bss_end;
+ ets_bzero(&_bss_start, &_bss_end - &_bss_start);
+#endif
+
+ print_version(0);
+
if (eboot_command_read(&cmd) == 0) {
// valid command was passed via RTC_MEM
- eboot_command_clear();
+ clear_cmd = true;
ets_putc('@');
} else {
// no valid command found
@@ -127,22 +268,42 @@ void main()
}
if (cmd.action == ACTION_COPY_RAW) {
- ets_putc('c'); ets_putc('p'); ets_putc(':');
+ ets_printf("cp:");
+
ets_wdt_disable();
- res = copy_raw(cmd.args[0], cmd.args[1], cmd.args[2]);
- ets_wdt_enable();
- ets_putc('0'+res); ets_putc('\n');
+ res = copy_raw(cmd.args[0], cmd.args[1], cmd.args[2], false);
+ ets_wdt_enable(4, 12, 12); // WDT about 13 secs.
+
+ ets_printf("%d\n", res);
+#if 0
+ //devyte: this verify step below (cmp:) only works when the end of copy operation above does not overwrite the
+ //beginning of the image in the empty area, see #7458. Disabling for now.
+ //TODO: replace the below verify with hash type, crc, or similar.
+ // Verify the copy
+ ets_printf("cmp:");
+ if (res == 0) {
+ ets_wdt_disable();
+ res = copy_raw(cmd.args[0], cmd.args[1], cmd.args[2], true);
+ ets_wdt_enable();
+ }
+
+ ets_printf("%d\n", res);
+#endif
if (res == 0) {
cmd.action = ACTION_LOAD_APP;
cmd.args[0] = cmd.args[1];
}
}
+ if (clear_cmd) {
+ eboot_command_clear();
+ }
+
if (cmd.action == ACTION_LOAD_APP) {
- ets_putc('l'); ets_putc('d'); ets_putc('\n');
+ ets_printf("ld\n");
res = load_app_from_flash_raw(cmd.args[0]);
- //we will get to this only on load fail
- ets_putc('e'); ets_putc(':'); ets_putc('0'+res); ets_putc('\n');
+ // We will get to this only on load fail
+ ets_printf("e:%d\n", res);
}
if (res) {
@@ -150,4 +311,7 @@ void main()
}
while(true){}
+
+ __builtin_unreachable();
+ return 0;
}
diff --git a/bootloaders/eboot/eboot.elf b/bootloaders/eboot/eboot.elf
index aa61b97f02..0e679ff46c 100755
Binary files a/bootloaders/eboot/eboot.elf and b/bootloaders/eboot/eboot.elf differ
diff --git a/bootloaders/eboot/eboot.ld b/bootloaders/eboot/eboot.ld
index 303ae8a56c..3946412db2 100644
--- a/bootloaders/eboot/eboot.ld
+++ b/bootloaders/eboot/eboot.ld
@@ -42,51 +42,13 @@ PROVIDE(_memmap_cacheattr_reset = _memmap_cacheattr_wb_trapnull);
SECTIONS
{
- .dport0.rodata : ALIGN(4)
+ .globals : ALIGN(4)
{
- _dport0_rodata_start = ABSOLUTE(.);
- *(.dport0.rodata)
- *(.dport.rodata)
- _dport0_rodata_end = ABSOLUTE(.);
- } >dport0_0_seg :dport0_0_phdr
-
- .dport0.literal : ALIGN(4)
- {
- _dport0_literal_start = ABSOLUTE(.);
- *(.dport0.literal)
- *(.dport.literal)
- _dport0_literal_end = ABSOLUTE(.);
- } >dport0_0_seg :dport0_0_phdr
-
- .dport0.data : ALIGN(4)
- {
- _dport0_data_start = ABSOLUTE(.);
- *(.dport0.data)
- *(.dport.data)
- _dport0_data_end = ABSOLUTE(.);
- } >dport0_0_seg :dport0_0_phdr
-
- .data : ALIGN(4)
- {
- _heap_start = ABSOLUTE(.);
-/* _stack_sentry = ALIGN(0x8); */
+ *(COMMON) /* Global vars */
} >dram0_0_seg :dram0_0_bss_phdr
-/* __stack = 0x3ffc8000; */
- .text : ALIGN(4)
+ .data : ALIGN(4)
{
- _stext = .;
- _text_start = ABSOLUTE(.);
- *(.entry.text)
- *(.init.literal)
- *(.init)
- *(.literal .text .literal.* .text.* .stub .gnu.warning .gnu.linkonce.literal.* .gnu.linkonce.t.*.literal .gnu.linkonce.t.*)
- *(.fini.literal)
- *(.fini)
- *(.gnu.version)
- _text_end = ABSOLUTE(.);
- _etext = .;
- . = ALIGN (8);
_data_start = ABSOLUTE(.);
*(.data)
*(.data.*)
@@ -100,7 +62,10 @@ SECTIONS
*(.gnu.linkonce.s2.*)
*(.jcr)
_data_end = ABSOLUTE(.);
- . = ALIGN (8);
+ } >dram0_0_seg :dram0_0_bss_phdr
+
+ .rodata : ALIGN(4)
+ {
_rodata_start = ABSOLUTE(.);
*(.rodata)
*(.rodata.*)
@@ -129,14 +94,11 @@ SECTIONS
*(.xt_except_desc_end)
*(.dynamic)
*(.gnu.version_d)
- . = ALIGN(4); /* this table MUST be 4-byte aligned */
- _bss_table_start = ABSOLUTE(.);
- LONG(_bss_start)
- LONG(_bss_end)
- _bss_table_end = ABSOLUTE(.);
_rodata_end = ABSOLUTE(.);
+ } >dram0_0_seg :dram0_0_bss_phdr
- . = ALIGN (8);
+ .bss : ALIGN(4)
+ {
_bss_start = ABSOLUTE(.);
*(.dynsbss)
*(.sbss)
@@ -150,9 +112,24 @@ SECTIONS
*(.bss)
*(.bss.*)
*(.gnu.linkonce.b.*)
- *(COMMON)
- . = ALIGN (8);
_bss_end = ABSOLUTE(.);
+ } >dram0_0_seg :dram0_0_bss_phdr
+
+
+ .text : ALIGN(4)
+ {
+ _stext = .;
+ _text_start = ABSOLUTE(.);
+ *(.entry.text)
+ *(.init.literal)
+ *(.init)
+ *(.literal .text .literal.* .text.* .stub .gnu.warning .gnu.linkonce.literal.* .gnu.linkonce.t.*.literal .gnu.linkonce.t.*)
+ *(.fini.literal)
+ *(.fini)
+ *(.gnu.version)
+ _text_end = ABSOLUTE(.);
+ _etext = .;
+ . = ALIGN (4); /* Ensure 32b alignment since this is written to IRAM */
} >iram1_0_seg :iram1_0_phdr
.lit4 : ALIGN(4)
diff --git a/bootloaders/eboot/eboot_command.c b/bootloaders/eboot/eboot_command.c
index 648039e48a..54d4895c94 100644
--- a/bootloaders/eboot/eboot_command.c
+++ b/bootloaders/eboot/eboot_command.c
@@ -37,7 +37,7 @@ int eboot_command_read(struct eboot_command* cmd)
}
uint32_t crc32 = eboot_command_calculate_crc32(cmd);
- if (cmd->magic & EBOOT_MAGIC_MASK != EBOOT_MAGIC ||
+ if ((cmd->magic & EBOOT_MAGIC_MASK) != EBOOT_MAGIC ||
cmd->crc32 != crc32) {
return 1;
}
diff --git a/bootloaders/eboot/flash.h b/bootloaders/eboot/flash.h
index ea8b65c1fa..38c528869a 100644
--- a/bootloaders/eboot/flash.h
+++ b/bootloaders/eboot/flash.h
@@ -8,15 +8,19 @@
#ifndef FLASH_H
#define FLASH_H
+
+/* The geometry defines are placed in the sdk. The .h was factored out for reuse by eboot here.
+ * Beware: this means that eboot has an external dependency.
+ * The following .h is placed in tools/sdk/includes
+ */
+#include
+
int SPIEraseBlock(uint32_t block);
int SPIEraseSector(uint32_t sector);
int SPIRead(uint32_t addr, void *dest, size_t size);
int SPIWrite(uint32_t addr, void *src, size_t size);
int SPIEraseAreaEx(const uint32_t start, const uint32_t size);
-#define FLASH_SECTOR_SIZE 0x1000
-#define FLASH_BLOCK_SIZE 0x10000
-#define APP_START_OFFSET 0x1000
typedef struct {
unsigned char magic;
@@ -25,7 +29,7 @@ typedef struct {
/* SPI Flash Interface (0 = QIO, 1 = QOUT, 2 = DIO, 0x3 = DOUT) */
unsigned char flash_mode;
- /* High four bits: 0 = 512K, 1 = 256K, 2 = 1M, 3 = 2M, 4 = 4M,
+ /* High four bits: 0 = 512K, 1 = 256K, 2 = 1M, 3 = 2M, 4 = 4M, 8 = 8M, 9 = 16M
Low four bits: 0 = 40MHz, 1= 26MHz, 2 = 20MHz, 0xf = 80MHz */
unsigned char flash_size_freq;
diff --git a/bootloaders/eboot/spi_vendors.h b/bootloaders/eboot/spi_vendors.h
new file mode 100644
index 0000000000..484ac7ee86
--- /dev/null
+++ b/bootloaders/eboot/spi_vendors.h
@@ -0,0 +1,63 @@
+/*
+ spi_vendors.h - Vendor IDs for SPI chips
+ Copyright (c) 2019 Mike Nix. All rights reserved.
+ This file is part of the esp8266 core for Arduino environment.
+
+ 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 __SPI_VENDORS_H__
+#define __SPI_VENDORS_H__
+
+// Vendor IDs taken from Flashrom project
+// https://review.coreboot.org/cgit/flashrom.git/tree/flashchips.h?h=1.0.x
+// Moved here from ../../cores/esp8266/Esp.h
+typedef enum {
+ SPI_FLASH_VENDOR_ALLIANCE = 0x52, /* Alliance Semiconductor */
+ SPI_FLASH_VENDOR_AMD = 0x01, /* AMD */
+ SPI_FLASH_VENDOR_AMIC = 0x37, /* AMIC */
+ SPI_FLASH_VENDOR_ATMEL = 0x1F, /* Atmel (now used by Adesto) */
+ SPI_FLASH_VENDOR_BRIGHT = 0xAD, /* Bright Microelectronics */
+ SPI_FLASH_VENDOR_CATALYST = 0x31, /* Catalyst */
+ SPI_FLASH_VENDOR_EON = 0x1C, /* EON Silicon Devices, missing 0x7F prefix */
+ SPI_FLASH_VENDOR_ESMT = 0x8C, /* Elite Semiconductor Memory Technology (ESMT) / EFST Elite Flash Storage */
+ SPI_FLASH_VENDOR_EXCEL = 0x4A, /* ESI, missing 0x7F prefix */
+ SPI_FLASH_VENDOR_FIDELIX = 0xF8, /* Fidelix */
+ SPI_FLASH_VENDOR_FUJITSU = 0x04, /* Fujitsu */
+ SPI_FLASH_VENDOR_GIGADEVICE = 0xC8, /* GigaDevice */
+ SPI_FLASH_VENDOR_HYUNDAI = 0xAD, /* Hyundai */
+ SPI_FLASH_VENDOR_INTEL = 0x89, /* Intel */
+ SPI_FLASH_VENDOR_ISSI = 0xD5, /* ISSI Integrated Silicon Solutions, see also PMC. */
+ SPI_FLASH_VENDOR_MACRONIX = 0xC2, /* Macronix (MX) */
+ SPI_FLASH_VENDOR_NANTRONICS = 0xD5, /* Nantronics, missing prefix */
+ SPI_FLASH_VENDOR_PMC = 0x9D, /* PMC, missing 0x7F prefix */
+ SPI_FLASH_VENDOR_PUYA = 0x85, /* Puya semiconductor (shanghai) co. ltd */
+ SPI_FLASH_VENDOR_SANYO = 0x62, /* Sanyo */
+ SPI_FLASH_VENDOR_SHARP = 0xB0, /* Sharp */
+ SPI_FLASH_VENDOR_SPANSION = 0x01, /* Spansion, same ID as AMD */
+ SPI_FLASH_VENDOR_SST = 0xBF, /* SST */
+ SPI_FLASH_VENDOR_ST = 0x20, /* ST / SGS/Thomson / Numonyx (later acquired by Micron) */
+ SPI_FLASH_VENDOR_SYNCMOS_MVC = 0x40, /* SyncMOS (SM) and Mosel Vitelic Corporation (MVC) */
+ SPI_FLASH_VENDOR_TENX = 0x5E, /* Tenx Technologies */
+ SPI_FLASH_VENDOR_TI = 0x97, /* Texas Instruments */
+ SPI_FLASH_VENDOR_TI_OLD = 0x01, /* TI chips from last century */
+ SPI_FLASH_VENDOR_WINBOND = 0xDA, /* Winbond */
+ SPI_FLASH_VENDOR_WINBOND_NEX = 0xEF, /* Winbond (ex Nexcom) serial flashes */
+ SPI_FLASH_VENDOR_XMC = 0x20, /* Wuhan Xinxin Semiconductor Manufacturing Corp */
+
+ SPI_FLASH_VENDOR_UNKNOWN = 0xFF
+} SPI_FLASH_VENDOR_t;
+
+#endif // __SPI_VENDORS_H__
diff --git a/cores/esp8266/AddrList.h b/cores/esp8266/AddrList.h
new file mode 100644
index 0000000000..33d1f78eb1
--- /dev/null
+++ b/cores/esp8266/AddrList.h
@@ -0,0 +1,221 @@
+/*
+ AddrList.h - cycle through lwIP netif's ip addresses like a c++ list
+ Copyright (c) 2018 david gauchard. 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
+ */
+
+/*
+ This class allows to explore all configured IP addresses
+ in lwIP netifs, with that kind of c++ loop:
+
+ for (auto a: addrList)
+ out.printf("IF='%s' index=%d legacy=%d IPv4=%d local=%d hostname='%s' addr= %s\n",
+ a.iface().c_str(),
+ a.ifnumber(),
+ a.addr().isLegacy(),
+ a.addr().isV4(),
+ a.addr().isLocal(),
+ a.hostname().c_str(),
+ a.addr().toString().c_str());
+
+ This loop:
+
+ while (WiFi.status() != WL_CONNECTED()) {
+ Serial.print('.');
+ delay(500);
+ }
+
+ can be replaced by:
+
+ for (bool configured = false; !configured; ) {
+ for (auto iface: addrList)
+ if ((configured = !iface.addr().isLocal())
+ break;
+ Serial.print('.');
+ delay(500);
+ }
+
+ waiting for an IPv6 global address:
+
+ for (bool configured = false; !configured; ) {
+ for (auto iface: addrList)
+ if ((configured = ( !iface.addr().isV4()
+ && !iface.addr().isLocal())))
+ break;
+ Serial.print('.');
+ delay(500);
+ }
+
+ waiting for an IPv6 global address, on a specific interface:
+
+ for (bool configured = false; !configured; ) {
+ for (auto iface: addrList)
+ if ((configured = ( !iface.addr().isV4()
+ && !iface.addr().isLocal()
+ && iface.ifnumber() == STATION_IF)))
+ break;
+ Serial.print('.');
+ delay(500);
+ }
+*/
+
+#ifndef __ADDRLIST_H
+#define __ADDRLIST_H
+
+#include
+#include
+
+#if LWIP_IPV6
+#define IF_NUM_ADDRESSES (1 + LWIP_IPV6_NUM_ADDRESSES)
+#else
+#define IF_NUM_ADDRESSES (1)
+#endif
+
+
+namespace esp8266
+{
+
+namespace AddressListImplementation
+{
+
+
+struct netifWrapper
+{
+ netifWrapper (netif* netif) : _netif(netif), _num(-1) {}
+ netifWrapper (const netifWrapper& o) : _netif(o._netif), _num(o._num) {}
+
+ netifWrapper& operator= (const netifWrapper& o)
+ {
+ _netif = o._netif;
+ _num = o._num;
+ return *this;
+ }
+
+ bool equal(const netifWrapper& o)
+ {
+ return _netif == o._netif && (!_netif || _num == o._num);
+ }
+
+ // address properties
+ IPAddress addr () const { return ipFromNetifNum(); }
+ bool isLegacy () const { return _num == 0; }
+ bool isLocal () const { return addr().isLocal(); }
+ bool isV4 () const { return addr().isV4(); }
+ bool isV6 () const { return !addr().isV4(); }
+ String toString() const { return addr().toString(); }
+
+ // related to legacy address (_num=0, ipv4)
+ IPAddress ipv4 () const { return _netif->ip_addr; }
+ IPAddress netmask () const { return _netif->netmask; }
+ IPAddress gw () const { return _netif->gw; }
+
+ // common to all addresses of this interface
+ String ifname () const { return String(_netif->name[0]) + _netif->name[1]; }
+ const char* ifhostname () const { return _netif->hostname?: emptyString.c_str(); }
+ const char* ifmac () const { return (const char*)_netif->hwaddr; }
+ int ifnumber () const { return _netif->num; }
+ bool ifUp () const { return !!(_netif->flags & NETIF_FLAG_UP); }
+ const netif* interface () const { return _netif; }
+
+ const ip_addr_t* ipFromNetifNum () const
+ {
+#if LWIP_IPV6
+ return _num ? &_netif->ip6_addr[_num - 1] : &_netif->ip_addr;
+#else
+ return &_netif->ip_addr;
+#endif
+ }
+
+ // lwIP interface
+ netif* _netif;
+
+ // address index within interface
+ // 0: legacy address (IPv4)
+ // n>0: (_num-1) is IPv6 index for netif->ip6_addr[]
+ int _num;
+};
+
+
+class AddressListIterator
+{
+public:
+ AddressListIterator (const netifWrapper& o) : netIf(o) {}
+ AddressListIterator (netif* netif) : netIf(netif)
+ {
+ // This constructor is called with lwIP's global netif_list, or
+ // nullptr. operator++() is designed to loop through _configured_
+ // addresses. That's why netIf's _num is initialized to -1 to allow
+ // returning the first usable address to AddressList::begin().
+ (void)operator++();
+ }
+
+ const netifWrapper& operator* () const { return netIf; }
+ const netifWrapper* operator-> () const { return &netIf; }
+
+ bool operator== (AddressListIterator& o) { return netIf.equal(*o); }
+ bool operator!= (AddressListIterator& o) { return !netIf.equal(*o); }
+
+ AddressListIterator operator++ (int)
+ {
+ AddressListIterator ret = *this;
+ (void)operator++();
+ return ret;
+ }
+
+ AddressListIterator& operator++ ()
+ {
+ while (netIf._netif)
+ {
+ if (++netIf._num == IF_NUM_ADDRESSES)
+ {
+ // all addresses from current interface were iterated,
+ // switching to next interface
+ netIf = netifWrapper(netIf._netif->next);
+ continue;
+ }
+ if (!ip_addr_isany(netIf.ipFromNetifNum()))
+ // found an initialized address
+ break;
+ }
+ return *this;
+ }
+
+ netifWrapper netIf;
+};
+
+
+class AddressList
+{
+public:
+ using const_iterator = const AddressListIterator;
+
+ const_iterator begin () const { return const_iterator(netif_list); }
+ const_iterator end () const { return const_iterator(nullptr); }
+
+};
+
+inline AddressList::const_iterator begin (const AddressList& a) { return a.begin(); }
+inline AddressList::const_iterator end (const AddressList& a) { return a.end(); }
+
+
+} // AddressListImplementation
+
+} // esp8266
+
+extern esp8266::AddressListImplementation::AddressList addrList;
+
+
+#endif
diff --git a/cores/esp8266/Arduino.h b/cores/esp8266/Arduino.h
index b6f442e5cf..60737e0195 100644
--- a/cores/esp8266/Arduino.h
+++ b/cores/esp8266/Arduino.h
@@ -33,17 +33,18 @@ extern "C" {
#include
#include
+#include "umm_malloc/umm_malloc_cfgport.h"
#include "stdlib_noniso.h"
#include "binary.h"
#include "esp8266_peri.h"
#include "twi.h"
+
#include "core_esp8266_features.h"
+#include "core_esp8266_version.h"
#define HIGH 0x1
#define LOW 0x0
-#define PWMRANGE 1023
-
//GPIO FUNCTIONS
#define INPUT 0x00
#define INPUT_PULLUP 0x02
@@ -73,7 +74,6 @@ extern "C" {
#define MSBFIRST 1
//Interrupt Modes
-#define DISABLED 0x00
#define RISING 0x01
#define FALLING 0x02
#define CHANGE 0x03
@@ -86,9 +86,13 @@ extern "C" {
#define EXTERNAL 0
//timer dividers
-#define TIM_DIV1 0 //80MHz (80 ticks/us - 104857.588 us max)
-#define TIM_DIV16 1 //5MHz (5 ticks/us - 1677721.4 us max)
-#define TIM_DIV265 3 //312.5Khz (1 tick = 3.2us - 26843542.4 us max)
+enum TIM_DIV_ENUM {
+ TIM_DIV1 = 0, //80MHz (80 ticks/us - 104857.588 us max)
+ TIM_DIV16 = 1, //5MHz (5 ticks/us - 1677721.4 us max)
+ TIM_DIV256 = 3 //312.5Khz (1 tick = 3.2us - 26843542.4 us max)
+};
+
+
//timer int_types
#define TIM_EDGE 0
#define TIM_LEVEL 1
@@ -123,45 +127,14 @@ void timer0_isr_init(void);
void timer0_attachInterrupt(timercallback userFunc);
void timer0_detachInterrupt(void);
-// undefine stdlib's abs if encountered
-#ifdef abs
-#undef abs
-#endif
-
-#define abs(x) ((x)>0?(x):-(x))
#define constrain(amt,low,high) ((amt)<(low)?(low):((amt)>(high)?(high):(amt)))
-#define round(x) ((x)>=0?(long)((x)+0.5):(long)((x)-0.5))
#define radians(deg) ((deg)*DEG_TO_RAD)
#define degrees(rad) ((rad)*RAD_TO_DEG)
#define sq(x) ((x)*(x))
-void ets_intr_lock();
-void ets_intr_unlock();
-
-#ifndef __STRINGIFY
-#define __STRINGIFY(a) #a
-#endif
-
-// these low level routines provide a replacement for SREG interrupt save that AVR uses
-// but are esp8266 specific. A normal use pattern is like
-//
-//{
-// uint32_t savedPS = xt_rsil(1); // this routine will allow level 2 and above
-// // do work here
-// xt_wsr_ps(savedPS); // restore the state
-//}
-//
-// level (0-15), interrupts of the given level and above will be active
-// level 15 will disable ALL interrupts,
-// level 0 will enable ALL interrupts,
-//
-#define xt_rsil(level) (__extension__({uint32_t state; __asm__ __volatile__("rsil %0," __STRINGIFY(level) : "=a" (state)); state;}))
-#define xt_wsr_ps(state) __asm__ __volatile__("wsr %0,ps; isync" :: "a" (state) : "memory")
-
#define interrupts() xt_rsil(0)
#define noInterrupts() xt_rsil(15)
-
#define clockCyclesPerMicrosecond() ( F_CPU / 1000000L )
#define clockCyclesToMicroseconds(a) ( (a) / clockCyclesPerMicrosecond() )
#define microsecondsToClockCycles(a) ( (a) * clockCyclesPerMicrosecond() )
@@ -179,32 +152,31 @@ void ets_intr_unlock();
#define _NOP() do { __asm__ volatile ("nop"); } while (0)
#endif
-typedef unsigned int word;
+typedef uint16_t word;
#define bit(b) (1UL << (b))
#define _BV(b) (1UL << (b))
-typedef uint8_t boolean;
+typedef bool boolean;
typedef uint8_t byte;
+void ets_intr_lock();
+void ets_intr_unlock();
+
void init(void);
void initVariant(void);
-int atexit(void (*func)()) __attribute__((weak));
-
void pinMode(uint8_t pin, uint8_t mode);
void digitalWrite(uint8_t pin, uint8_t val);
int digitalRead(uint8_t pin);
int analogRead(uint8_t pin);
void analogReference(uint8_t mode);
void analogWrite(uint8_t pin, int val);
+void analogWriteMode(uint8_t pin, int val, bool openDrain);
void analogWriteFreq(uint32_t freq);
+void analogWriteResolution(int res);
void analogWriteRange(uint32_t range);
-unsigned long millis(void);
-unsigned long micros(void);
-void delay(unsigned long);
-void delayMicroseconds(unsigned int us);
unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout);
unsigned long pulseInLong(uint8_t pin, uint8_t state, unsigned long timeout);
@@ -213,19 +185,26 @@ uint8_t shiftIn(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder);
void attachInterrupt(uint8_t pin, void (*)(void), int mode);
void detachInterrupt(uint8_t pin);
+void attachInterruptArg(uint8_t pin, void (*)(void*), void* arg, int mode);
+#if FLASH_MAP_SUPPORT
+#include "flash_hal.h"
+#endif
+void preinit(void);
void setup(void);
void loop(void);
void yield(void);
+
void optimistic_yield(uint32_t interval_us);
-#define digitalPinToPort(pin) (0)
-#define digitalPinToBitMask(pin) (1UL << (pin))
+#define _PORT_GPIO16 1
+#define digitalPinToPort(pin) (((pin)==16)?(_PORT_GPIO16):(0))
+#define digitalPinToBitMask(pin) (((pin)==16)?(1):(1UL << (pin)))
#define digitalPinToTimer(pin) (0)
-#define portOutputRegister(port) ((volatile uint32_t*) &GPO)
-#define portInputRegister(port) ((volatile uint32_t*) &GPI)
-#define portModeRegister(port) ((volatile uint32_t*) &GPE)
+#define portOutputRegister(port) (((port)==_PORT_GPIO16)?((volatile uint32_t*) &GP16O):((volatile uint32_t*) &GPO))
+#define portInputRegister(port) (((port)==_PORT_GPIO16)?((volatile uint32_t*) &GP16I):((volatile uint32_t*) &GPI))
+#define portModeRegister(port) (((port)==_PORT_GPIO16)?((volatile uint32_t*) &GP16E):((volatile uint32_t*) &GPE))
#define NOT_A_PIN -1
#define NOT_A_PORT -1
@@ -236,26 +215,37 @@ void optimistic_yield(uint32_t interval_us);
} // extern "C"
#endif
+// undefine stdlib's definitions when encountered, provide abs that supports floating point for C code
+#ifndef __cplusplus
+#undef abs
+#define abs(x) ({ __typeof__(x) _x = (x); _x > 0 ? _x : -_x; })
+#undef round
+#define round(x) ({ __typeof__(x) _x = (x); _x >= 0 ? (long)(_x + 0.5) : (long)(_x - 0.5); })
+#endif // ifndef __cplusplus
+
+// from this point onward, we need to configure the c++ environment
#ifdef __cplusplus
-#include "pgmspace.h"
+#include
+#include
+#include
-#include "WCharacter.h"
-#include "WString.h"
-#include "HardwareSerial.h"
-#include "Esp.h"
-#include "Updater.h"
-#include "debug.h"
+#include "mmu_iram.h"
-#ifndef _GLIBCXX_VECTOR
-// arduino is not compatible with std::vector
-#define min(a,b) ((a)<(b)?(a):(b))
-#define max(a,b) ((a)>(b)?(a):(b))
-#endif
-#define _min(a,b) ((a)<(b)?(a):(b))
-#define _max(a,b) ((a)>(b)?(a):(b))
+using std::min;
+using std::max;
+using std::round;
+using std::isinf;
+using std::isnan;
+
+// Use float-compatible stl abs() and round(), we don't use Arduino macros to avoid issues with the C++ libraries
+using std::abs;
+using std::round;
+
+#define _min(a,b) ({ decltype(a) _a = (a); decltype(b) _b = (b); _a < _b? _a : _b; })
+#define _max(a,b) ({ decltype(a) _a = (a); decltype(b) _b = (b); _a > _b? _a : _b; })
uint16_t makeWord(uint16_t w);
uint16_t makeWord(byte h, byte l);
@@ -266,19 +256,64 @@ unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout = 100000
unsigned long pulseInLong(uint8_t pin, uint8_t state, unsigned long timeout = 1000000L);
void tone(uint8_t _pin, unsigned int frequency, unsigned long duration = 0);
+void tone(uint8_t _pin, int frequency, unsigned long duration = 0);
+void tone(uint8_t _pin, double frequency, unsigned long duration = 0);
void noTone(uint8_t _pin);
// WMath prototypes
long random(long);
long random(long, long);
void randomSeed(unsigned long);
+long secureRandom(long);
+long secureRandom(long, long);
long map(long, long, long, long, long);
-extern "C" void configTime(long timezone, int daylightOffset_sec,
- const char* server1, const char* server2 = nullptr, const char* server3 = nullptr);
+void setTZ(const char* tz);
-#endif
+// configure time using POSIX TZ string
+// server pointers *must remain valid* for the duration of the program
+void configTime(const char* tz, const char* server1,
+ const char* server2 = nullptr, const char* server3 = nullptr);
+
+// configures with approximated TZ value. part of the old api, prefer configTime with TZ variable
+void configTime(int timezone, int daylightOffset_sec, const char* server1,
+ const char* server2 = nullptr, const char* server3 = nullptr);
+
+// esp32 api compatibility
+inline void configTzTime(const char* tz, const char* server1,
+ const char* server2 = nullptr, const char* server3 = nullptr)
+{
+ configTime(tz, server1, server2, server3);
+}
+
+bool getLocalTime(struct tm * info, uint32_t ms = 5000);
+
+// Everything we expect to be implicitly loaded for the sketch
+#include
+#include "WCharacter.h"
+#include "WString.h"
+
+// configTime wrappers for temporary server{1,2,3} strings
+void configTime(int timezone, int daylightOffset_sec, String server1,
+ String server2 = String(), String server3 = String());
+void configTime(const char* tz, String server1,
+ String server2 = String(), String server3 = String());
+
+#include "HardwareSerial.h"
+#include "Esp.h"
+#include "Updater.h"
+
+#endif // __cplusplus
+
+#include "debug.h"
#include "pins_arduino.h"
#endif
+
+#ifdef DEBUG_ESP_OOM
+// Position *alloc redefinition at the end of Arduino.h because would
+// have undefined them. Mandatory for supporting OOM and other debug alloc
+// definitions in .ino files
+#include "heap_api_debug.h"
+#endif
diff --git a/cores/esp8266/CallBackList.h b/cores/esp8266/CallBackList.h
new file mode 100644
index 0000000000..1df590e00e
--- /dev/null
+++ b/cores/esp8266/CallBackList.h
@@ -0,0 +1,84 @@
+#ifndef __CALLBACKLIST_H__
+#define __CALLBACKLIST_H__
+
+/*
+ CallBackList, An implementation for handling callback execution
+
+ Copyright (c) 2019 Herman Reintke. All rights reserved.
+ This file is part of the esp8266 core for Arduino environment.
+
+ 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
+#include
+#include
+#include
+
+namespace experimental
+{
+namespace CBListImplentation
+{
+
+template
+class CallBackList
+{
+public:
+ CallBackList (){};
+
+ struct CallBackInfo
+ {
+ CallBackInfo(cbFunctionT f) : cbFunction(f, true){};
+ CallBackInfo(cbFunctionT f, bool ar) : cbFunction(f), _allowRemove(ar) {};
+ cbFunctionT cbFunction;
+ bool _allowRemove = true;
+ bool allowRemove()
+ {
+ return _allowRemove;
+ }
+ };
+ using CallBackHandler = std::shared_ptr ;
+ std::list callBackEventList;
+
+ CallBackHandler add(cbFunctionT af, bool ad = true) {
+ CallBackHandler handler = std::make_shared(CallBackInfo(af,ad));
+ callBackEventList.emplace_back(handler);
+ return handler;
+ }
+
+ void remove(CallBackHandler& dh) {
+ callBackEventList.remove(dh);
+ }
+
+ template
+ int execute(Args... params) {
+ for(auto it = std::begin(callBackEventList); it != std::end(callBackEventList); ) {
+ CallBackHandler &handler = *it;
+ if (handler->allowRemove() && handler.unique()) {
+ it = callBackEventList.erase(it);
+ }
+ else {
+ handler->cbFunction(params...);
+ ++it;
+ }
+ }
+ return callBackEventList.size();
+ }
+};
+
+} //CBListImplementation
+}//experimental
+
+#endif // __CALLBACKLIST_H__
diff --git a/cores/esp8266/Client.h b/cores/esp8266/Client.h
index d776a2e16d..7f8f810458 100644
--- a/cores/esp8266/Client.h
+++ b/cores/esp8266/Client.h
@@ -26,15 +26,15 @@
class Client: public Stream {
public:
- virtual int connect(IPAddress ip, uint16_t port) =0;
- virtual int connect(const char *host, uint16_t port) =0;
- virtual size_t write(uint8_t) =0;
- virtual size_t write(const uint8_t *buf, size_t size) =0;
- virtual int available() = 0;
- virtual int read() = 0;
- virtual int read(uint8_t *buf, size_t size) = 0;
- virtual int peek() = 0;
- virtual void flush() = 0;
+ virtual int connect(IPAddress ip, uint16_t port) = 0;
+ virtual int connect(const char *host, uint16_t port) = 0;
+ virtual size_t write(uint8_t) override = 0;
+ virtual size_t write(const uint8_t *buf, size_t size) override = 0;
+ virtual int available() override = 0;
+ virtual int read() override = 0;
+ virtual int read(uint8_t *buf, size_t size) override = 0;
+ virtual int peek() override = 0;
+ virtual void flush() override = 0;
virtual void stop() = 0;
virtual uint8_t connected() = 0;
virtual operator bool() = 0;
@@ -42,7 +42,9 @@ class Client: public Stream {
uint8_t* rawIPAddress(IPAddress& addr) {
return addr.raw_address();
}
- ;
+ const uint8_t* rawIPAddress(const IPAddress& addr) {
+ return addr.raw_address();
+ }
};
#endif
diff --git a/cores/esp8266/Crypto.cpp b/cores/esp8266/Crypto.cpp
new file mode 100644
index 0000000000..6f9009d56d
--- /dev/null
+++ b/cores/esp8266/Crypto.cpp
@@ -0,0 +1,553 @@
+/*
+ BearSSL Copyright (c) 2016 Thomas Pornin
+ Rest of this file Copyright (C) 2019 Anders Löfgren
+
+ License (MIT license):
+
+ 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 "Crypto.h"
+#include
+#include
+#include
+
+namespace TypeCast = experimental::TypeConversion;
+
+namespace
+{
+size_t _ctMinDataLength = 0;
+size_t _ctMaxDataLength = 1024;
+
+uint8_t *defaultNonceGenerator(uint8_t *nonceArray, const size_t nonceLength)
+{
+ /**
+ The ESP32 Technical Reference Manual v4.1 chapter 24 has the following to say about random number generation (no information found for ESP8266):
+
+ "When used correctly, every 32-bit value the system reads from the RNG_DATA_REG register of the random number generator is a true random number.
+ These true random numbers are generated based on the noise in the Wi-Fi/BT RF system.
+ When Wi-Fi and BT are disabled, the random number generator will give out pseudo-random numbers.
+
+ When Wi-Fi or BT is enabled, the random number generator is fed two bits of entropy every APB clock cycle (normally 80 MHz).
+ Thus, for the maximum amount of entropy, it is advisable to read the random register at a maximum rate of 5 MHz.
+ A data sample of 2 GB, read from the random number generator with Wi-Fi enabled and the random register read at 5 MHz,
+ has been tested using the Dieharder Random Number Testsuite (version 3.31.1).
+ The sample passed all tests."
+
+ Since ESP32 is the sequal to ESP8266 it is unlikely that the ESP8266 is able to generate random numbers more quickly than 5 MHz when run at a 80 MHz frequency.
+ A maximum random number frequency of 0.5 MHz is used here to leave some margin for possibly inferior components in the ESP8266.
+ It should be noted that the ESP8266 has no Bluetooth functionality, so turning the WiFi off is likely to cause RANDOM_REG32 to use pseudo-random numbers.
+
+ It is possible that yield() must be called on the ESP8266 to properly feed the hardware random number generator new bits, since there is only one processor core available.
+ However, no feeding requirements are mentioned in the ESP32 documentation, and using yield() could possibly cause extended delays during nonce generation.
+ Thus only delayMicroseconds() is used below.
+ */
+
+ return ESP.random(nonceArray, nonceLength);
+}
+
+experimental::crypto::nonceGeneratorType _nonceGenerator = defaultNonceGenerator;
+
+void *createBearsslHmac(const br_hash_class *hashType, const void *data, const size_t dataLength, const void *hashKey, const size_t hashKeyLength, void *resultArray, const size_t outputLength)
+{
+ // Comments mainly from https://www.bearssl.org/apidoc/bearssl__hmac_8h.html
+
+ // HMAC is initialized with a key and an underlying hash function; it then fills a "key context". That context contains the processed key.
+ // With the key context, a HMAC context can be initialized to process the input bytes and obtain the MAC output. The key context is not modified during that process, and can be reused.
+
+ br_hmac_key_context keyContext; // Holds general HMAC info
+ br_hmac_context hmacContext; // Holds general HMAC info + specific info for the current operation
+
+ // HMAC key context initialisation.
+ // Initialise the key context with the provided hash key, using the hash function identified by hashType. This supports arbitrary key lengths.
+ br_hmac_key_init(&keyContext, hashType, hashKey, hashKeyLength);
+
+ // Initialise a HMAC context with a key context. The key context is unmodified.
+ // Relevant data from the key context is immediately copied; the key context can thus be independently reused, modified or released without impacting this HMAC computation.
+ // An explicit output length can be specified; the actual output length will be the minimum of that value and the natural HMAC output length.
+ // If outputLength is 0, then the natural HMAC output length is selected. The "natural output length" is the output length of the underlying hash function.
+ br_hmac_init(&hmacContext, &keyContext, outputLength);
+
+ // Provide the HMAC context with the data to create a HMAC from.
+ // The provided dataLength bytes are injected as extra input in the HMAC computation incarnated by the hmacContext.
+ // It is acceptable that dataLength is zero, in which case data is ignored (and may be NULL) and this function does nothing.
+ br_hmac_update(&hmacContext, data, dataLength);
+
+ // Compute the HMAC output.
+ // The destination buffer MUST be large enough to accommodate the result; its length is at most the "natural length" of HMAC (i.e. the output length of the underlying hash function).
+ // The context is NOT modified; further bytes may be processed. Thus, "partial HMAC" values can be efficiently obtained.
+ // Optionally the constant-time version br_hmac_outCT() can be used. More info here: https://www.bearssl.org/constanttime.html .
+ br_hmac_out(&hmacContext, resultArray); // returns size_t outputLength
+
+ return resultArray;
+}
+
+String createBearsslHmac(const br_hash_class *hashType, const uint8_t hashTypeNaturalLength, const String &message, const void *hashKey, const size_t hashKeyLength, const size_t hmacLength)
+{
+ (void) hashTypeNaturalLength;
+ assert(1 <= hmacLength && hmacLength <= hashTypeNaturalLength);
+
+ uint8_t hmac[hmacLength];
+ createBearsslHmac(hashType, message.c_str(), message.length(), hashKey, hashKeyLength, hmac, hmacLength);
+ return TypeCast::uint8ArrayToHexString(hmac, hmacLength);
+}
+
+void *createBearsslHmacCT(const br_hash_class *hashType, const void *data, const size_t dataLength, const void *hashKey, const size_t hashKeyLength, void *resultArray, const size_t outputLength)
+{
+ assert(_ctMinDataLength <= dataLength && dataLength <= _ctMaxDataLength);
+
+ // Comments mainly from https://www.bearssl.org/apidoc/bearssl__hmac_8h.html
+
+ // HMAC is initialized with a key and an underlying hash function; it then fills a "key context". That context contains the processed key.
+ // With the key context, a HMAC context can be initialized to process the input bytes and obtain the MAC output. The key context is not modified during that process, and can be reused.
+
+ br_hmac_key_context keyContext; // Holds general HMAC info
+ br_hmac_context hmacContext; // Holds general HMAC info + specific info for the current operation
+
+ // HMAC key context initialisation.
+ // Initialise the key context with the provided hash key, using the hash function identified by hashType. This supports arbitrary key lengths.
+ br_hmac_key_init(&keyContext, hashType, hashKey, hashKeyLength);
+
+ // Initialise a HMAC context with a key context. The key context is unmodified.
+ // Relevant data from the key context is immediately copied; the key context can thus be independently reused, modified or released without impacting this HMAC computation.
+ // An explicit output length can be specified; the actual output length will be the minimum of that value and the natural HMAC output length.
+ // If outputLength is 0, then the natural HMAC output length is selected. The "natural output length" is the output length of the underlying hash function.
+ br_hmac_init(&hmacContext, &keyContext, outputLength);
+
+ // Provide the HMAC context with the data to create a HMAC from.
+ // The provided dataLength bytes are injected as extra input in the HMAC computation incarnated by the hmacContext.
+ // It is acceptable that dataLength is zero, in which case data is ignored (and may be NULL) and this function does nothing.
+ // No need for br_hmac_update when using constant-time version it seems. If it is used, the data provided to br_hmac_outCT will just be appended.
+ // br_hmac_update(&hmacContext, data, dataLength);
+
+ // Compute the HMAC output. Assumes message is minimum _ctMinDataLength bytes and maximum _ctMaxDataLength bytes.
+ // As long as this is true, the correct HMAC output is calculated in constant-time. More constant-time info here: https://www.bearssl.org/constanttime.html
+ // Some extra input bytes are processed, then the output is computed.
+ // The extra input consists in the dataLength bytes pointed to by data. The dataLength parameter must lie between _ctMinDataLength and _ctMaxDataLength (inclusive);
+ // _ctMaxDataLength bytes are actually read from data (indicating each data byte can be read multiple times, if dataLength < _ctMaxDataLength).
+ // Computing time (and memory access pattern) will not depend upon the data byte contents or the value of dataLength.
+ // The output is written in the resultArray buffer, that MUST be large enough to receive it.
+ // The difference _ctMaxDataLength - _ctMinDataLength MUST be less than 2^30 (i.e. about one gigabyte).
+ // This function computes the output properly only if the underlying hash function uses MD padding (i.e. MD5, SHA-1, SHA-224, SHA-256, SHA-384 or SHA-512).
+ // The provided context is NOT modified.
+ br_hmac_outCT(&hmacContext, data, dataLength, _ctMinDataLength, _ctMaxDataLength, resultArray); // returns size_t outputLength
+
+ return resultArray;
+}
+
+String createBearsslHmacCT(const br_hash_class *hashType, const uint8_t hashTypeNaturalLength, const String &message, const void *hashKey, const size_t hashKeyLength, const size_t hmacLength)
+{
+ (void) hashTypeNaturalLength;
+ assert(1 <= hmacLength && hmacLength <= hashTypeNaturalLength);
+
+ uint8_t hmac[hmacLength];
+ createBearsslHmacCT(hashType, message.c_str(), message.length(), hashKey, hashKeyLength, hmac, hmacLength);
+ return TypeCast::uint8ArrayToHexString(hmac, hmacLength);
+}
+
+
+// Helper function to avoid deprecated warnings.
+void *md5HashHelper(const void *data, const size_t dataLength, void *resultArray)
+{
+ br_md5_context context;
+ br_md5_init(&context);
+ br_md5_update(&context, data, dataLength);
+ br_md5_out(&context, resultArray);
+ return resultArray;
+}
+
+// Helper function to avoid deprecated warnings.
+void *sha1HashHelper(const void *data, const size_t dataLength, void *resultArray)
+{
+ br_sha1_context context;
+ br_sha1_init(&context);
+ br_sha1_update(&context, data, dataLength);
+ br_sha1_out(&context, resultArray);
+ return resultArray;
+}
+}
+
+namespace experimental
+{
+namespace crypto
+{
+void setCtMinDataLength(const size_t ctMinDataLength)
+{
+ assert(getCtMaxDataLength() - ctMinDataLength <= CT_MAX_DIFF);
+ _ctMinDataLength = ctMinDataLength;
+}
+size_t getCtMinDataLength()
+{
+ return _ctMinDataLength;
+}
+
+void setCtMaxDataLength(const size_t ctMaxDataLength)
+{
+ assert(ctMaxDataLength - getCtMinDataLength() <= CT_MAX_DIFF);
+ _ctMaxDataLength = ctMaxDataLength;
+}
+size_t getCtMaxDataLength()
+{
+ return _ctMaxDataLength;
+}
+
+void setNonceGenerator(nonceGeneratorType nonceGenerator)
+{
+ _nonceGenerator = nonceGenerator;
+}
+nonceGeneratorType getNonceGenerator()
+{
+ return _nonceGenerator;
+}
+
+
+// #################### MD5 ####################
+
+// resultArray must have size MD5::NATURAL_LENGTH or greater
+void *MD5::hash(const void *data, const size_t dataLength, void *resultArray)
+{
+ return md5HashHelper(data, dataLength, resultArray);
+}
+
+String MD5::hash(const String &message)
+{
+ uint8_t hashArray[NATURAL_LENGTH];
+ md5HashHelper(message.c_str(), message.length(), hashArray);
+ return TypeCast::uint8ArrayToHexString(hashArray, NATURAL_LENGTH);
+}
+
+void *MD5::hmac(const void *data, const size_t dataLength, const void *hashKey, const size_t hashKeyLength, void *resultArray, const size_t outputLength)
+{
+ return createBearsslHmac(&br_md5_vtable, data, dataLength, hashKey, hashKeyLength, resultArray, outputLength);
+}
+
+String MD5::hmac(const String &message, const void *hashKey, const size_t hashKeyLength, const size_t hmacLength)
+{
+ return createBearsslHmac(&br_md5_vtable, NATURAL_LENGTH, message, hashKey, hashKeyLength, hmacLength);
+}
+
+void *MD5::hmacCT(const void *data, const size_t dataLength, const void *hashKey, const size_t hashKeyLength, void *resultArray, const size_t outputLength)
+{
+ return createBearsslHmacCT(&br_md5_vtable, data, dataLength, hashKey, hashKeyLength, resultArray, outputLength);
+}
+
+String MD5::hmacCT(const String &message, const void *hashKey, const size_t hashKeyLength, const size_t hmacLength)
+{
+ return createBearsslHmacCT(&br_md5_vtable, NATURAL_LENGTH, message, hashKey, hashKeyLength, hmacLength);
+}
+
+
+// #################### SHA-1 ####################
+
+// resultArray must have size SHA1::NATURAL_LENGTH or greater
+void *SHA1::hash(const void *data, const size_t dataLength, void *resultArray)
+{
+ return sha1HashHelper(data, dataLength, resultArray);
+}
+
+String SHA1::hash(const String &message)
+{
+ uint8_t hashArray[NATURAL_LENGTH];
+ sha1HashHelper(message.c_str(), message.length(), hashArray);
+ return TypeCast::uint8ArrayToHexString(hashArray, NATURAL_LENGTH);
+}
+
+void *SHA1::hmac(const void *data, const size_t dataLength, const void *hashKey, const size_t hashKeyLength, void *resultArray, const size_t outputLength)
+{
+ return createBearsslHmac(&br_sha1_vtable, data, dataLength, hashKey, hashKeyLength, resultArray, outputLength);
+}
+
+String SHA1::hmac(const String &message, const void *hashKey, const size_t hashKeyLength, const size_t hmacLength)
+{
+ return createBearsslHmac(&br_sha1_vtable, NATURAL_LENGTH, message, hashKey, hashKeyLength, hmacLength);
+}
+
+void *SHA1::hmacCT(const void *data, const size_t dataLength, const void *hashKey, const size_t hashKeyLength, void *resultArray, const size_t outputLength)
+{
+ return createBearsslHmacCT(&br_sha1_vtable, data, dataLength, hashKey, hashKeyLength, resultArray, outputLength);
+}
+
+String SHA1::hmacCT(const String &message, const void *hashKey, const size_t hashKeyLength, const size_t hmacLength)
+{
+ return createBearsslHmacCT(&br_sha1_vtable, NATURAL_LENGTH, message, hashKey, hashKeyLength, hmacLength);
+}
+
+
+// #################### SHA-224 ####################
+
+// resultArray must have size SHA224::NATURAL_LENGTH or greater
+void *SHA224::hash(const void *data, const size_t dataLength, void *resultArray)
+{
+ br_sha224_context context;
+ br_sha224_init(&context);
+ br_sha224_update(&context, data, dataLength);
+ br_sha224_out(&context, resultArray);
+ return resultArray;
+}
+
+String SHA224::hash(const String &message)
+{
+ uint8_t hashArray[NATURAL_LENGTH];
+ hash(message.c_str(), message.length(), hashArray);
+ return TypeCast::uint8ArrayToHexString(hashArray, NATURAL_LENGTH);
+}
+
+void *SHA224::hmac(const void *data, const size_t dataLength, const void *hashKey, const size_t hashKeyLength, void *resultArray, const size_t outputLength)
+{
+ return createBearsslHmac(&br_sha224_vtable, data, dataLength, hashKey, hashKeyLength, resultArray, outputLength);
+}
+
+String SHA224::hmac(const String &message, const void *hashKey, const size_t hashKeyLength, const size_t hmacLength)
+{
+ return createBearsslHmac(&br_sha224_vtable, NATURAL_LENGTH, message, hashKey, hashKeyLength, hmacLength);
+}
+
+void *SHA224::hmacCT(const void *data, const size_t dataLength, const void *hashKey, const size_t hashKeyLength, void *resultArray, const size_t outputLength)
+{
+ return createBearsslHmacCT(&br_sha224_vtable, data, dataLength, hashKey, hashKeyLength, resultArray, outputLength);
+}
+
+String SHA224::hmacCT(const String &message, const void *hashKey, const size_t hashKeyLength, const size_t hmacLength)
+{
+ return createBearsslHmacCT(&br_sha224_vtable, NATURAL_LENGTH, message, hashKey, hashKeyLength, hmacLength);
+}
+
+
+// #################### SHA-256 ####################
+
+// resultArray must have size SHA256::NATURAL_LENGTH or greater
+void *SHA256::hash(const void *data, const size_t dataLength, void *resultArray)
+{
+ br_sha256_context context;
+ br_sha256_init(&context);
+ br_sha256_update(&context, data, dataLength);
+ br_sha256_out(&context, resultArray);
+ return resultArray;
+}
+
+String SHA256::hash(const String &message)
+{
+ uint8_t hashArray[NATURAL_LENGTH];
+ hash(message.c_str(), message.length(), hashArray);
+ return TypeCast::uint8ArrayToHexString(hashArray, NATURAL_LENGTH);
+}
+
+void *SHA256::hmac(const void *data, const size_t dataLength, const void *hashKey, const size_t hashKeyLength, void *resultArray, const size_t outputLength)
+{
+ return createBearsslHmac(&br_sha256_vtable, data, dataLength, hashKey, hashKeyLength, resultArray, outputLength);
+}
+
+String SHA256::hmac(const String &message, const void *hashKey, const size_t hashKeyLength, const size_t hmacLength)
+{
+ return createBearsslHmac(&br_sha256_vtable, NATURAL_LENGTH, message, hashKey, hashKeyLength, hmacLength);
+}
+
+void *SHA256::hmacCT(const void *data, const size_t dataLength, const void *hashKey, const size_t hashKeyLength, void *resultArray, const size_t outputLength)
+{
+ return createBearsslHmacCT(&br_sha256_vtable, data, dataLength, hashKey, hashKeyLength, resultArray, outputLength);
+}
+
+String SHA256::hmacCT(const String &message, const void *hashKey, const size_t hashKeyLength, const size_t hmacLength)
+{
+ return createBearsslHmacCT(&br_sha256_vtable, NATURAL_LENGTH, message, hashKey, hashKeyLength, hmacLength);
+}
+
+
+// #################### SHA-384 ####################
+
+// resultArray must have size SHA384::NATURAL_LENGTH or greater
+void *SHA384::hash(const void *data, const size_t dataLength, void *resultArray)
+{
+ br_sha384_context context;
+ br_sha384_init(&context);
+ br_sha384_update(&context, data, dataLength);
+ br_sha384_out(&context, resultArray);
+ return resultArray;
+}
+
+String SHA384::hash(const String &message)
+{
+ uint8_t hashArray[NATURAL_LENGTH];
+ hash(message.c_str(), message.length(), hashArray);
+ return TypeCast::uint8ArrayToHexString(hashArray, NATURAL_LENGTH);
+}
+
+void *SHA384::hmac(const void *data, const size_t dataLength, const void *hashKey, const size_t hashKeyLength, void *resultArray, const size_t outputLength)
+{
+ return createBearsslHmac(&br_sha384_vtable, data, dataLength, hashKey, hashKeyLength, resultArray, outputLength);
+}
+
+String SHA384::hmac(const String &message, const void *hashKey, const size_t hashKeyLength, const size_t hmacLength)
+{
+ return createBearsslHmac(&br_sha384_vtable, NATURAL_LENGTH, message, hashKey, hashKeyLength, hmacLength);
+}
+
+void *SHA384::hmacCT(const void *data, const size_t dataLength, const void *hashKey, const size_t hashKeyLength, void *resultArray, const size_t outputLength)
+{
+ return createBearsslHmacCT(&br_sha384_vtable, data, dataLength, hashKey, hashKeyLength, resultArray, outputLength);
+}
+
+String SHA384::hmacCT(const String &message, const void *hashKey, const size_t hashKeyLength, const size_t hmacLength)
+{
+ return createBearsslHmacCT(&br_sha384_vtable, NATURAL_LENGTH, message, hashKey, hashKeyLength, hmacLength);
+}
+
+
+// #################### SHA-512 ####################
+
+// resultArray must have size SHA512::NATURAL_LENGTH or greater
+void *SHA512::hash(const void *data, const size_t dataLength, void *resultArray)
+{
+ br_sha512_context context;
+ br_sha512_init(&context);
+ br_sha512_update(&context, data, dataLength);
+ br_sha512_out(&context, resultArray);
+ return resultArray;
+}
+
+String SHA512::hash(const String &message)
+{
+ uint8_t hashArray[NATURAL_LENGTH];
+ hash(message.c_str(), message.length(), hashArray);
+ return TypeCast::uint8ArrayToHexString(hashArray, NATURAL_LENGTH);
+}
+
+void *SHA512::hmac(const void *data, const size_t dataLength, const void *hashKey, const size_t hashKeyLength, void *resultArray, const size_t outputLength)
+{
+ return createBearsslHmac(&br_sha512_vtable, data, dataLength, hashKey, hashKeyLength, resultArray, outputLength);
+}
+
+String SHA512::hmac(const String &message, const void *hashKey, const size_t hashKeyLength, const size_t hmacLength)
+{
+ return createBearsslHmac(&br_sha512_vtable, NATURAL_LENGTH, message, hashKey, hashKeyLength, hmacLength);
+}
+
+void *SHA512::hmacCT(const void *data, const size_t dataLength, const void *hashKey, const size_t hashKeyLength, void *resultArray, const size_t outputLength)
+{
+ return createBearsslHmacCT(&br_sha512_vtable, data, dataLength, hashKey, hashKeyLength, resultArray, outputLength);
+}
+
+String SHA512::hmacCT(const String &message, const void *hashKey, const size_t hashKeyLength, const size_t hmacLength)
+{
+ return createBearsslHmacCT(&br_sha512_vtable, NATURAL_LENGTH, message, hashKey, hashKeyLength, hmacLength);
+}
+
+
+// #################### MD5+SHA-1 ####################
+
+// resultArray must have size MD5SHA1::NATURAL_LENGTH or greater
+void *MD5SHA1::hash(const void *data, const size_t dataLength, void *resultArray)
+{
+ br_md5sha1_context context;
+ br_md5sha1_init(&context);
+ br_md5sha1_update(&context, data, dataLength);
+ br_md5sha1_out(&context, resultArray);
+ return resultArray;
+}
+
+String MD5SHA1::hash(const String &message)
+{
+ uint8_t hashArray[NATURAL_LENGTH];
+ hash(message.c_str(), message.length(), hashArray);
+ return TypeCast::uint8ArrayToHexString(hashArray, NATURAL_LENGTH);
+}
+
+
+// #################### HKDF ####################
+
+HKDF::HKDF(const void *keyMaterial, const size_t keyMaterialLength, const void *salt, const size_t saltLength)
+{
+ init(keyMaterial, keyMaterialLength, salt, saltLength);
+}
+
+void HKDF::init(const void *keyMaterial, const size_t keyMaterialLength, const void *salt, const size_t saltLength)
+{
+ // Comments mainly from https://www.bearssl.org/apidoc/bearssl__kdf_8h.html
+
+ // Initialize an HKDF context, with a hash function, and the salt. This starts the HKDF-Extract process.
+ br_hkdf_init(&hkdfContext, &br_sha256_vtable, salt, saltLength);
+
+ // Inject more input bytes. This function may be called repeatedly if the input data is provided by chunks, after br_hkdf_init() but before br_hkdf_flip().
+ br_hkdf_inject(&hkdfContext, keyMaterial, keyMaterialLength);
+
+ // End the HKDF-Extract process, and start the HKDF-Expand process.
+ br_hkdf_flip(&hkdfContext);
+}
+
+size_t HKDF::produce(void *resultArray, const size_t outputLength, const void *info, const size_t infoLength)
+{
+ // Comments mainly from https://www.bearssl.org/apidoc/bearssl__kdf_8h.html
+
+ // HKDF output production (HKDF-Expand).
+ // Produces more output bytes from the current state. This function may be called several times, but only after br_hkdf_flip().
+ // Returned value is the number of actually produced bytes. The total output length is limited to 255 times the output length of the underlying hash function.
+ return br_hkdf_produce(&hkdfContext, info, infoLength, resultArray, outputLength);
+}
+
+
+// #################### Authenticated Encryption with Associated Data (AEAD) ####################
+
+
+// #################### ChaCha20+Poly1305 AEAD ####################
+
+void chacha20Poly1305Kernel(const int encrypt, void *data, const size_t dataLength, const void *key, const void *keySalt, const size_t keySaltLength,
+ const void *nonce, void *tag, const void *aad, const size_t aadLength)
+{
+ if (keySalt == nullptr)
+ {
+ br_poly1305_ctmul32_run(key, nonce, data, dataLength, aad, aadLength, tag, br_chacha20_ct_run, encrypt);
+ }
+ else
+ {
+ HKDF hkdfInstance(key, ENCRYPTION_KEY_LENGTH, keySalt, keySaltLength);
+ uint8_t derivedEncryptionKey[ENCRYPTION_KEY_LENGTH] {0};
+ hkdfInstance.produce(derivedEncryptionKey, ENCRYPTION_KEY_LENGTH);
+ br_poly1305_ctmul32_run(derivedEncryptionKey, nonce, data, dataLength, aad, aadLength, tag, br_chacha20_ct_run, encrypt);
+ }
+}
+
+void ChaCha20Poly1305::encrypt(void *data, const size_t dataLength, const void *key, const void *keySalt, const size_t keySaltLength,
+ void *resultingNonce, void *resultingTag, const void *aad, const size_t aadLength)
+{
+ uint8_t *nonce = (uint8_t *)resultingNonce;
+ getNonceGenerator()(nonce, 12);
+
+ chacha20Poly1305Kernel(1, data, dataLength, key, keySalt, keySaltLength, nonce, resultingTag, aad, aadLength);
+}
+
+bool ChaCha20Poly1305::decrypt(void *data, const size_t dataLength, const void *key, const void *keySalt, const size_t keySaltLength,
+ const void *encryptionNonce, const void *encryptionTag, const void *aad, const size_t aadLength)
+{
+ const uint8_t *oldTag = (const uint8_t *)encryptionTag;
+ uint8_t newTag[16] {0};
+
+ chacha20Poly1305Kernel(0, data, dataLength, key, keySalt, keySaltLength, encryptionNonce, newTag, aad, aadLength);
+
+ for (uint32_t i = 0; i < sizeof newTag; ++i)
+ {
+ if (newTag[i] != oldTag[i])
+ {
+ return false;
+ }
+ }
+
+ return true;
+}
+}
+}
diff --git a/cores/esp8266/Crypto.h b/cores/esp8266/Crypto.h
new file mode 100644
index 0000000000..790c916b6c
--- /dev/null
+++ b/cores/esp8266/Crypto.h
@@ -0,0 +1,845 @@
+/*
+ BearSSL Copyright (c) 2016 Thomas Pornin
+ Rest of this file Copyright (C) 2019 Anders Löfgren
+
+ License (MIT license):
+
+ 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.
+*/
+
+#ifndef __ESP8266_ARDUINO_CRYPTO_H__
+#define __ESP8266_ARDUINO_CRYPTO_H__
+
+#include
+#include
+
+namespace experimental
+{
+namespace crypto
+{
+/**
+ Regarding constant-time (CT) HMAC:
+
+ Basically, constant-time algorithms makes it harder for attackers to learn things about your system based on the execution time of code.
+ Good intro here: https://www.bearssl.org/constanttime.html
+
+ It should be noted that every HMAC is already partially constant-time. Quoting the link above:
+ "Hash functions implemented by BearSSL (MD5, SHA-1, SHA-224, SHA-256, SHA-384 and SHA-512) consist in bitwise logical operations and additions on 32-bit or 64-bit words,
+ naturally yielding constant-time operations. HMAC is naturally as constant-time as the underlying hash function. The size of the MACed data, and the size of the key,
+ may leak, though; only the contents are protected."
+
+ For messages much smaller than getCtMaxDataLength(), constant-time processing takes substantially longer time to complete than a normal HMAC,
+ determined by the size of (getCtMaxDataLength() - getCtMinDataLength()).
+ Constant-time processing also sets limits on the data length.
+
+ Making the fixed data length limits variable will generally defeat the purpose of using constant-time.
+ Using data that exceeds the fixed data length limits will create the wrong HMAC.
+*/
+
+
+/**
+ The nonce generator should take an uint8_t array with a given size in bytes and fill it with the nonce.
+ The uint8_t array should then be returned by the nonce generator.
+*/
+using nonceGeneratorType = std::function;
+
+constexpr uint8_t ENCRYPTION_KEY_LENGTH = 32;
+
+constexpr uint32_t CT_MAX_DIFF = 1073741823; // 2^30 - 1
+
+/**
+ This function allows for fine-tuning of the specifications for the constant time calculations.
+ It should not be changed once a constant time function has been used at least once.
+ Otherwise the constant time will not be constant for the used functions.
+
+ The difference getCtMaxDataLength() - getCtMinDataLength() MUST be less than 2^30 (i.e. about one gigabyte).
+*/
+void setCtMinDataLength(const size_t ctMinDataLength);
+/**
+ 0 by default.
+*/
+size_t getCtMinDataLength();
+
+/**
+ This function allows for fine-tuning of the specifications for the constant time calculations.
+ It should not be changed once a constant time function has been used at least once.
+ Otherwise the constant time will not be constant for the used functions.
+
+ The difference getCtMaxDataLength() - getCtMinDataLength() MUST be less than 2^30 (i.e. about one gigabyte).
+*/
+void setCtMaxDataLength(const size_t ctMaxDataLength);
+/**
+ 1024 by default.
+*/
+size_t getCtMaxDataLength();
+
+/**
+ Set the nonce generator used by the Crypto functions.
+
+ @param nonceGenerator The nonce generator to use.
+*/
+void setNonceGenerator(nonceGeneratorType nonceGenerator);
+nonceGeneratorType getNonceGenerator();
+
+
+// #################### MD5 ####################
+
+struct MD5
+{
+ static constexpr uint8_t NATURAL_LENGTH = 16;
+
+ /**
+ WARNING! The MD5 hash is broken in terms of attacker resistance.
+ Only use it in those cases where attacker resistance is not important. Prefer SHA-256 or higher otherwise.
+
+ Create a MD5 hash of the data. The result will be NATURAL_LENGTH bytes long and stored in resultArray.
+ Uses the BearSSL cryptographic library.
+
+ @param data The data array from which to create the hash.
+ @param dataLength The length of the data array in bytes.
+ @param resultArray The array wherein to store the resulting hash. MUST be be able to contain NATURAL_LENGTH bytes or more.
+
+ @return A pointer to resultArray.
+ */
+ static void *hash(const void *data, const size_t dataLength, void *resultArray) __attribute__((deprecated));
+
+ /**
+ WARNING! The MD5 hash is broken in terms of attacker resistance.
+ Only use it in those cases where attacker resistance is not important. Prefer SHA-256 or higher otherwise.
+
+ Create a MD5 hash of the data. The result will be NATURAL_LENGTH bytes long and returned as a String in HEX format.
+ Uses the BearSSL cryptographic library.
+
+ @param message The string from which to create the hash.
+
+ @return A String with the generated hash in HEX format.
+ */
+ static String hash(const String &message) __attribute__((deprecated));
+
+ /**
+ Create a MD5 HMAC from the data, using the provided hashKey. The result will be up to outputLength bytes long and stored in resultArray.
+ Uses the BearSSL cryptographic library.
+
+ @param data The data array from which to create the HMAC.
+ @param dataLength The length of the data array in bytes.
+ @param hashKey The hash key to use when creating the HMAC.
+ @param hashKeyLength The length of the hash key in bytes.
+ @param resultArray The array wherein to store the resulting HMAC.
+ @param outputLength The desired length of the generated HMAC, in bytes. Must fit within resultArray. If outputLength is greater than NATURAL_LENGTH,
+ the first (lowest index) NATURAL_LENGTH bytes of resultArray will be used for the HMAC.
+ If outputLength is 0, then the natural HMAC output length is selected.
+
+ @return A pointer to resultArray.
+ */
+ static void *hmac(const void *data, const size_t dataLength, const void *hashKey, const size_t hashKeyLength, void *resultArray, const size_t outputLength);
+
+ /**
+ Create a MD5 HMAC from the message, using the provided hashKey. The result will be hmacLength bytes long and returned as a String in HEX format.
+ Uses the BearSSL cryptographic library.
+
+ @param message The string from which to create the HMAC.
+ @param hashKey The hash key to use when creating the HMAC.
+ @param hashKeyLength The length of the hash key in bytes.
+ @param hmacLength The desired length of the generated HMAC, in bytes. Valid values are 1 to NATURAL_LENGTH.
+
+ @return A String with the generated HMAC in HEX format.
+ */
+ static String hmac(const String &message, const void *hashKey, const size_t hashKeyLength, const size_t hmacLength);
+
+ /**
+ Create a MD5 HMAC from the data, using the provided hashKey. The result will be up to outputLength bytes long and stored in resultArray.
+ Constant-time version.
+ Uses the BearSSL cryptographic library.
+
+ @param data The data array from which to create the HMAC.
+ @param dataLength The length of the data array in bytes. Valid values are in the range [getCtMinDataLength(), getCtMaxDataLength()].
+ @param hashKey The hash key to use when creating the HMAC.
+ @param hashKeyLength The length of the hash key in bytes.
+ @param resultArray The array wherein to store the resulting HMAC.
+ @param outputLength The desired length of the generated HMAC, in bytes. Must fit within resultArray. If outputLength is greater than NATURAL_LENGTH,
+ the first (lowest index) NATURAL_LENGTH bytes of resultArray will be used for the HMAC.
+ If outputLength is 0, then the natural HMAC output length is selected.
+
+ @return A pointer to resultArray.
+ */
+ static void *hmacCT(const void *data, const size_t dataLength, const void *hashKey, const size_t hashKeyLength, void *resultArray, const size_t outputLength);
+
+ /**
+ Create a MD5 HMAC from the message, using the provided hashKey. The result will be hmacLength bytes long and returned as a String in HEX format.
+ Constant-time version.
+ Uses the BearSSL cryptographic library.
+
+ @param message The string from which to create the HMAC. Must have a length in the range [getCtMinDataLength(), getCtMaxDataLength()].
+ @param hashKey The hash key to use when creating the HMAC.
+ @param hashKeyLength The length of the hash key in bytes.
+ @param hmacLength The desired length of the generated HMAC, in bytes. Valid values are 1 to NATURAL_LENGTH.
+
+ @return A String with the generated HMAC in HEX format.
+ */
+ static String hmacCT(const String &message, const void *hashKey, const size_t hashKeyLength, const size_t hmacLength);
+};
+
+
+// #################### SHA-1 ####################
+
+struct SHA1
+{
+ static constexpr uint8_t NATURAL_LENGTH = 20;
+
+ /**
+ WARNING! The SHA-1 hash is broken in terms of attacker resistance.
+ Only use it in those cases where attacker resistance is not important. Prefer SHA-256 or higher otherwise.
+
+ Create a SHA1 hash of the data. The result will be NATURAL_LENGTH bytes long and stored in resultArray.
+ Uses the BearSSL cryptographic library.
+
+ @param data The data array from which to create the hash.
+ @param dataLength The length of the data array in bytes.
+ @param resultArray The array wherein to store the resulting hash. MUST be be able to contain NATURAL_LENGTH bytes or more.
+
+ @return A pointer to resultArray.
+ */
+ static void *hash(const void *data, const size_t dataLength, void *resultArray) __attribute__((deprecated));
+
+ /**
+ WARNING! The SHA-1 hash is broken in terms of attacker resistance.
+ Only use it in those cases where attacker resistance is not important. Prefer SHA-256 or higher otherwise.
+
+ Create a SHA1 hash of the data. The result will be NATURAL_LENGTH bytes long and returned as a String in HEX format.
+ Uses the BearSSL cryptographic library.
+
+ @param message The string from which to create the hash.
+
+ @return A String with the generated hash in HEX format.
+ */
+ static String hash(const String &message) __attribute__((deprecated));
+
+ /**
+ Create a SHA1 HMAC from the data, using the provided hashKey. The result will be up to outputLength bytes long and stored in resultArray.
+ Uses the BearSSL cryptographic library.
+
+ @param data The data array from which to create the HMAC.
+ @param dataLength The length of the data array in bytes.
+ @param hashKey The hash key to use when creating the HMAC.
+ @param hashKeyLength The length of the hash key in bytes.
+ @param resultArray The array wherein to store the resulting HMAC.
+ @param outputLength The desired length of the generated HMAC, in bytes. Must fit within resultArray. If outputLength is greater than NATURAL_LENGTH,
+ the first (lowest index) NATURAL_LENGTH bytes of resultArray will be used for the HMAC.
+ If outputLength is 0, then the natural HMAC output length is selected.
+
+ @return A pointer to resultArray.
+ */
+ static void *hmac(const void *data, const size_t dataLength, const void *hashKey, const size_t hashKeyLength, void *resultArray, const size_t outputLength);
+
+ /**
+ Create a SHA1 HMAC from the message, using the provided hashKey. The result will be hmacLength bytes long and returned as a String in HEX format.
+ Uses the BearSSL cryptographic library.
+
+ @param message The string from which to create the HMAC.
+ @param hashKey The hash key to use when creating the HMAC.
+ @param hashKeyLength The length of the hash key in bytes.
+ @param hmacLength The desired length of the generated HMAC, in bytes. Valid values are 1 to NATURAL_LENGTH.
+
+ @return A String with the generated HMAC in HEX format.
+ */
+ static String hmac(const String &message, const void *hashKey, const size_t hashKeyLength, const size_t hmacLength);
+
+ /**
+ Create a SHA1 HMAC from the data, using the provided hashKey. The result will be up to outputLength bytes long and stored in resultArray.
+ Constant-time version.
+ Uses the BearSSL cryptographic library.
+
+ @param data The data array from which to create the HMAC.
+ @param dataLength The length of the data array in bytes. Valid values are in the range [getCtMinDataLength(), getCtMaxDataLength()].
+ @param hashKey The hash key to use when creating the HMAC.
+ @param hashKeyLength The length of the hash key in bytes.
+ @param resultArray The array wherein to store the resulting HMAC.
+ @param outputLength The desired length of the generated HMAC, in bytes. Must fit within resultArray. If outputLength is greater than NATURAL_LENGTH,
+ the first (lowest index) NATURAL_LENGTH bytes of resultArray will be used for the HMAC.
+ If outputLength is 0, then the natural HMAC output length is selected.
+
+ @return A pointer to resultArray.
+ */
+ static void *hmacCT(const void *data, const size_t dataLength, const void *hashKey, const size_t hashKeyLength, void *resultArray, const size_t outputLength);
+
+ /**
+ Create a SHA1 HMAC from the message, using the provided hashKey. The result will be hmacLength bytes long and returned as a String in HEX format.
+ Constant-time version.
+ Uses the BearSSL cryptographic library.
+
+ @param message The string from which to create the HMAC. Must have a length in the range [getCtMinDataLength(), getCtMaxDataLength()].
+ @param hashKey The hash key to use when creating the HMAC.
+ @param hashKeyLength The length of the hash key in bytes.
+ @param hmacLength The desired length of the generated HMAC, in bytes. Valid values are 1 to NATURAL_LENGTH.
+
+ @return A String with the generated HMAC in HEX format.
+ */
+ static String hmacCT(const String &message, const void *hashKey, const size_t hashKeyLength, const size_t hmacLength);
+};
+
+
+// #################### SHA-224 ####################
+
+struct SHA224
+{
+ static constexpr uint8_t NATURAL_LENGTH = 28;
+
+ /**
+ Create a SHA224 hash of the data. The result will be NATURAL_LENGTH bytes long and stored in resultArray.
+ Uses the BearSSL cryptographic library.
+
+ @param data The data array from which to create the hash.
+ @param dataLength The length of the data array in bytes.
+ @param resultArray The array wherein to store the resulting hash. MUST be be able to contain NATURAL_LENGTH bytes or more.
+
+ @return A pointer to resultArray.
+ */
+ static void *hash(const void *data, const size_t dataLength, void *resultArray);
+
+ /**
+ Create a SHA224 hash of the data. The result will be NATURAL_LENGTH bytes long and returned as a String in HEX format.
+ Uses the BearSSL cryptographic library.
+
+ @param message The string from which to create the hash.
+
+ @return A String with the generated hash in HEX format.
+ */
+ static String hash(const String &message);
+
+ /**
+ Create a SHA224 HMAC from the data, using the provided hashKey. The result will be up to outputLength bytes long and stored in resultArray.
+ Uses the BearSSL cryptographic library.
+
+ @param data The data array from which to create the HMAC.
+ @param dataLength The length of the data array in bytes.
+ @param hashKey The hash key to use when creating the HMAC.
+ @param hashKeyLength The length of the hash key in bytes.
+ @param resultArray The array wherein to store the resulting HMAC.
+ @param outputLength The desired length of the generated HMAC, in bytes. Must fit within resultArray. If outputLength is greater than NATURAL_LENGTH,
+ the first (lowest index) NATURAL_LENGTH bytes of resultArray will be used for the HMAC.
+ If outputLength is 0, then the natural HMAC output length is selected.
+
+ @return A pointer to resultArray.
+ */
+ static void *hmac(const void *data, const size_t dataLength, const void *hashKey, const size_t hashKeyLength, void *resultArray, const size_t outputLength);
+
+ /**
+ Create a SHA224 HMAC from the message, using the provided hashKey. The result will be hmacLength bytes long and returned as a String in HEX format.
+ Uses the BearSSL cryptographic library.
+
+ @param message The string from which to create the HMAC.
+ @param hashKey The hash key to use when creating the HMAC.
+ @param hashKeyLength The length of the hash key in bytes.
+ @param hmacLength The desired length of the generated HMAC, in bytes. Valid values are 1 to NATURAL_LENGTH.
+
+ @return A String with the generated HMAC in HEX format.
+ */
+ static String hmac(const String &message, const void *hashKey, const size_t hashKeyLength, const size_t hmacLength);
+
+ /**
+ Create a SHA224 HMAC from the data, using the provided hashKey. The result will be up to outputLength bytes long and stored in resultArray.
+ Constant-time version.
+ Uses the BearSSL cryptographic library.
+
+ @param data The data array from which to create the HMAC.
+ @param dataLength The length of the data array in bytes. Valid values are in the range [getCtMinDataLength(), getCtMaxDataLength()].
+ @param hashKey The hash key to use when creating the HMAC.
+ @param hashKeyLength The length of the hash key in bytes.
+ @param resultArray The array wherein to store the resulting HMAC.
+ @param outputLength The desired length of the generated HMAC, in bytes. Must fit within resultArray. If outputLength is greater than NATURAL_LENGTH,
+ the first (lowest index) NATURAL_LENGTH bytes of resultArray will be used for the HMAC.
+ If outputLength is 0, then the natural HMAC output length is selected.
+
+ @return A pointer to resultArray.
+ */
+ static void *hmacCT(const void *data, const size_t dataLength, const void *hashKey, const size_t hashKeyLength, void *resultArray, const size_t outputLength);
+
+ /**
+ Create a SHA224 HMAC from the message, using the provided hashKey. The result will be hmacLength bytes long and returned as a String in HEX format.
+ Constant-time version.
+ Uses the BearSSL cryptographic library.
+
+ @param message The string from which to create the HMAC. Must have a length in the range [getCtMinDataLength(), getCtMaxDataLength()].
+ @param hashKey The hash key to use when creating the HMAC.
+ @param hashKeyLength The length of the hash key in bytes.
+ @param hmacLength The desired length of the generated HMAC, in bytes. Valid values are 1 to NATURAL_LENGTH.
+
+ @return A String with the generated HMAC in HEX format.
+ */
+ static String hmacCT(const String &message, const void *hashKey, const size_t hashKeyLength, const size_t hmacLength);
+};
+
+
+// #################### SHA-256 ####################
+
+struct SHA256
+{
+ static constexpr uint8_t NATURAL_LENGTH = 32;
+
+ /**
+ Create a SHA256 hash of the data. The result will be NATURAL_LENGTH bytes long and stored in resultArray.
+ Uses the BearSSL cryptographic library.
+
+ @param data The data array from which to create the hash.
+ @param dataLength The length of the data array in bytes.
+ @param resultArray The array wherein to store the resulting hash. MUST be be able to contain NATURAL_LENGTH bytes or more.
+
+ @return A pointer to resultArray.
+ */
+ static void *hash(const void *data, const size_t dataLength, void *resultArray);
+
+ /**
+ Create a SHA256 hash of the data. The result will be NATURAL_LENGTH bytes long and returned as a String in HEX format.
+ Uses the BearSSL cryptographic library.
+
+ @param message The string from which to create the hash.
+
+ @return A String with the generated hash in HEX format.
+ */
+ static String hash(const String &message);
+
+ /**
+ Create a SHA256 HMAC from the data, using the provided hashKey. The result will be up to outputLength bytes long and stored in resultArray.
+ Uses the BearSSL cryptographic library.
+
+ @param data The data array from which to create the HMAC.
+ @param dataLength The length of the data array in bytes.
+ @param hashKey The hash key to use when creating the HMAC.
+ @param hashKeyLength The length of the hash key in bytes.
+ @param resultArray The array wherein to store the resulting HMAC.
+ @param outputLength The desired length of the generated HMAC, in bytes. Must fit within resultArray. If outputLength is greater than NATURAL_LENGTH,
+ the first (lowest index) NATURAL_LENGTH bytes of resultArray will be used for the HMAC.
+ If outputLength is 0, then the natural HMAC output length is selected.
+
+ @return A pointer to resultArray.
+ */
+ static void *hmac(const void *data, const size_t dataLength, const void *hashKey, const size_t hashKeyLength, void *resultArray, const size_t outputLength);
+
+ /**
+ Create a SHA256 HMAC from the message, using the provided hashKey. The result will be hmacLength bytes long and returned as a String in HEX format.
+ Uses the BearSSL cryptographic library.
+
+ @param message The string from which to create the HMAC.
+ @param hashKey The hash key to use when creating the HMAC.
+ @param hashKeyLength The length of the hash key in bytes.
+ @param hmacLength The desired length of the generated HMAC, in bytes. Valid values are 1 to NATURAL_LENGTH.
+
+ @return A String with the generated HMAC in HEX format.
+ */
+ static String hmac(const String &message, const void *hashKey, const size_t hashKeyLength, const size_t hmacLength);
+
+ /**
+ Create a SHA256 HMAC from the data, using the provided hashKey. The result will be up to outputLength bytes long and stored in resultArray.
+ Constant-time version.
+ Uses the BearSSL cryptographic library.
+
+ @param data The data array from which to create the HMAC.
+ @param dataLength The length of the data array in bytes. Valid values are in the range [getCtMinDataLength(), getCtMaxDataLength()].
+ @param hashKey The hash key to use when creating the HMAC.
+ @param hashKeyLength The length of the hash key in bytes.
+ @param resultArray The array wherein to store the resulting HMAC.
+ @param outputLength The desired length of the generated HMAC, in bytes. Must fit within resultArray. If outputLength is greater than NATURAL_LENGTH,
+ the first (lowest index) NATURAL_LENGTH bytes of resultArray will be used for the HMAC.
+ If outputLength is 0, then the natural HMAC output length is selected.
+
+ @return A pointer to resultArray.
+ */
+ static void *hmacCT(const void *data, const size_t dataLength, const void *hashKey, const size_t hashKeyLength, void *resultArray, const size_t outputLength);
+
+ /**
+ Create a SHA256 HMAC from the message, using the provided hashKey. The result will be hmacLength bytes long and returned as a String in HEX format.
+ Constant-time version.
+ Uses the BearSSL cryptographic library.
+
+ @param message The string from which to create the HMAC. Must have a length in the range [getCtMinDataLength(), getCtMaxDataLength()].
+ @param hashKey The hash key to use when creating the HMAC.
+ @param hashKeyLength The length of the hash key in bytes.
+ @param hmacLength The desired length of the generated HMAC, in bytes. Valid values are 1 to NATURAL_LENGTH.
+
+ @return A String with the generated HMAC in HEX format.
+ */
+ static String hmacCT(const String &message, const void *hashKey, const size_t hashKeyLength, const size_t hmacLength);
+};
+
+
+// #################### SHA-384 ####################
+
+struct SHA384
+{
+ static constexpr uint8_t NATURAL_LENGTH = 48;
+
+ /**
+ Create a SHA384 hash of the data. The result will be NATURAL_LENGTH bytes long and stored in resultArray.
+ Uses the BearSSL cryptographic library.
+
+ @param data The data array from which to create the hash.
+ @param dataLength The length of the data array in bytes.
+ @param resultArray The array wherein to store the resulting hash. MUST be be able to contain NATURAL_LENGTH bytes or more.
+
+ @return A pointer to resultArray.
+ */
+ static void *hash(const void *data, const size_t dataLength, void *resultArray);
+
+ /**
+ Create a SHA384 hash of the data. The result will be NATURAL_LENGTH bytes long and returned as a String in HEX format.
+ Uses the BearSSL cryptographic library.
+
+ @param message The string from which to create the hash.
+
+ @return A String with the generated hash in HEX format.
+ */
+ static String hash(const String &message);
+
+ /**
+ Create a SHA384 HMAC from the data, using the provided hashKey. The result will be up to outputLength bytes long and stored in resultArray.
+ Uses the BearSSL cryptographic library.
+
+ @param data The data array from which to create the HMAC.
+ @param dataLength The length of the data array in bytes.
+ @param hashKey The hash key to use when creating the HMAC.
+ @param hashKeyLength The length of the hash key in bytes.
+ @param resultArray The array wherein to store the resulting HMAC.
+ @param outputLength The desired length of the generated HMAC, in bytes. Must fit within resultArray. If outputLength is greater than NATURAL_LENGTH,
+ the first (lowest index) NATURAL_LENGTH bytes of resultArray will be used for the HMAC.
+ If outputLength is 0, then the natural HMAC output length is selected.
+
+ @return A pointer to resultArray.
+ */
+ static void *hmac(const void *data, const size_t dataLength, const void *hashKey, const size_t hashKeyLength, void *resultArray, const size_t outputLength);
+
+ /**
+ Create a SHA384 HMAC from the message, using the provided hashKey. The result will be hmacLength bytes long and returned as a String in HEX format.
+ Uses the BearSSL cryptographic library.
+
+ @param message The string from which to create the HMAC.
+ @param hashKey The hash key to use when creating the HMAC.
+ @param hashKeyLength The length of the hash key in bytes.
+ @param hmacLength The desired length of the generated HMAC, in bytes. Valid values are 1 to NATURAL_LENGTH.
+
+ @return A String with the generated HMAC in HEX format.
+ */
+ static String hmac(const String &message, const void *hashKey, const size_t hashKeyLength, const size_t hmacLength);
+
+ /**
+ Create a SHA384 HMAC from the data, using the provided hashKey. The result will be up to outputLength bytes long and stored in resultArray.
+ Constant-time version.
+ Uses the BearSSL cryptographic library.
+
+ @param data The data array from which to create the HMAC.
+ @param dataLength The length of the data array in bytes. Valid values are in the range [getCtMinDataLength(), getCtMaxDataLength()].
+ @param hashKey The hash key to use when creating the HMAC.
+ @param hashKeyLength The length of the hash key in bytes.
+ @param resultArray The array wherein to store the resulting HMAC.
+ @param outputLength The desired length of the generated HMAC, in bytes. Must fit within resultArray. If outputLength is greater than NATURAL_LENGTH,
+ the first (lowest index) NATURAL_LENGTH bytes of resultArray will be used for the HMAC.
+ If outputLength is 0, then the natural HMAC output length is selected.
+
+ @return A pointer to resultArray.
+ */
+ static void *hmacCT(const void *data, const size_t dataLength, const void *hashKey, const size_t hashKeyLength, void *resultArray, const size_t outputLength);
+
+ /**
+ Create a SHA384 HMAC from the message, using the provided hashKey. The result will be hmacLength bytes long and returned as a String in HEX format.
+ Constant-time version.
+ Uses the BearSSL cryptographic library.
+
+ @param message The string from which to create the HMAC. Must have a length in the range [getCtMinDataLength(), getCtMaxDataLength()].
+ @param hashKey The hash key to use when creating the HMAC.
+ @param hashKeyLength The length of the hash key in bytes.
+ @param hmacLength The desired length of the generated HMAC, in bytes. Valid values are 1 to NATURAL_LENGTH.
+
+ @return A String with the generated HMAC in HEX format.
+ */
+ static String hmacCT(const String &message, const void *hashKey, const size_t hashKeyLength, const size_t hmacLength);
+};
+
+
+// #################### SHA-512 ####################
+
+struct SHA512
+{
+ static constexpr uint8_t NATURAL_LENGTH = 64;
+
+ /**
+ Create a SHA512 hash of the data. The result will be NATURAL_LENGTH bytes long and stored in resultArray.
+ Uses the BearSSL cryptographic library.
+
+ @param data The data array from which to create the hash.
+ @param dataLength The length of the data array in bytes.
+ @param resultArray The array wherein to store the resulting hash. MUST be be able to contain NATURAL_LENGTH bytes or more.
+
+ @return A pointer to resultArray.
+ */
+ static void *hash(const void *data, const size_t dataLength, void *resultArray);
+
+ /**
+ Create a SHA512 hash of the data. The result will be NATURAL_LENGTH bytes long and returned as a String in HEX format.
+ Uses the BearSSL cryptographic library.
+
+ @param message The string from which to create the hash.
+
+ @return A String with the generated hash in HEX format.
+ */
+ static String hash(const String &message);
+
+ /**
+ Create a SHA512 HMAC from the data, using the provided hashKey. The result will be up to outputLength bytes long and stored in resultArray.
+ Uses the BearSSL cryptographic library.
+
+ @param data The data array from which to create the HMAC.
+ @param dataLength The length of the data array in bytes.
+ @param hashKey The hash key to use when creating the HMAC.
+ @param hashKeyLength The length of the hash key in bytes.
+ @param resultArray The array wherein to store the resulting HMAC.
+ @param outputLength The desired length of the generated HMAC, in bytes. Must fit within resultArray. If outputLength is greater than NATURAL_LENGTH,
+ the first (lowest index) NATURAL_LENGTH bytes of resultArray will be used for the HMAC.
+ If outputLength is 0, then the natural HMAC output length is selected.
+
+ @return A pointer to resultArray.
+ */
+ static void *hmac(const void *data, const size_t dataLength, const void *hashKey, const size_t hashKeyLength, void *resultArray, const size_t outputLength);
+
+ /**
+ Create a SHA512 HMAC from the message, using the provided hashKey. The result will be hmacLength bytes long and returned as a String in HEX format.
+ Uses the BearSSL cryptographic library.
+
+ @param message The string from which to create the HMAC.
+ @param hashKey The hash key to use when creating the HMAC.
+ @param hashKeyLength The length of the hash key in bytes.
+ @param hmacLength The desired length of the generated HMAC, in bytes. Valid values are 1 to NATURAL_LENGTH.
+
+ @return A String with the generated HMAC in HEX format.
+ */
+ static String hmac(const String &message, const void *hashKey, const size_t hashKeyLength, const size_t hmacLength);
+
+ /**
+ Create a SHA512 HMAC from the data, using the provided hashKey. The result will be up to outputLength bytes long and stored in resultArray.
+ Constant-time version.
+ Uses the BearSSL cryptographic library.
+
+ @param data The data array from which to create the HMAC.
+ @param dataLength The length of the data array in bytes. Valid values are in the range [getCtMinDataLength(), getCtMaxDataLength()].
+ @param hashKey The hash key to use when creating the HMAC.
+ @param hashKeyLength The length of the hash key in bytes.
+ @param resultArray The array wherein to store the resulting HMAC.
+ @param outputLength The desired length of the generated HMAC, in bytes. Must fit within resultArray. If outputLength is greater than NATURAL_LENGTH,
+ the first (lowest index) NATURAL_LENGTH bytes of resultArray will be used for the HMAC.
+ If outputLength is 0, then the natural HMAC output length is selected.
+
+ @return A pointer to resultArray.
+ */
+ static void *hmacCT(const void *data, const size_t dataLength, const void *hashKey, const size_t hashKeyLength, void *resultArray, const size_t outputLength);
+
+ /**
+ Create a SHA512 HMAC from the message, using the provided hashKey. The result will be hmacLength bytes long and returned as a String in HEX format.
+ Constant-time version.
+ Uses the BearSSL cryptographic library.
+
+ @param message The string from which to create the HMAC. Must have a length in the range [getCtMinDataLength(), getCtMaxDataLength()].
+ @param hashKey The hash key to use when creating the HMAC.
+ @param hashKeyLength The length of the hash key in bytes.
+ @param hmacLength The desired length of the generated HMAC, in bytes. Valid values are 1 to NATURAL_LENGTH.
+
+ @return A String with the generated HMAC in HEX format.
+ */
+ static String hmacCT(const String &message, const void *hashKey, const size_t hashKeyLength, const size_t hmacLength);
+};
+
+
+// #################### MD5+SHA-1 ####################
+
+struct MD5SHA1
+{
+ static constexpr uint8_t NATURAL_LENGTH = 36;
+
+ /**
+ Create a MD5+SHA-1 hash of the data. The result will be NATURAL_LENGTH bytes long and stored in resultArray.
+ Uses the BearSSL cryptographic library.
+
+ MD5+SHA-1 is the concatenation of MD5 and SHA-1 computed over the same input; in the implementation, the internal data buffer is shared,
+ thus making it more memory-efficient than separate MD5 and SHA-1. It can be useful in implementing SSL 3.0, TLS 1.0 and TLS 1.1.
+
+ @param data The data array from which to create the hash.
+ @param dataLength The length of the data array in bytes.
+ @param resultArray The array wherein to store the resulting hash. MUST be be able to contain NATURAL_LENGTH bytes or more.
+
+ @return A pointer to resultArray.
+ */
+ static void *hash(const void *data, const size_t dataLength, void *resultArray);
+
+ /**
+ Create a MD5+SHA-1 hash of the data. The result will be NATURAL_LENGTH bytes long and returned as a String in HEX format.
+ Uses the BearSSL cryptographic library.
+
+ MD5+SHA-1 is the concatenation of MD5 and SHA-1 computed over the same input; in the implementation, the internal data buffer is shared,
+ thus making it more memory-efficient than separate MD5 and SHA-1. It can be useful in implementing SSL 3.0, TLS 1.0 and TLS 1.1.
+
+ @param message The string from which to create the hash.
+
+ @return A String with the generated hash in HEX format.
+ */
+ static String hash(const String &message);
+};
+
+
+// #################### HKDF ####################
+
+struct HKDF
+{
+ /**
+ KDFs (key derivation functions) are functions that takes a variable length input, and provide a variable length output, meant to be used to derive subkeys from a master key.
+ HKDF is a KDF defined by RFC 5869. It is based on HMAC. The provided implementation uses SHA-256 as the underlying hash function.
+
+ The constructor initializes the HKDF implementation with the input data to use for HKDF processing. (calls HKDF::init())
+
+ @param keyMaterial An array containing the key material to use when deriving subkeys. Typically this would be the master key.
+ @param keyMaterialLength The length of keyMaterial in bytes.
+ @param salt An array containing the salt to use when ingesting key material. Salt is non-secret and can be empty.
+ Its role is normally to bind the input to a conventional identifier that qualify it within the used protocol or application.
+ @param saltLength The length of the salt array, in bytes.
+ */
+ HKDF(const void *keyMaterial, const size_t keyMaterialLength, const void *salt = nullptr, const size_t saltLength = 0);
+
+ /**
+ This method initializes the HKDF implementation with the input data to use for HKDF processing.
+ Uses the BearSSL cryptographic library.
+
+ @param keyMaterial An array containing the key material to use when deriving subkeys. Typically this would be the master key.
+ @param keyMaterialLength The length of keyMaterial in bytes.
+ @param salt An array containing the salt to use when ingesting key material. Salt is non-secret and can be empty.
+ Its role is normally to bind the input to a conventional identifier that qualify it within the used protocol or application.
+ @param saltLength The length of the salt array, in bytes.
+ */
+ void init(const void *keyMaterial, const size_t keyMaterialLength, const void *salt = nullptr, const size_t saltLength = 0);
+
+ /**
+ Produce more output bytes from the current HKDF state. This method may be called several times to obtain the full output by chunks.
+ The total output size is limited to 255 * SHA256::NATURAL_LENGTH bytes per unique HKDF::init()/constructor call.
+ Uses the BearSSL cryptographic library.
+
+ @param resultArray The array wherein to store the resulting HKDF.
+ @param outputLength The requested number of bytes to fill with HKDF output in resultArray.
+ @param info NOTE: For correct HKDF processing, the same "info" string must be provided for every call until there's a new unique HKDF::init().
+ An array containing the information string to use when producing output. Info is non-secret and can be empty.
+ Its role is normally to bind the output to a conventional identifier that qualify it within the used protocol or application.
+ @param infoLength The length of the info array, in bytes.
+
+ @return The number of HKDF bytes actually produced.
+ */
+ size_t produce(void *resultArray, const size_t outputLength, const void *info = nullptr, size_t infoLength = 0);
+
+private:
+
+ br_hkdf_context hkdfContext;
+};
+
+
+// #################### Authenticated Encryption with Associated Data (AEAD) ####################
+
+/**
+ From https://www.bearssl.org/apidoc/bearssl__aead_8h.html
+
+ An AEAD algorithm processes messages and provides confidentiality (encryption) and checked integrity (MAC). It uses the following parameters:
+
+ - A symmetric key. Exact size depends on the AEAD algorithm.
+ - A nonce (IV). Size depends on the AEAD algorithm; for most algorithms, it is crucial for security that any given nonce value is never used twice for the same key and distinct messages.
+ - Data to encrypt and protect.
+ - Additional authenticated data, which is covered by the MAC but otherwise left untouched (i.e. not encrypted).
+
+ The AEAD algorithm encrypts the data, and produces an authentication tag.
+ It is assumed that the encrypted data, the tag, the additional authenticated data and the nonce are sent to the receiver;
+ the additional data and the nonce may be implicit (e.g. using elements of the underlying transport protocol, such as record sequence numbers).
+ The receiver will recompute the tag value and compare it with the one received;
+ if they match, then the data is correct, and can be decrypted and used;
+ otherwise, at least one of the elements was altered in transit, normally leading to wholesale rejection of the complete message.
+*/
+
+
+// #################### ChaCha20+Poly1305 AEAD ####################
+
+struct ChaCha20Poly1305
+{
+ /**
+ Encrypt the data array using the ChaCha20 stream cipher and use Poly1305 for message authentication.
+ The function generates in place an equal-length ChaCha20 encrypted version of the data array.
+ More information about this encryption standard can be found here: https://tools.ietf.org/html/rfc7539 , https://tools.ietf.org/html/rfc8439
+ Uses the BearSSL cryptographic library.
+
+ Encryption of small messages (up to a few hundred data bytes) takes around 0.5-1 ms with the default nonceGenerator, half of this without keySalt.
+
+ The output values of ChaCha20Poly1305::encrypt should be passed as input values to ChaCha20Poly1305::decrypt.
+
+ Note that a 12 byte nonce is generated via getNonceGenerator() every time ChaCha20Poly1305::encrypt is called.
+ If the same key and nonce combination is used more than once for distinct messages, the encryption will be broken, so keep the following in mind:
+
+ By default the nonce is generated via the hardware random number generator of the ESP8266.
+ The entropy of this source may not be sufficient to avoid nonce collisions, so to further reduce the risk of encryption failure
+ it is recommended that a keySalt is always provided when using the default nonceGenerator. Using a keySalt will create a
+ pseudorandom subkey from the original key via HKDF, and use that for the encryption/decryption.
+ The same key + keySalt will always generate the same subkey.
+
+ An alternative to using a keySalt is to change the nonceGenerator so that it does not rely on random numbers.
+ One way to do this would be to use a counter that guarantees the same key + nonce combination is never used.
+ This may not be easily achievable in all scenarios, however.
+
+ @param data An array containing the data to encrypt. The encrypted data is generated in place, so when the function returns the data array will contain the encrypted data.
+ @param dataLength The length of the data array in bytes.
+ @param key The secret encryption key to use. Must be 32 bytes (ENCRYPTION_KEY_LENGTH) long.
+ @param keySalt The salt to use when generating a subkey from key. Note that the same salt must be used during decryption as during encryption. Set to nullptr to prevent subkey generation.
+ @param keySaltLength The length of keySalt in bytes.
+ @param resultingNonce The array that will store the nonce generated during encryption. Must be able to contain at least 12 bytes. The nonce is not secret and must be passed to the decryption function.
+ @param resultingTag The array that will store the message authentication tag generated during encryption. Must be able to contain at least 16 bytes. The tag is not secret and must be passed to the decryption function.
+ @param aad Additional authenticated data. This data will be covered by the Poly1305 MAC, but not encrypted.
+ You can include the unencrypted parts of your message as AAD to ensure that the encrypted content cannot
+ be re-sent with replaced unencrypted data by an attacker.
+ Defaults to nullptr.
+ @param aadLength The length of the aad array in bytes. Defaults to 0.
+ */
+ static void encrypt(void *data, const size_t dataLength, const void *key, const void *keySalt, const size_t keySaltLength, void *resultingNonce, void *resultingTag, const void *aad = nullptr, const size_t aadLength = 0);
+
+ /**
+ Decrypt the data array using the ChaCha20 stream cipher and use Poly1305 for message authentication.
+ The function generates in place an equal-length ChaCha20 decrypted version of the data array.
+ More information about this encryption standard can be found here: https://tools.ietf.org/html/rfc7539 , https://tools.ietf.org/html/rfc8439
+ Uses the BearSSL cryptographic library.
+
+ Decryption of small messages (up to a few hundred data bytes) takes around 0.5-1 ms, half of this without keySalt.
+
+ The output values of ChaCha20Poly1305::encrypt should be passed as input values to ChaCha20Poly1305::decrypt.
+
+ @param data An array containing the data to decrypt. The decrypted data is generated in place, so when the function returns the data array will contain the decrypted data.
+ @param dataLength The length of the data array in bytes.
+ @param key The secret encryption key to use. Must be 32 bytes (ENCRYPTION_KEY_LENGTH) long.
+ @param keySalt The salt to use when generating a subkey from key. Note that the same salt must be used during decryption as during encryption. Set to nullptr to prevent subkey generation.
+ @param keySaltLength The length of keySalt in bytes.
+ @param encryptionNonce An array containing the nonce that was generated during encryption. The nonce should be 12 bytes.
+ @param encryptionTag An array containing the message authentication tag that was generated during encryption. The tag should be 16 bytes.
+ @param aad Additional authenticated data. This data will be covered by the Poly1305 MAC, but not decrypted.
+ You can include the unencrypted parts of your message as AAD to ensure that the encrypted content cannot
+ be re-sent with replaced unencrypted data by an attacker.
+ Defaults to nullptr.
+ @param aadLength The length of the aad array in bytes. Defaults to 0.
+
+ @return True if the decryption was successful (the generated tag matches encryptionTag). False otherwise. Note that the data array is modified regardless of this outcome.
+ */
+ static bool decrypt(void *data, const size_t dataLength, const void *key, const void *keySalt, const size_t keySaltLength, const void *encryptionNonce, const void *encryptionTag, const void *aad = nullptr, const size_t aadLength = 0);
+};
+}
+}
+#endif
diff --git a/cores/esp8266/Esp-frag.cpp b/cores/esp8266/Esp-frag.cpp
new file mode 100644
index 0000000000..9e4e9af6f1
--- /dev/null
+++ b/cores/esp8266/Esp-frag.cpp
@@ -0,0 +1,63 @@
+/*
+ Esp.cpp - ESP8266-specific APIs
+ Copyright (c) 2015 Ivan Grokhotkov. All rights reserved.
+ This file is part of the esp8266 core for Arduino environment.
+
+ 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 "umm_malloc/umm_malloc.h"
+#include "coredecls.h"
+#include "Esp.h"
+
+#if defined(UMM_INFO)
+void EspClass::getHeapStats(uint32_t* hfree, uint32_t* hmax, uint8_t* hfrag)
+{
+ // L2 / Euclidean norm of free block sizes.
+ // Having getFreeHeap()=sum(hole-size), fragmentation is given by
+ // 100 * (1 - sqrt(sum(hole-size²)) / sum(hole-size))
+ umm_info(NULL, false);
+
+ uint32_t free_size = umm_free_heap_size_core(umm_get_current_heap());
+ if (hfree)
+ *hfree = free_size;
+ if (hmax)
+ *hmax = umm_max_block_size_core(umm_get_current_heap());
+ if (hfrag) {
+ if (free_size) {
+ *hfrag = umm_fragmentation_metric_core(umm_get_current_heap());
+ } else {
+ *hfrag = 0;
+ }
+ }
+}
+
+void EspClass::getHeapStats(uint32_t* hfree, uint16_t* hmax, uint8_t* hfrag)
+{
+ uint32_t hmax32;
+ getHeapStats(hfree, &hmax32, hfrag);
+ if (hmax) {
+ // With the MMU_EXTERNAL_HEAP option, hmax could overflow for heaps larger
+ // then 64KB. return UINT16_MAX (saturation) for those cases.
+ // Added deprecated attribute and message.
+ *hmax = (hmax32 > UINT16_MAX) ? UINT16_MAX : hmax32;
+ }
+}
+
+uint8_t EspClass::getHeapFragmentation()
+{
+ return (uint8_t)umm_fragmentation_metric();
+}
+#endif
diff --git a/cores/esp8266/Esp-version.cpp b/cores/esp8266/Esp-version.cpp
new file mode 100644
index 0000000000..c1ff61eb06
--- /dev/null
+++ b/cores/esp8266/Esp-version.cpp
@@ -0,0 +1,49 @@
+/*
+ Esp.cpp - ESP8266-specific APIs
+ Copyright (c) 2015 Ivan Grokhotkov. All rights reserved.
+ This file is part of the esp8266 core for Arduino environment.
+
+ 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
+#include
+#include
+#include // LWIP_HASH_STR (lwip2)
+#include // BEARSSL_GIT short hash
+
+#define STRHELPER(x) #x
+#define STR(x) STRHELPER(x) // stringifier
+
+static const char arduino_esp8266_git_ver [] PROGMEM = "/Core:" STR(ARDUINO_ESP8266_GIT_DESC) "=";
+#if LWIP_IPV6
+static const char lwip_version [] PROGMEM = "/lwIP:IPv6+" LWIP_HASH_STR;
+#else
+static const char lwip_version [] PROGMEM = "/lwIP:" LWIP_HASH_STR;
+#endif
+static const char bearssl_version [] PROGMEM = "/BearSSL:" STR(BEARSSL_GIT);
+
+String EspClass::getFullVersion() {
+ String s(F("SDK:"));
+ s.reserve(127);
+
+ s += system_get_sdk_version();
+ s += FPSTR(arduino_esp8266_git_ver);
+ s += String(esp8266::coreVersionNumeric());
+ s += FPSTR(lwip_version);
+ s += FPSTR(bearssl_version);
+
+ return s;
+}
diff --git a/cores/esp8266/Esp.cpp b/cores/esp8266/Esp.cpp
index 3416c9b913..67719dcfe7 100644
--- a/cores/esp8266/Esp.cpp
+++ b/cores/esp8266/Esp.cpp
@@ -18,11 +18,20 @@
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
-#include "Arduino.h"
+#include "Esp.h"
#include "flash_utils.h"
#include "eboot_command.h"
#include
#include "interrupts.h"
+#include "MD5Builder.h"
+#include "umm_malloc/umm_malloc.h"
+#include "cont.h"
+#include "flash_hal.h"
+#include "coredecls.h"
+#include "umm_malloc/umm_malloc.h"
+#include
+#include "reboot_uart_dwnld.h"
+#include "hardware_reset.h"
extern "C" {
#include "user_interface.h"
@@ -33,6 +42,9 @@ extern struct rst_info resetInfo;
//#define DEBUG_SERIAL Serial
+#ifndef PUYA_SUPPORT
+ #define PUYA_SUPPORT 1
+#endif
/**
* User-defined Literals
@@ -82,6 +94,7 @@ EspClass ESP;
void EspClass::wdtEnable(uint32_t timeout_ms)
{
+ (void) timeout_ms;
/// This API can only be called if software watchdog is stopped
system_soft_wdt_restart();
}
@@ -103,16 +116,81 @@ void EspClass::wdtFeed(void)
system_soft_wdt_feed();
}
-extern "C" void esp_yield();
-
-void EspClass::deepSleep(uint32_t time_us, WakeMode mode)
+void EspClass::deepSleep(uint64_t time_us, WakeMode mode)
{
system_deep_sleep_set_option(static_cast(mode));
system_deep_sleep(time_us);
- esp_yield();
+ esp_suspend();
+}
+
+void EspClass::deepSleepInstant(uint64_t time_us, WakeMode mode)
+{
+ system_deep_sleep_set_option(static_cast(mode));
+ system_deep_sleep_instant(time_us);
+ esp_suspend();
+}
+
+//this calculation was taken verbatim from the SDK api reference for SDK 2.1.0.
+//Note: system_rtc_clock_cali_proc() returns a uint32_t, even though system_deep_sleep() takes a uint64_t.
+uint64_t EspClass::deepSleepMax()
+{
+ //cali*(2^31-1)/(2^12)
+ return (uint64_t)system_rtc_clock_cali_proc()*(0x80000000-1)/(0x1000);
+
+}
+
+/*
+Layout of RTC Memory is as follows:
+Ref: Espressif doc 2C-ESP8266_Non_OS_SDK_API_Reference, section 3.3.23 (system_rtc_mem_write)
+
+|<------system data (256 bytes)------->|<-----------------user data (512 bytes)--------------->|
+
+SDK function signature:
+bool system_rtc_mem_read (
+ uint32 des_addr,
+ void * src_addr,
+ uint32 save_size
+)
+
+The system data section can't be used by the user, so:
+des_addr must be >=64 (i.e.: 256/4) and <192 (i.e.: 768/4)
+src_addr is a pointer to data
+save_size is the number of bytes to write
+
+For the method interface:
+offset is the user block number (block size is 4 bytes) must be >= 0 and <128
+data is a pointer to data, 4-byte aligned
+size is number of bytes in the block pointed to by data
+
+Same for write
+
+Note: If the Updater class is in play, e.g.: the application uses OTA, the eboot
+command will be stored into the first 128 bytes of user data, then it will be
+retrieved by eboot on boot. That means that user data present there will be lost.
+Ref:
+- discussion in PR #5330.
+- https://github.com/esp8266/esp8266-wiki/wiki/Memory-Map#memmory-mapped-io-registers
+- Arduino/bootloaders/eboot/eboot_command.h RTC_MEM definition
+*/
+
+bool EspClass::rtcUserMemoryRead(uint32_t offset, uint32_t *data, size_t size)
+{
+ if (offset * 4 + size > 512 || size == 0) {
+ return false;
+ } else {
+ return system_rtc_mem_read(64 + offset, data, size);
+ }
+}
+
+bool EspClass::rtcUserMemoryWrite(uint32_t offset, uint32_t *data, size_t size)
+{
+ if (offset * 4 + size > 512 || size == 0) {
+ return false;
+ } else {
+ return system_rtc_mem_write(64 + offset, data, size);
+ }
}
-extern "C" void __real_system_restart_local();
void EspClass::reset(void)
{
__real_system_restart_local();
@@ -121,18 +199,45 @@ void EspClass::reset(void)
void EspClass::restart(void)
{
system_restart();
- esp_yield();
+ esp_suspend();
+}
+
+[[noreturn]] void EspClass::rebootIntoUartDownloadMode()
+{
+ wdtDisable();
+ /* disable hardware watchdog */
+ CLEAR_PERI_REG_MASK(PERIPHS_HW_WDT, 0x1);
+
+ esp8266RebootIntoUartDownloadMode();
}
uint16_t EspClass::getVcc(void)
{
- InterruptLock lock;
+ esp8266::InterruptLock lock;
+ (void)lock;
return system_get_vdd33();
}
uint32_t EspClass::getFreeHeap(void)
{
- return system_get_free_heap_size();
+ return umm_free_heap_size_lw();
+}
+
+#if defined(UMM_INFO)
+uint32_t EspClass::getMaxFreeBlockSize(void)
+{
+ return umm_max_block_size();
+}
+#endif
+
+uint32_t EspClass::getFreeContStack()
+{
+ return cont_get_free_stack(g_pcont);
+}
+
+void EspClass::resetFreeContStack()
+{
+ cont_repaint_stack(g_pcont);
}
uint32_t EspClass::getChipId(void)
@@ -140,6 +245,19 @@ uint32_t EspClass::getChipId(void)
return system_get_chip_id();
}
+extern "C" uint32_t core_version;
+extern "C" const char* core_release;
+
+String EspClass::getCoreVersion()
+{
+ if (core_release != NULL) {
+ return String(core_release);
+ }
+ char buf[12];
+ snprintf(buf, sizeof(buf), "%08x", core_version);
+ return String(buf);
+}
+
const char * EspClass::getSdkVersion(void)
{
return system_get_sdk_version();
@@ -155,15 +273,18 @@ uint8_t EspClass::getBootMode(void)
return system_get_boot_mode();
}
-uint8_t EspClass::getCpuFreqMHz(void)
+uint32_t EspClass::getFlashChipId(void)
{
- return system_get_cpu_freq();
+ static uint32_t flash_chip_id = 0;
+ if (flash_chip_id == 0) {
+ flash_chip_id = spi_flash_get_id();
+ }
+ return flash_chip_id;
}
-
-uint32_t EspClass::getFlashChipId(void)
+uint8_t EspClass::getFlashChipVendorId(void)
{
- return spi_flash_get_id();
+ return (getFlashChipId() & 0x000000ff);
}
uint32_t EspClass::getFlashChipRealSize(void)
@@ -173,6 +294,9 @@ uint32_t EspClass::getFlashChipRealSize(void)
uint32_t EspClass::getFlashChipSize(void)
{
+#if FLASH_MAP_SUPPORT
+ return getFlashChipRealSize();
+#else
uint32_t data;
uint8_t * bytes = (uint8_t *) &data;
// read first 4 byte (magic byte + flash config)
@@ -180,6 +304,7 @@ uint32_t EspClass::getFlashChipSize(void)
return magicFlashChipSize((bytes[3] & 0xf0) >> 4);
}
return 0;
+#endif
}
uint32_t EspClass::getFlashChipSpeed(void)
@@ -205,6 +330,7 @@ FlashMode_t EspClass::getFlashChipMode(void)
return mode;
}
+#if !FLASH_MAP_SUPPORT
uint32_t EspClass::magicFlashChipSize(uint8_t byte) {
switch(byte & 0x0F) {
case 0x0: // 4 Mbit (512KB)
@@ -217,16 +343,15 @@ uint32_t EspClass::magicFlashChipSize(uint8_t byte) {
return (2_MB);
case 0x4: // 32 MBit (4MB)
return (4_MB);
- case 0x5: // 64 MBit (8MB)
+ case 0x8: // 64 MBit (8MB)
return (8_MB);
- case 0x6: // 128 MBit (16MB)
+ case 0x9: // 128 MBit (16MB)
return (16_MB);
- case 0x7: // 256 MBit (32MB)
- return (32_MB);
default: // fail?
return 0;
}
}
+#endif
uint32_t EspClass::magicFlashChipSpeed(uint8_t byte) {
switch(byte & 0x0F) {
@@ -287,6 +412,8 @@ uint32_t EspClass::getFlashChipSizeByChipId(void) {
return (64_kB);
// Winbond
+ case 0x1840EF: // W25Q128
+ return (16_MB);
case 0x1640EF: // W25Q32
return (4_MB);
case 0x1540EF: // W25Q16
@@ -306,6 +433,10 @@ uint32_t EspClass::getFlashChipSizeByChipId(void) {
case 0x1340E0: // BG25Q40
return (512_kB);
+ // XMC - Wuhan Xinxin Semiconductor Manufacturing Corp
+ case 0x164020: // XM25QH32B
+ return (4_MB);
+
default:
return 0;
}
@@ -329,35 +460,59 @@ bool EspClass::checkFlashConfig(bool needsEquals) {
return false;
}
+// These are defined in the linker script, and filled in by the elf2bin.py util
+extern "C" uint32_t __crc_len;
+extern "C" uint32_t __crc_val;
+
+bool EspClass::checkFlashCRC() {
+ // Dummy CRC fill
+ uint32_t z[2];
+ z[0] = z[1] = 0;
+
+ uint32_t firstPart = (uintptr_t)&__crc_len - 0x40200000; // How many bytes to check before the 1st CRC val
+
+ // Start the checksum
+ uint32_t crc = crc32((const void*)0x40200000, firstPart);
+ // Pretend the 2 words of crc/len are zero to be idempotent
+ crc = crc32(z, 8, crc);
+ // Finish the CRC calculation over the rest of flash
+ crc = crc32((const void*)(0x40200000 + firstPart + 8), __crc_len - (firstPart + 8), crc);
+ return crc == __crc_val;
+}
+
+
String EspClass::getResetReason(void) {
- char buff[32];
- if (resetInfo.reason == REASON_DEFAULT_RST) { // normal startup by power on
- strcpy_P(buff, PSTR("Power on"));
- } else if (resetInfo.reason == REASON_WDT_RST) { // hardware watch dog reset
- strcpy_P(buff, PSTR("Hardware Watchdog"));
- } else if (resetInfo.reason == REASON_EXCEPTION_RST) { // exception reset, GPIO status won’t change
- strcpy_P(buff, PSTR("Exception"));
- } else if (resetInfo.reason == REASON_SOFT_WDT_RST) { // software watch dog reset, GPIO status won’t change
- strcpy_P(buff, PSTR("Software Watchdog"));
- } else if (resetInfo.reason == REASON_SOFT_RESTART) { // software restart ,system_restart , GPIO status won’t change
- strcpy_P(buff, PSTR("Software/System restart"));
- } else if (resetInfo.reason == REASON_DEEP_SLEEP_AWAKE) { // wake up from deep-sleep
- strcpy_P(buff, PSTR("Deep-Sleep Wake"));
- } else if (resetInfo.reason == REASON_EXT_SYS_RST) { // external system reset
- strcpy_P(buff, PSTR("External System"));
- } else {
- strcpy_P(buff, PSTR("Unknown"));
+ const __FlashStringHelper* buff;
+
+ switch(resetInfo.reason) {
+ // normal startup by power on
+ case REASON_DEFAULT_RST: buff = F("Power On"); break;
+ // hardware watch dog reset
+ case REASON_WDT_RST: buff = F("Hardware Watchdog"); break;
+ // exception reset, GPIO status won’t change
+ case REASON_EXCEPTION_RST: buff = F("Exception"); break;
+ // software watch dog reset, GPIO status won’t change
+ case REASON_SOFT_WDT_RST: buff = F("Software Watchdog"); break;
+ // software restart ,system_restart , GPIO status won’t change
+ case REASON_SOFT_RESTART: buff = F("Software/System restart"); break;
+ // wake up from deep-sleep
+ case REASON_DEEP_SLEEP_AWAKE: buff = F("Deep-Sleep Wake"); break;
+ // // external system reset
+ case REASON_EXT_SYS_RST: buff = F("External System"); break;
+ default: buff = F("Unknown"); break;
}
return String(buff);
}
String EspClass::getResetInfo(void) {
- if(resetInfo.reason != 0) {
+ if (resetInfo.reason >= REASON_WDT_RST && resetInfo.reason <= REASON_SOFT_WDT_RST) {
char buff[200];
- sprintf(&buff[0], "Fatal exception:%d flag:%d (%s) epc1:0x%08x epc2:0x%08x epc3:0x%08x excvaddr:0x%08x depc:0x%08x", resetInfo.exccause, resetInfo.reason, (resetInfo.reason == 0 ? "DEFAULT" : resetInfo.reason == 1 ? "WDT" : resetInfo.reason == 2 ? "EXCEPTION" : resetInfo.reason == 3 ? "SOFT_WDT" : resetInfo.reason == 4 ? "SOFT_RESTART" : resetInfo.reason == 5 ? "DEEP_SLEEP_AWAKE" : resetInfo.reason == 6 ? "EXT_SYS_RST" : "???"), resetInfo.epc1, resetInfo.epc2, resetInfo.epc3, resetInfo.excvaddr, resetInfo.depc);
+ sprintf_P(buff, PSTR("Fatal exception:%d flag:%d (%s) epc1:0x%08x epc2:0x%08x epc3:0x%08x excvaddr:0x%08x depc:0x%08x"),
+ resetInfo.exccause, resetInfo.reason, getResetReason().c_str(),
+ resetInfo.epc1, resetInfo.epc2, resetInfo.epc3, resetInfo.excvaddr, resetInfo.depc);
return String(buff);
}
- return String("flag: 0");
+ return getResetReason();
}
struct rst_info * EspClass::getResetInfoPtr(void) {
@@ -365,23 +520,84 @@ struct rst_info * EspClass::getResetInfoPtr(void) {
}
bool EspClass::eraseConfig(void) {
- bool ret = true;
- size_t cfgAddr = (ESP.getFlashChipSize() - 0x4000);
- size_t cfgSize = (8*1024);
-
- noInterrupts();
- while(cfgSize) {
+ const size_t cfgSize = 0x4000; // Sectors: RF_CAL + SYSTEMPARAM[3]
+ size_t cfgAddr = ESP.getFlashChipSize() - cfgSize;
- if(spi_flash_erase_sector((cfgAddr / SPI_FLASH_SEC_SIZE)) != SPI_FLASH_RESULT_OK) {
- ret = false;
+ for (size_t offset = 0; offset < cfgSize; offset += SPI_FLASH_SEC_SIZE) {
+ if (!flashEraseSector((cfgAddr + offset) / SPI_FLASH_SEC_SIZE)) {
+ return false;
}
+ }
+
+ return true;
+}
- cfgSize -= SPI_FLASH_SEC_SIZE;
- cfgAddr += SPI_FLASH_SEC_SIZE;
+bool EspClass::eraseConfigAndReset(void) {
+ // Before calling, ensure the WiFi state is equivalent to
+ // "WiFi.mode(WIFI_OFF)." This will reduce the likelihood of the SDK
+ // performing WiFi data writes to Flash between erasing and resetting.
+ bool reset = eraseConfig();
+ if (reset) {
+ hardware_reset();
}
- interrupts();
+ return reset;
+}
+
+uint8_t *EspClass::random(uint8_t *resultArray, const size_t outputSizeBytes)
+{
+ /**
+ * The ESP32 Technical Reference Manual v4.1 chapter 24 has the following to say about random number generation (no information found for ESP8266):
+ *
+ * "When used correctly, every 32-bit value the system reads from the RNG_DATA_REG register of the random number generator is a true random number.
+ * These true random numbers are generated based on the noise in the Wi-Fi/BT RF system.
+ * When Wi-Fi and BT are disabled, the random number generator will give out pseudo-random numbers.
+ *
+ * When Wi-Fi or BT is enabled, the random number generator is fed two bits of entropy every APB clock cycle (normally 80 MHz).
+ * Thus, for the maximum amount of entropy, it is advisable to read the random register at a maximum rate of 5 MHz.
+ * A data sample of 2 GB, read from the random number generator with Wi-Fi enabled and the random register read at 5 MHz,
+ * has been tested using the Dieharder Random Number Testsuite (version 3.31.1).
+ * The sample passed all tests."
+ *
+ * Since ESP32 is the sequal to ESP8266 it is unlikely that the ESP8266 is able to generate random numbers more quickly than 5 MHz when run at a 80 MHz frequency.
+ * A maximum random number frequency of 0.5 MHz is used here to leave some margin for possibly inferior components in the ESP8266.
+ * It should be noted that the ESP8266 has no Bluetooth functionality, so turning the WiFi off is likely to cause RANDOM_REG32 to use pseudo-random numbers.
+ *
+ * It is possible that yield() must be called on the ESP8266 to properly feed the hardware random number generator new bits, since there is only one processor core available.
+ * However, no feeding requirements are mentioned in the ESP32 documentation, and using yield() could possibly cause extended delays during number generation.
+ * Thus only delayMicroseconds() is used below.
+ */
+
+ constexpr uint8_t cooldownMicros = 2;
+ static uint32_t lastCalledMicros = micros() - cooldownMicros;
+
+ uint32_t randomNumber = 0;
+
+ for(size_t byteIndex = 0; byteIndex < outputSizeBytes; ++byteIndex)
+ {
+ if(byteIndex % 4 == 0)
+ {
+ // Old random number has been used up (random number could be exactly 0, so we can't check for that)
+
+ uint32_t timeSinceLastCall = micros() - lastCalledMicros;
+ if(timeSinceLastCall < cooldownMicros)
+ delayMicroseconds(cooldownMicros - timeSinceLastCall);
+
+ randomNumber = RANDOM_REG32;
+ lastCalledMicros = micros();
+ }
+
+ resultArray[byteIndex] = randomNumber;
+ randomNumber >>= 8;
+ }
- return ret;
+ return resultArray;
+}
+
+uint32_t EspClass::random()
+{
+ union { uint32_t b32; uint8_t b8[4]; } result;
+ random(result.b8, 4);
+ return result.b32;
}
uint32_t EspClass::getSketchSize() {
@@ -391,7 +607,7 @@ uint32_t EspClass::getSketchSize() {
image_header_t image_header;
uint32_t pos = APP_START_OFFSET;
- if (spi_flash_read(pos, (uint32_t*) &image_header, sizeof(image_header))) {
+ if (spi_flash_read(pos, (uint32_t*) &image_header, sizeof(image_header)) != SPI_FLASH_RESULT_OK) {
return 0;
}
pos += sizeof(image_header);
@@ -402,8 +618,8 @@ uint32_t EspClass::getSketchSize() {
section_index < image_header.num_segments;
++section_index)
{
- section_header_t section_header = {0};
- if (spi_flash_read(pos, (uint32_t*) §ion_header, sizeof(section_header))) {
+ section_header_t section_header = {0, 0};
+ if (spi_flash_read(pos, (uint32_t*) §ion_header, sizeof(section_header)) != SPI_FLASH_RESULT_OK) {
return 0;
}
pos += sizeof(section_header);
@@ -412,18 +628,16 @@ uint32_t EspClass::getSketchSize() {
DEBUG_SERIAL.printf("section=%u size=%u pos=%u\r\n", section_index, section_header.size, pos);
#endif
}
- result = pos;
+ result = (pos + 16) & ~15;
return result;
}
-extern "C" uint32_t _SPIFFS_start;
-
uint32_t EspClass::getFreeSketchSpace() {
uint32_t usedSize = getSketchSize();
// round one sector up
uint32_t freeSpaceStart = (usedSize + FLASH_SECTOR_SIZE - 1) & (~(FLASH_SECTOR_SIZE - 1));
- uint32_t freeSpaceEnd = (uint32_t)&_SPIFFS_start - 0x40200000;
+ uint32_t freeSpaceEnd = (uint32_t)FS_start - 0x40200000;
#ifdef DEBUG_SERIAL
DEBUG_SERIAL.printf("usedSize=%u freeSpaceStart=%u freeSpaceEnd=%u\r\n", usedSize, freeSpaceStart, freeSpaceEnd);
@@ -469,22 +683,336 @@ bool EspClass::updateSketch(Stream& in, uint32_t size, bool restartOnFail, bool
static const int FLASH_INT_MASK = ((B10 << 8) | B00111010);
bool EspClass::flashEraseSector(uint32_t sector) {
- ets_isr_mask(FLASH_INT_MASK);
int rc = spi_flash_erase_sector(sector);
- ets_isr_unmask(FLASH_INT_MASK);
return rc == 0;
}
-bool EspClass::flashWrite(uint32_t offset, uint32_t *data, size_t size) {
- ets_isr_mask(FLASH_INT_MASK);
- int rc = spi_flash_write(offset, (uint32_t*) data, size);
- ets_isr_unmask(FLASH_INT_MASK);
- return rc == 0;
+// Adapted from the old version of `flash_hal_write()` (before 3.0.0), which was used for SPIFFS to allow
+// writing from both unaligned u8 buffers and to an unaligned offset on flash.
+// Updated version re-uses some of the code from RTOS, replacing individual methods for block & page
+// writes with just a single one
+// https://github.com/espressif/ESP8266_RTOS_SDK/blob/master/components/spi_flash/src/spi_flash.c
+// (if necessary, we could follow the esp-idf code and introduce flash chip drivers controling more than just writing methods?)
+
+// This is a generic writer that does not cross page boundaries.
+// Offset, data address and size *must* be 4byte aligned.
+static SpiFlashOpResult spi_flash_write_page_break(uint32_t offset, uint32_t *data, size_t size) {
+ static constexpr uint32_t PageSize { FLASH_PAGE_SIZE };
+ size_t size_page_aligned = PageSize - (offset % PageSize);
+
+ // most common case, we don't cross a page and simply write the data
+ if (size < size_page_aligned) {
+ return spi_flash_write(offset, data, size);
+ }
+
+ // otherwise, write the initial part and continue writing breaking each page interval
+ SpiFlashOpResult result = SPI_FLASH_RESULT_ERR;
+ if ((result = spi_flash_write(offset, data, size_page_aligned)) != SPI_FLASH_RESULT_OK) {
+ return result;
+ }
+
+ const auto last_page = (size - size_page_aligned) / PageSize;
+ for (uint32_t page = 0; page < last_page; ++page) {
+ if ((result = spi_flash_write(offset + size_page_aligned, data + (size_page_aligned >> 2), PageSize)) != SPI_FLASH_RESULT_OK) {
+ return result;
+ }
+
+ size_page_aligned += PageSize;
+ }
+
+ // finally, the remaining data
+ return spi_flash_write(offset + size_page_aligned, data + (size_page_aligned >> 2), size - size_page_aligned);
}
-bool EspClass::flashRead(uint32_t offset, uint32_t *data, size_t size) {
- ets_isr_mask(FLASH_INT_MASK);
- int rc = spi_flash_read(offset, (uint32_t*) data, size);
- ets_isr_unmask(FLASH_INT_MASK);
- return rc == 0;
+#if PUYA_SUPPORT
+// Special wrapper for spi_flash_write *only for PUYA flash chips*
+// Already handles paging, could be used as a `spi_flash_write_page_break` replacement
+static SpiFlashOpResult spi_flash_write_puya(uint32_t offset, uint32_t *data, size_t size) {
+ if (data == nullptr) {
+ return SPI_FLASH_RESULT_ERR;
+ }
+ if (size % 4 != 0) {
+ return SPI_FLASH_RESULT_ERR;
+ }
+ // PUYA flash chips need to read existing data, update in memory and write modified data again.
+ static uint32_t *flash_write_puya_buf = nullptr;
+
+ if (flash_write_puya_buf == nullptr) {
+ flash_write_puya_buf = (uint32_t*) malloc(FLASH_PAGE_SIZE);
+ // No need to ever free this, since the flash chip will never change at runtime.
+ if (flash_write_puya_buf == nullptr) {
+ // Memory could not be allocated.
+ return SPI_FLASH_RESULT_ERR;
+ }
+ }
+
+ SpiFlashOpResult rc = SPI_FLASH_RESULT_OK;
+ uint32_t* ptr = data;
+ size_t bytesLeft = size;
+ uint32_t pos = offset;
+ while (bytesLeft > 0 && rc == SPI_FLASH_RESULT_OK) {
+ size_t bytesNow = bytesLeft;
+ if (bytesNow > FLASH_PAGE_SIZE) {
+ bytesNow = FLASH_PAGE_SIZE;
+ bytesLeft -= FLASH_PAGE_SIZE;
+ } else {
+ bytesLeft = 0;
+ }
+ rc = spi_flash_read(pos, flash_write_puya_buf, bytesNow);
+ if (rc != SPI_FLASH_RESULT_OK) {
+ return rc;
+ }
+ for (size_t i = 0; i < bytesNow / 4; ++i) {
+ flash_write_puya_buf[i] &= *ptr;
+ ++ptr;
+ }
+ rc = spi_flash_write(pos, flash_write_puya_buf, bytesNow);
+ pos += bytesNow;
+ }
+ return rc;
+}
+#endif
+
+static constexpr size_t Alignment { 4 };
+
+template
+static T aligned(T value) {
+ static constexpr auto Mask = Alignment - 1;
+ return (value + Mask) & ~Mask;
+}
+
+template
+static T alignBefore(T value) {
+ return aligned(value) - Alignment;
+}
+
+static bool isAlignedAddress(uint32_t address) {
+ return (address & (Alignment - 1)) == 0;
+}
+
+static bool isAlignedSize(size_t size) {
+ return (size & (Alignment - 1)) == 0;
+}
+
+static bool isAlignedPointer(const uint8_t *ptr) {
+ return isAlignedAddress(reinterpret_cast(ptr));
+}
+
+
+size_t EspClass::flashWriteUnalignedMemory(uint32_t address, const uint8_t *data, size_t size) {
+ auto flash_write = [](uint32_t address, uint8_t *data, size_t size) {
+ return spi_flash_write(address, reinterpret_cast(data), size) == SPI_FLASH_RESULT_OK;
+ };
+
+ auto flash_read = [](uint32_t address, uint8_t *data, size_t size) {
+ return spi_flash_read(address, reinterpret_cast(data), size) == SPI_FLASH_RESULT_OK;
+ };
+
+ constexpr size_t BufferSize { FLASH_PAGE_SIZE };
+ alignas(alignof(uint32_t)) uint8_t buf[BufferSize];
+
+ size_t written = 0;
+
+ if (!isAlignedAddress(address)) {
+ auto before_address = alignBefore(address);
+ auto offset = address - before_address;
+ auto wlen = std::min(Alignment - offset, size);
+
+ if (!flash_read(before_address, &buf[0], Alignment)) {
+ return 0;
+ }
+
+#if PUYA_SUPPORT
+ if (getFlashChipVendorId() == SPI_FLASH_VENDOR_PUYA) {
+ for (size_t i = 0; i < wlen ; ++i) {
+ buf[offset + i] &= data[i];
+ }
+ } else {
+#endif
+ memcpy(&buf[offset], data, wlen);
+#if PUYA_SUPPORT
+ }
+#endif
+
+ if (!flash_write(before_address, &buf[0], Alignment)) {
+ return 0;
+ }
+
+ address += wlen;
+ data += wlen;
+ written += wlen;
+ size -= wlen;
+ }
+
+ while (size > 0) {
+ auto len = std::min(size, BufferSize);
+ auto wlen = aligned(len);
+
+ if (wlen != len) {
+ auto partial = wlen - Alignment;
+ if (!flash_read(address + partial, &buf[partial], Alignment)) {
+ return written;
+ }
+ }
+
+ memcpy(&buf[0], data, len);
+ if (!flashWrite(address, reinterpret_cast(&buf[0]), wlen)) {
+ return written;
+ }
+
+ address += len;
+ data += len;
+ written += len;
+ size -= len;
+ }
+
+ return written;
+}
+
+bool EspClass::flashWrite(uint32_t address, const uint32_t *data, size_t size) {
+ SpiFlashOpResult result;
+#if PUYA_SUPPORT
+ if (getFlashChipVendorId() == SPI_FLASH_VENDOR_PUYA) {
+ result = spi_flash_write_puya(address, const_cast(data), size);
+ }
+ else
+#endif
+ {
+ result = spi_flash_write_page_break(address, const_cast(data), size);
+ }
+ return result == SPI_FLASH_RESULT_OK;
+}
+
+bool EspClass::flashWrite(uint32_t address, const uint8_t *data, size_t size) {
+ if (data && size) {
+ if (!isAlignedAddress(address)
+ || !isAlignedPointer(data)
+ || !isAlignedSize(size))
+ {
+ return flashWriteUnalignedMemory(address, data, size) == size;
+ }
+
+ return flashWrite(address, reinterpret_cast(data), size);
+ }
+
+ return false;
+}
+
+bool EspClass::flashRead(uint32_t address, uint8_t *data, size_t size) {
+ size_t sizeAligned = size & ~3;
+ size_t currentOffset = 0;
+
+ if ((uintptr_t)data % 4 != 0) {
+ constexpr size_t BufferSize { FLASH_PAGE_SIZE / sizeof(uint32_t) };
+ alignas(alignof(uint32_t)) uint32_t buf[BufferSize];
+ size_t sizeLeft = sizeAligned;
+
+ while (sizeLeft) {
+ size_t willCopy = std::min(sizeLeft, BufferSize);
+ // We read to our aligned buffer and then copy to data
+ if (!flashRead(address + currentOffset, &buf[0], willCopy))
+ {
+ return false;
+ }
+ memcpy(data + currentOffset, &buf[0], willCopy);
+ sizeLeft -= willCopy;
+ currentOffset += willCopy;
+ }
+ } else {
+ // Pointer is properly aligned, so use aligned read
+ if (!flashRead(address, reinterpret_cast(data), sizeAligned)) {
+ return false;
+ }
+ currentOffset = sizeAligned;
+ }
+
+ if (currentOffset < size) {
+ uint32_t tempData;
+ if (spi_flash_read(address + currentOffset, &tempData, sizeof(tempData)) != SPI_FLASH_RESULT_OK) {
+ return false;
+ }
+ memcpy(data + currentOffset, &tempData, size - currentOffset);
+ }
+
+ return true;
+}
+
+bool EspClass::flashRead(uint32_t address, uint32_t *data, size_t size) {
+ if ((uintptr_t)data % 4 != 0 || size % 4 != 0) {
+ return false;
+ }
+ return (spi_flash_read(address, data, size) == SPI_FLASH_RESULT_OK);
+}
+
+String EspClass::getSketchMD5()
+{
+ static String result;
+ if (result.length()) {
+ return result;
+ }
+ uint32_t lengthLeft = getSketchSize();
+ const size_t bufSize = 512;
+ std::unique_ptr buf(new (std::nothrow) uint8_t[bufSize]);
+ uint32_t offset = 0;
+ if(!buf.get()) {
+ return emptyString;
+ }
+ MD5Builder md5;
+ md5.begin();
+ while( lengthLeft > 0) {
+ size_t readBytes = (lengthLeft < bufSize) ? lengthLeft : bufSize;
+ if (!flashRead(offset, reinterpret_cast(buf.get()), (readBytes + 3) & ~3)) {
+ return emptyString;
+ }
+ md5.add(buf.get(), readBytes);
+ lengthLeft -= readBytes;
+ offset += readBytes;
+ }
+ md5.calculate();
+ result = md5.toString();
+ return result;
+}
+
+void EspClass::setExternalHeap()
+{
+#ifdef UMM_HEAP_EXTERNAL
+ if (!umm_push_heap(UMM_HEAP_EXTERNAL)) {
+ panic();
+ }
+#endif
+}
+
+void EspClass::setIramHeap()
+{
+#ifdef UMM_HEAP_IRAM
+ if (!umm_push_heap(UMM_HEAP_IRAM)) {
+ panic();
+ }
+#endif
+}
+
+void EspClass::setDramHeap()
+{
+#if defined(UMM_HEAP_EXTERNAL) && !defined(UMM_HEAP_IRAM)
+ if (!umm_push_heap(UMM_HEAP_DRAM)) {
+ panic();
+ }
+#elif defined(UMM_HEAP_IRAM)
+ if (!umm_push_heap(UMM_HEAP_DRAM)) {
+ panic();
+ }
+#endif
+}
+
+void EspClass::resetHeap()
+{
+#if defined(UMM_HEAP_EXTERNAL) && !defined(UMM_HEAP_IRAM)
+ if (!umm_pop_heap()) {
+ panic();
+ }
+#elif defined(UMM_HEAP_IRAM)
+ if (!umm_pop_heap()) {
+ panic();
+ }
+#endif
}
diff --git a/cores/esp8266/Esp.h b/cores/esp8266/Esp.h
index 80b0411963..9cb4141292 100644
--- a/cores/esp8266/Esp.h
+++ b/cores/esp8266/Esp.h
@@ -22,9 +22,11 @@
#define ESP_H
#include
+#include "core_esp8266_features.h"
+#include "spi_vendors.h"
/**
- * AVR macros for WDT managment
+ * AVR macros for WDT management
*/
typedef enum {
WDTO_0MS = 0, //!< WDTO_0MS
@@ -85,69 +87,202 @@ typedef enum {
class EspClass {
public:
// TODO: figure out how to set WDT timeout
- void wdtEnable(uint32_t timeout_ms = 0);
+ static void wdtEnable(uint32_t timeout_ms = 0);
// note: setting the timeout value is not implemented at the moment
- void wdtEnable(WDTO_t timeout_ms = WDTO_0MS);
+ static void wdtEnable(WDTO_t timeout_ms = WDTO_0MS);
+
+ static void wdtDisable();
+ static void wdtFeed();
+
+ static void deepSleep(uint64_t time_us, RFMode mode = RF_DEFAULT);
+ static void deepSleepInstant(uint64_t time_us, RFMode mode = RF_DEFAULT);
+ static uint64_t deepSleepMax();
+
+ static bool rtcUserMemoryRead(uint32_t offset, uint32_t *data, size_t size);
+ static bool rtcUserMemoryWrite(uint32_t offset, uint32_t *data, size_t size);
+
+ static void reset();
+ static void restart();
+ /**
+ * @brief When calling this method the ESP8266 reboots into the UART download mode without
+ * the need of any external wiring. This is the same mode which can also be entered by
+ * pulling GPIO0=low, GPIO2=high, GPIO15=low and resetting the ESP8266.
+ */
+ [[noreturn]] static void rebootIntoUartDownloadMode();
+
+ static uint16_t getVcc();
+ static uint32_t getChipId();
+
+ static uint32_t getFreeHeap();
+#if defined(UMM_INFO)
+ static uint32_t getMaxFreeBlockSize();
+ static uint8_t getHeapFragmentation(); // in %
+ static void getHeapStats(uint32_t* free = nullptr, uint16_t* max = nullptr, uint8_t* frag = nullptr) __attribute__((deprecated("Use 'uint32_t*' on max, 2nd argument")));
+ static void getHeapStats(uint32_t* free = nullptr, uint32_t* max = nullptr, uint8_t* frag = nullptr);
+#endif
+ static uint32_t getFreeContStack();
+ static void resetFreeContStack();
+
+ static const char * getSdkVersion();
+ static String getCoreVersion();
+ static String getFullVersion();
+
+ static uint8_t getBootVersion();
+ static uint8_t getBootMode();
+
+#if defined(F_CPU) || defined(CORE_MOCK)
+ constexpr
+#endif
+ static inline uint8_t getCpuFreqMHz() __attribute__((always_inline))
+ {
+ return esp_get_cpu_freq_mhz();
+ }
+
+ static uint32_t getFlashChipId();
+ static uint8_t getFlashChipVendorId();
- void wdtDisable();
- void wdtFeed();
-
- void deepSleep(uint32_t time_us, RFMode mode = RF_DEFAULT);
-
- void reset();
- void restart();
-
- uint16_t getVcc();
- uint32_t getFreeHeap();
-
- uint32_t getChipId();
-
- const char * getSdkVersion();
-
- uint8_t getBootVersion();
- uint8_t getBootMode();
-
- uint8_t getCpuFreqMHz();
-
- uint32_t getFlashChipId();
//gets the actual chip size based on the flash id
- uint32_t getFlashChipRealSize();
+ static uint32_t getFlashChipRealSize();
//gets the size of the flash as set by the compiler
- uint32_t getFlashChipSize();
- uint32_t getFlashChipSpeed();
- FlashMode_t getFlashChipMode();
- uint32_t getFlashChipSizeByChipId();
-
- uint32_t magicFlashChipSize(uint8_t byte);
- uint32_t magicFlashChipSpeed(uint8_t byte);
- FlashMode_t magicFlashChipMode(uint8_t byte);
-
- bool checkFlashConfig(bool needsEquals = false);
-
- bool flashEraseSector(uint32_t sector);
- bool flashWrite(uint32_t offset, uint32_t *data, size_t size);
- bool flashRead(uint32_t offset, uint32_t *data, size_t size);
-
- uint32_t getSketchSize();
- uint32_t getFreeSketchSpace();
- bool updateSketch(Stream& in, uint32_t size, bool restartOnFail = false, bool restartOnSuccess = true);
-
- String getResetReason();
- String getResetInfo();
- struct rst_info * getResetInfoPtr();
-
- bool eraseConfig();
-
- inline uint32_t getCycleCount();
+ static uint32_t getFlashChipSize();
+ static uint32_t getFlashChipSpeed();
+ static FlashMode_t getFlashChipMode();
+ static uint32_t getFlashChipSizeByChipId();
+
+ static uint32_t magicFlashChipSize(uint8_t byte);
+ static uint32_t magicFlashChipSpeed(uint8_t byte);
+ static FlashMode_t magicFlashChipMode(uint8_t byte);
+
+ static bool checkFlashConfig(bool needsEquals = false);
+
+ static bool checkFlashCRC();
+
+ static bool flashEraseSector(uint32_t sector);
+ /**
+ * @brief Write @a size bytes from @a data to flash at @a address
+ * This overload requires @a data and @a size to be always 4 byte aligned and
+ * @a address to be 4 byte aligned if the write crossess page boundary,
+ * but guarantees no overhead (except on PUYA flashes)
+ * @param address address on flash where write should start, 4 byte alignment is conditional
+ * @param data input buffer, must be 4-byte aligned
+ * @param size amount of data, must be a multiple of 4
+ * @return bool result of operation
+ * @retval true success
+ * @retval false failure to write to flash or incorrect alignment of params
+ */
+ static bool flashWrite(uint32_t address, const uint32_t *data, size_t size);
+ /**
+ * @brief Write @a size bytes from @a data to flash at @a address
+ * This overload handles all misalignment cases
+ * @param address address on flash where write should start
+ * @param data input buffer, passing unaligned memory will cause significant stack usage
+ * @param size amount of data, passing not multiple of 4 will cause additional reads and writes
+ * @return bool result of operation
+ */
+ static bool flashWrite(uint32_t address, const uint8_t *data, size_t size);
+ /**
+ * @brief Read @a size bytes to @a data to flash at @a address
+ * This overload requires @a data and @a size to be 4 byte aligned
+ * @param address address on flash where read should start
+ * @param data input buffer, must be 4-byte aligned
+ * @param size amount of data, must be a multiple of 4
+ * @return bool result of operation
+ * @retval true success
+ * @retval false failure to read from flash or incorrect alignment of params
+ */
+ static bool flashRead(uint32_t address, uint32_t *data, size_t size);
+ /**
+ * @brief Read @a size bytes to @a data to flash at @a address
+ * This overload handles all misalignment cases
+ * @param address address on flash where read should start
+ * @param data input buffer, passing unaligned memory will cause significant stack usage
+ * @param size amount of data, passing not multiple of 4 will cause additional read
+ * @return bool result of operation
+ */
+ static bool flashRead(uint32_t address, uint8_t *data, size_t size);
+
+ static uint32_t getSketchSize();
+ static String getSketchMD5();
+ static uint32_t getFreeSketchSpace();
+ static bool updateSketch(Stream& in, uint32_t size, bool restartOnFail = false, bool restartOnSuccess = true);
+
+ static String getResetReason();
+ static String getResetInfo();
+ static struct rst_info * getResetInfoPtr();
+
+ static bool eraseConfig();
+
+ /**
+ * @brief Erases 4 sectors at the end of flash, 1 - RF_CAL and 3 - SYSTEMPARM.
+ * These are the same additional sectors that are erase when you select
+ * Erase Flash: "Sketch + WiFi Settings" from the Arduino IDE Tools menu.
+ *
+ * This operation erases the running SDK's flash configuration space.
+ * As a precaution before calling, first call "WiFi.mode(WIFI_OFF)."
+ *
+ * If you need to erase "WiFi Settings" and reboot consider using
+ * "ArduinoOTA.eraseConfigAndReset()" it handles shutting down WiFi
+ * before the erase.
+ * @return bool result of operation. Always False on return.
+ * Function does not return on success.
+ */
+ static bool eraseConfigAndReset();
+
+ static uint8_t *random(uint8_t *resultArray, const size_t outputSizeBytes);
+ static uint32_t random();
+
+#if !defined(CORE_MOCK)
+ static inline uint32_t getCycleCount() __attribute__((always_inline))
+ {
+ return esp_get_cycle_count();
+ }
+#else
+ static uint32_t getCycleCount();
+#endif // !defined(CORE_MOCK)
+ /**
+ * @brief Push current Heap selection and set Heap selection to DRAM.
+ *
+ * @param none
+ * @return none
+ */
+ static void setDramHeap();
+ /**
+ * @brief Push current Heap selection and set Heap selection to IRAM.
+ *
+ * @param none
+ * @return none
+ */
+ static void setIramHeap();
+ /**
+ * @brief Push current Heap selection and set Heap selection to External. (Experimental)
+ *
+ * @param none
+ * @return none
+ */
+ static void setExternalHeap();
+ /**
+ * @brief Restores Heap selection back to value present when
+ * setDramHeap, setIramHeap, or setExternalHeap was called.
+ *
+ * @param none
+ * @return none
+ */
+ static void resetHeap();
+ private:
+ /**
+ * @brief Write up to @a size bytes from @a data to flash at @a address
+ * This function handles all cases of unaligned memory acccess; when either
+ * address is not aligned, data pointer is not aligned or size is not a multiple of 4.
+ * User of this function should note that @a data will be copied into a buffer allocated on stack.
+ *
+ * @param address address on flash where write should start
+ * @param data input buffer
+ * @param size amount of data
+ * @return size_t amount of data written, 0 on failure
+ */
+ static size_t flashWriteUnalignedMemory(uint32_t address, const uint8_t *data, size_t size);
};
-uint32_t EspClass::getCycleCount()
-{
- uint32_t ccount;
- __asm__ __volatile__("esync; rsr %0,ccount":"=a" (ccount));
- return ccount;
-}
-
extern EspClass ESP;
#endif //ESP_H
diff --git a/cores/esp8266/FS.cpp b/cores/esp8266/FS.cpp
index 55bae8f5c5..edfc1f8b49 100644
--- a/cores/esp8266/FS.cpp
+++ b/cores/esp8266/FS.cpp
@@ -46,6 +46,14 @@ int File::available() {
return _p->size() - _p->position();
}
+int File::availableForWrite() {
+ if (!_p)
+ return false;
+
+ return _p->availableForWrite();
+}
+
+
int File::read() {
if (!_p)
return -1;
@@ -58,9 +66,9 @@ int File::read() {
return result;
}
-size_t File::read(uint8_t* buf, size_t size) {
+int File::read(uint8_t* buf, size_t size) {
if (!_p)
- return -1;
+ return 0;
return _p->read(buf, size);
}
@@ -114,6 +122,13 @@ File::operator bool() const {
return !!_p;
}
+bool File::truncate(uint32_t size) {
+ if (!_p)
+ return false;
+
+ return _p->truncate(size);
+}
+
const char* File::name() const {
if (!_p)
return nullptr;
@@ -121,6 +136,76 @@ const char* File::name() const {
return _p->name();
}
+const char* File::fullName() const {
+ if (!_p)
+ return nullptr;
+
+ return _p->fullName();
+}
+
+bool File::isFile() const {
+ if (!_p)
+ return false;
+
+ return _p->isFile();
+}
+
+bool File::isDirectory() const {
+ if (!_p)
+ return false;
+
+ return _p->isDirectory();
+}
+
+void File::rewindDirectory() {
+ if (!_fakeDir) {
+ _fakeDir = std::make_shared(_baseFS->openDir(fullName()));
+ } else {
+ _fakeDir->rewind();
+ }
+}
+
+File File::openNextFile() {
+ if (!_fakeDir) {
+ _fakeDir = std::make_shared(_baseFS->openDir(fullName()));
+ }
+ _fakeDir->next();
+ return _fakeDir->openFile("r");
+}
+
+String File::readString() {
+ String ret;
+ ret.reserve(size() - position());
+ uint8_t temp[256];
+ int countRead;
+ do {
+ countRead = read(temp, sizeof(temp));
+ ret.concat((const char*)temp, countRead);
+ } while (countRead > 0);
+ return ret;
+}
+
+time_t File::getLastWrite() {
+ if (!_p)
+ return 0;
+
+ return _p->getLastWrite();
+}
+
+time_t File::getCreationTime() {
+ if (!_p)
+ return 0;
+
+ return _p->getCreationTime();
+}
+
+void File::setTimeCallback(time_t (*cb)(void)) {
+ if (!_p)
+ return;
+ _p->setTimeCallback(cb);
+ _timeCallback = cb;
+}
+
File Dir::openFile(const char* mode) {
if (!_impl) {
return File();
@@ -133,7 +218,9 @@ File Dir::openFile(const char* mode) {
return File();
}
- return File(_impl->openFile(om, am));
+ File f(_impl->openFile(om, am), _baseFS);
+ f.setTimeCallback(_timeCallback);
+ return f;
}
String Dir::fileName() {
@@ -144,6 +231,18 @@ String Dir::fileName() {
return _impl->fileName();
}
+time_t Dir::fileTime() {
+ if (!_impl)
+ return 0;
+ return _impl->fileTime();
+}
+
+time_t Dir::fileCreationTime() {
+ if (!_impl)
+ return 0;
+ return _impl->fileCreationTime();
+}
+
size_t Dir::fileSize() {
if (!_impl) {
return 0;
@@ -152,6 +251,20 @@ size_t Dir::fileSize() {
return _impl->fileSize();
}
+bool Dir::isFile() const {
+ if (!_impl)
+ return false;
+
+ return _impl->isFile();
+}
+
+bool Dir::isDirectory() const {
+ if (!_impl)
+ return false;
+
+ return _impl->isDirectory();
+}
+
bool Dir::next() {
if (!_impl) {
return false;
@@ -160,11 +273,59 @@ bool Dir::next() {
return _impl->next();
}
+bool Dir::rewind() {
+ if (!_impl) {
+ return false;
+ }
+
+ return _impl->rewind();
+}
+
+void Dir::setTimeCallback(time_t (*cb)(void)) {
+ if (!_impl)
+ return;
+ _impl->setTimeCallback(cb);
+ _timeCallback = cb;
+}
+
+
+bool FS::setConfig(const FSConfig &cfg) {
+ if (!_impl) {
+ return false;
+ }
+
+ return _impl->setConfig(cfg);
+}
+
bool FS::begin() {
+ if (!_impl) {
+ DEBUGV("#error: FS: no implementation");
+ return false;
+ }
+ _impl->setTimeCallback(_timeCallback);
+ bool ret = _impl->begin();
+ DEBUGV("%s\n", ret? "": "#error: FS could not start");
+ return ret;
+}
+
+void FS::end() {
+ if (_impl) {
+ _impl->end();
+ }
+}
+
+bool FS::gc() {
+ if (!_impl) {
+ return false;
+ }
+ return _impl->gc();
+}
+
+bool FS::check() {
if (!_impl) {
return false;
}
- return _impl->begin();
+ return _impl->check();
}
bool FS::format() {
@@ -181,6 +342,13 @@ bool FS::info(FSInfo& info){
return _impl->info(info);
}
+bool FS::info64(FSInfo64& info){
+ if (!_impl) {
+ return false;
+ }
+ return _impl->info64(info);
+}
+
File FS::open(const String& path, const char* mode) {
return open(path.c_str(), mode);
}
@@ -196,8 +364,9 @@ File FS::open(const char* path, const char* mode) {
DEBUGV("FS::open: invalid mode `%s`\r\n", mode);
return File();
}
-
- return File(_impl->open(path, om, am));
+ File f(_impl->open(path, om, am), this);
+ f.setTimeCallback(_timeCallback);
+ return f;
}
bool FS::exists(const char* path) {
@@ -215,7 +384,10 @@ Dir FS::openDir(const char* path) {
if (!_impl) {
return Dir();
}
- return Dir(_impl->openDir(path));
+ DirImplPtr p = _impl->openDir(path);
+ Dir d(p, this);
+ d.setTimeCallback(_timeCallback);
+ return d;
}
Dir FS::openDir(const String& path) {
@@ -233,6 +405,28 @@ bool FS::remove(const String& path) {
return remove(path.c_str());
}
+bool FS::rmdir(const char* path) {
+ if (!_impl) {
+ return false;
+ }
+ return _impl->rmdir(path);
+}
+
+bool FS::rmdir(const String& path) {
+ return rmdir(path.c_str());
+}
+
+bool FS::mkdir(const char* path) {
+ if (!_impl) {
+ return false;
+ }
+ return _impl->mkdir(path);
+}
+
+bool FS::mkdir(const String& path) {
+ return mkdir(path.c_str());
+}
+
bool FS::rename(const char* pathFrom, const char* pathTo) {
if (!_impl) {
return false;
@@ -244,6 +438,20 @@ bool FS::rename(const String& pathFrom, const String& pathTo) {
return rename(pathFrom.c_str(), pathTo.c_str());
}
+time_t FS::getCreationTime() {
+ if (!_impl) {
+ return 0;
+ }
+ return _impl->getCreationTime();
+}
+
+void FS::setTimeCallback(time_t (*cb)(void)) {
+ if (!_impl)
+ return;
+ _impl->setTimeCallback(cb);
+ _timeCallback = cb;
+}
+
static bool sflags(const char* mode, OpenMode& om, AccessMode& am) {
switch (mode[0]) {
diff --git a/cores/esp8266/FS.h b/cores/esp8266/FS.h
index 79dc319f06..55305e9688 100644
--- a/cores/esp8266/FS.h
+++ b/cores/esp8266/FS.h
@@ -23,11 +23,15 @@
#include
#include
+#include <../include/time.h> // See issue #6714
+
+class SDClass;
namespace fs {
class File;
class Dir;
+class FS;
class FileImpl;
typedef std::shared_ptr FileImplPtr;
@@ -48,45 +52,117 @@ enum SeekMode {
class File : public Stream
{
public:
- File(FileImplPtr p = FileImplPtr()) : _p(p) {}
+ File(FileImplPtr p = FileImplPtr(), FS *baseFS = nullptr) : _p(p), _fakeDir(nullptr), _baseFS(baseFS) { }
// Print methods:
size_t write(uint8_t) override;
size_t write(const uint8_t *buf, size_t size) override;
+ int availableForWrite() override;
// Stream methods:
int available() override;
int read() override;
int peek() override;
void flush() override;
- size_t readBytes(char *buffer, size_t length) override {
+ size_t readBytes(char *buffer, size_t length) override {
return read((uint8_t*)buffer, length);
}
- size_t read(uint8_t* buf, size_t size);
+ int read(uint8_t* buf, size_t size) override;
bool seek(uint32_t pos, SeekMode mode);
+ bool seek(uint32_t pos) {
+ return seek(pos, SeekSet);
+ }
size_t position() const;
size_t size() const;
+ virtual ssize_t streamRemaining() override { return (ssize_t)size() - (ssize_t)position(); }
void close();
operator bool() const;
const char* name() const;
+ const char* fullName() const; // Includes path
+ bool truncate(uint32_t size);
+
+ bool isFile() const;
+ bool isDirectory() const;
+
+ // Arduino "class SD" methods for compatibility
+ //TODO use stream::send / check read(buf,size) result
+ template size_t write(T &src){
+ uint8_t obuf[256];
+ size_t doneLen = 0;
+ size_t sentLen;
+
+ while (src.available() > (int)sizeof(obuf)){
+ src.read(obuf, sizeof(obuf));
+ sentLen = write(obuf, sizeof(obuf));
+ doneLen = doneLen + sentLen;
+ if(sentLen != sizeof(obuf)){
+ return doneLen;
+ }
+ }
+
+ size_t leftLen = src.available();
+ src.read(obuf, leftLen);
+ sentLen = write(obuf, leftLen);
+ doneLen = doneLen + sentLen;
+ return doneLen;
+ }
+ using Print::write;
+
+ void rewindDirectory();
+ File openNextFile();
+
+ String readString() override;
+
+ time_t getLastWrite();
+ time_t getCreationTime();
+ void setTimeCallback(time_t (*cb)(void));
+
+ // Stream::send configuration
+
+ bool inputCanTimeout () override {
+ // unavailable data can't become later available
+ return false;
+ }
+
+ bool outputCanTimeout () override {
+ // free space for write can't increase later
+ return false;
+ }
protected:
FileImplPtr _p;
+ time_t (*_timeCallback)(void) = nullptr;
+
+ // Arduino SD class emulation
+ std::shared_ptr _fakeDir;
+ FS *_baseFS;
};
class Dir {
public:
- Dir(DirImplPtr impl = DirImplPtr()): _impl(impl) { }
+ Dir(DirImplPtr impl = DirImplPtr(), FS *baseFS = nullptr): _impl(impl), _baseFS(baseFS) { }
File openFile(const char* mode);
+
String fileName();
size_t fileSize();
+ time_t fileTime();
+ time_t fileCreationTime();
+ bool isFile() const;
+ bool isDirectory() const;
+
bool next();
+ bool rewind();
+
+ void setTimeCallback(time_t (*cb)(void));
protected:
DirImplPtr _impl;
+ FS *_baseFS;
+ time_t (*_timeCallback)(void) = nullptr;
};
+// Backwards compatible, <4GB filesystem usage
struct FSInfo {
size_t totalBytes;
size_t usedBytes;
@@ -96,15 +172,56 @@ struct FSInfo {
size_t maxPathLength;
};
+// Support > 4GB filesystems (SD, etc.)
+struct FSInfo64 {
+ uint64_t totalBytes;
+ uint64_t usedBytes;
+ size_t blockSize;
+ size_t pageSize;
+ size_t maxOpenFiles;
+ size_t maxPathLength;
+};
+
+
+class FSConfig
+{
+public:
+ static constexpr uint32_t FSId = 0x00000000;
+
+ FSConfig(uint32_t type = FSId, bool autoFormat = true) : _type(type), _autoFormat(autoFormat) { }
+
+ FSConfig setAutoFormat(bool val = true) {
+ _autoFormat = val;
+ return *this;
+ }
+
+ uint32_t _type;
+ bool _autoFormat;
+};
+
+class SPIFFSConfig : public FSConfig
+{
+public:
+ static constexpr uint32_t FSId = 0x53504946;
+ SPIFFSConfig(bool autoFormat = true) : FSConfig(FSId, autoFormat) { }
+
+ // Inherit _type and _autoFormat
+ // nothing yet, enableTime TBD when SPIFFS has metadate
+};
+
class FS
{
public:
- FS(FSImplPtr impl) : _impl(impl) { }
+ FS(FSImplPtr impl) : _impl(impl) { _timeCallback = _defaultTimeCB; }
+
+ bool setConfig(const FSConfig &cfg);
bool begin();
+ void end();
bool format();
bool info(FSInfo& info);
+ bool info64(FSInfo64& info);
File open(const char* path, const char* mode);
File open(const String& path, const char* mode);
@@ -121,12 +238,38 @@ class FS
bool rename(const char* pathFrom, const char* pathTo);
bool rename(const String& pathFrom, const String& pathTo);
+ bool mkdir(const char* path);
+ bool mkdir(const String& path);
+
+ bool rmdir(const char* path);
+ bool rmdir(const String& path);
+
+ // Low-level FS routines, not needed by most applications
+ bool gc();
+ bool check();
+
+ time_t getCreationTime();
+
+ void setTimeCallback(time_t (*cb)(void));
+
+ friend class ::SDClass; // More of a frenemy, but SD needs internal implementation to get private FAT bits
protected:
FSImplPtr _impl;
+ FSImplPtr getImpl() { return _impl; }
+ time_t (*_timeCallback)(void) = nullptr;
+ static time_t _defaultTimeCB(void) { return time(NULL); }
};
} // namespace fs
+extern "C"
+{
+void close_all_fs(void);
+void littlefs_request_end(void);
+void spiffs_request_end(void);
+}
+
+#ifndef FS_NO_GLOBALS
using fs::FS;
using fs::File;
using fs::Dir;
@@ -135,7 +278,12 @@ using fs::SeekSet;
using fs::SeekCur;
using fs::SeekEnd;
using fs::FSInfo;
+using fs::FSConfig;
+using fs::SPIFFSConfig;
+#endif //FS_NO_GLOBALS
-extern FS SPIFFS;
+#if !defined(NO_GLOBAL_INSTANCES) && !defined(NO_GLOBAL_SPIFFS)
+extern fs::FS SPIFFS __attribute__((deprecated("SPIFFS has been deprecated. Please consider moving to LittleFS or other filesystems.")));
+#endif
#endif //FS_H
diff --git a/cores/esp8266/FSImpl.h b/cores/esp8266/FSImpl.h
index c96ea0721d..22a058f7b3 100644
--- a/cores/esp8266/FSImpl.h
+++ b/cores/esp8266/FSImpl.h
@@ -22,6 +22,7 @@
#include
#include
+#include
namespace fs {
@@ -29,13 +30,33 @@ class FileImpl {
public:
virtual ~FileImpl() { }
virtual size_t write(const uint8_t *buf, size_t size) = 0;
- virtual size_t read(uint8_t* buf, size_t size) = 0;
+ virtual int read(uint8_t* buf, size_t size) = 0;
virtual void flush() = 0;
virtual bool seek(uint32_t pos, SeekMode mode) = 0;
virtual size_t position() const = 0;
virtual size_t size() const = 0;
+ virtual int availableForWrite() { return 0; }
+ virtual bool truncate(uint32_t size) = 0;
virtual void close() = 0;
virtual const char* name() const = 0;
+ virtual const char* fullName() const = 0;
+ virtual bool isFile() const = 0;
+ virtual bool isDirectory() const = 0;
+
+ // Filesystems *may* support a timestamp per-file, so allow the user to override with
+ // their own callback for *this specific* file (as opposed to the FSImpl call of the
+ // same name. The default implementation simply returns time(null)
+ virtual void setTimeCallback(time_t (*cb)(void)) { _timeCallback = cb; }
+
+ // Return the last written time for a file. Undefined when called on a writable file
+ // as the FS is allowed to return either the time of the last write() operation or the
+ // time present in the filesystem metadata (often the last time the file was closed)
+ virtual time_t getLastWrite() { return 0; } // Default is to not support timestamps
+ // Same for creation time.
+ virtual time_t getCreationTime() { return 0; } // Default is to not support timestamps
+
+protected:
+ time_t (*_timeCallback)(void) = nullptr;
};
enum OpenMode {
@@ -57,20 +78,52 @@ class DirImpl {
virtual FileImplPtr openFile(OpenMode openMode, AccessMode accessMode) = 0;
virtual const char* fileName() = 0;
virtual size_t fileSize() = 0;
+ // Return the last written time for a file. Undefined when called on a writable file
+ // as the FS is allowed to return either the time of the last write() operation or the
+ // time present in the filesystem metadata (often the last time the file was closed)
+ virtual time_t fileTime() { return 0; } // By default, FS doesn't report file times
+ virtual time_t fileCreationTime() { return 0; } // By default, FS doesn't report file times
+ virtual bool isFile() const = 0;
+ virtual bool isDirectory() const = 0;
virtual bool next() = 0;
+ virtual bool rewind() = 0;
+
+ // Filesystems *may* support a timestamp per-file, so allow the user to override with
+ // their own callback for *this specific* file (as opposed to the FSImpl call of the
+ // same name. The default implementation simply returns time(null)
+ virtual void setTimeCallback(time_t (*cb)(void)) { _timeCallback = cb; }
+
+protected:
+ time_t (*_timeCallback)(void) = nullptr;
};
class FSImpl {
public:
+ virtual ~FSImpl () { }
+ virtual bool setConfig(const FSConfig &cfg) = 0;
virtual bool begin() = 0;
+ virtual void end() = 0;
virtual bool format() = 0;
virtual bool info(FSInfo& info) = 0;
+ virtual bool info64(FSInfo64& info) = 0;
virtual FileImplPtr open(const char* path, OpenMode openMode, AccessMode accessMode) = 0;
virtual bool exists(const char* path) = 0;
virtual DirImplPtr openDir(const char* path) = 0;
virtual bool rename(const char* pathFrom, const char* pathTo) = 0;
virtual bool remove(const char* path) = 0;
+ virtual bool mkdir(const char* path) = 0;
+ virtual bool rmdir(const char* path) = 0;
+ virtual bool gc() { return true; } // May not be implemented in all file systems.
+ virtual bool check() { return true; } // May not be implemented in all file systems.
+ virtual time_t getCreationTime() { return 0; } // May not be implemented in all file systems.
+
+ // Filesystems *may* support a timestamp per-file, so allow the user to override with
+ // their own callback for all files on this FS. The default implementation simply
+ // returns the present time as reported by time(null)
+ virtual void setTimeCallback(time_t (*cb)(void)) { _timeCallback = cb; }
+protected:
+ time_t (*_timeCallback)(void) = nullptr;
};
} // namespace fs
diff --git a/cores/esp8266/FSnoop.cpp b/cores/esp8266/FSnoop.cpp
new file mode 100644
index 0000000000..b5840ff16e
--- /dev/null
+++ b/cores/esp8266/FSnoop.cpp
@@ -0,0 +1,33 @@
+/*
+ * no-op implementations
+ * used/linked when no strong implementation already exists elsewhere
+ */
+
+#include
+
+extern "C"
+{
+
+void close_all_fs(void)
+{
+ littlefs_request_end();
+ spiffs_request_end();
+}
+
+// default weak definitions
+// they are overridden in their respective real implementation
+// hint: https://github.com/esp8266/Arduino/pull/6699#issuecomment-549085382
+
+void littlefs_request_end(void) __attribute__((weak));
+void littlefs_request_end(void)
+{
+ //ets_printf("debug: noop: littlefs_request_end\n");
+}
+
+void spiffs_request_end(void) __attribute__((weak));
+void spiffs_request_end(void)
+{
+ //ets_printf("debug: noop: spiffs_request_end\n");
+}
+
+}
diff --git a/cores/esp8266/FlashMap.h b/cores/esp8266/FlashMap.h
new file mode 100644
index 0000000000..996228fdc2
--- /dev/null
+++ b/cores/esp8266/FlashMap.h
@@ -0,0 +1,59 @@
+
+// - do not edit - autogenerated by boards.txt.py
+
+#ifndef __FLASH_MAP_H
+#define __FLASH_MAP_H
+
+#include
+#include
+
+typedef struct
+{
+ uint32_t eeprom_start;
+ uint32_t fs_start;
+ uint32_t fs_end;
+ uint32_t fs_block_size;
+ uint32_t fs_page_size;
+ uint32_t flash_size_kb;
+} flash_map_s;
+
+/*
+ Following definitions map the above structure, one per line.
+ FLASH_MAP_* is a user choice in sketch:
+ `FLASH_MAP_SETUP_CONFIG(FLASH_MAP_OTA_FS)`
+ Configuration is made at boot with detected flash chip size (last argument 512..16384)
+ Other values are defined from `tools/boards.txt.py`.
+*/
+
+#define FLASH_MAP_OTA_FS \
+ { \
+ { .eeprom_start = 0x402fb000, .fs_start = 0x402eb000, .fs_end = 0x402fb000, .fs_block_size = 0x1000, .fs_page_size = 0x100, .flash_size_kb = 1024 }, \
+ { .eeprom_start = 0x403fb000, .fs_start = 0x403c0000, .fs_end = 0x403fb000, .fs_block_size = 0x1000, .fs_page_size = 0x100, .flash_size_kb = 2048 }, \
+ { .eeprom_start = 0x405fb000, .fs_start = 0x40400000, .fs_end = 0x405fa000, .fs_block_size = 0x2000, .fs_page_size = 0x100, .flash_size_kb = 4096 }, \
+ { .eeprom_start = 0x409fb000, .fs_start = 0x40400000, .fs_end = 0x409fa000, .fs_block_size = 0x2000, .fs_page_size = 0x100, .flash_size_kb = 8192 }, \
+ { .eeprom_start = 0x411fb000, .fs_start = 0x40400000, .fs_end = 0x411fa000, .fs_block_size = 0x2000, .fs_page_size = 0x100, .flash_size_kb = 16384 }, \
+ { .eeprom_start = 0x4027b000, .fs_start = 0x40273000, .fs_end = 0x4027b000, .fs_block_size = 0x1000, .fs_page_size = 0x100, .flash_size_kb = 512 }, \
+ }
+
+#define FLASH_MAP_MAX_FS \
+ { \
+ { .eeprom_start = 0x402fb000, .fs_start = 0x4027b000, .fs_end = 0x402fb000, .fs_block_size = 0x2000, .fs_page_size = 0x100, .flash_size_kb = 1024 }, \
+ { .eeprom_start = 0x403fb000, .fs_start = 0x40300000, .fs_end = 0x403fa000, .fs_block_size = 0x2000, .fs_page_size = 0x100, .flash_size_kb = 2048 }, \
+ { .eeprom_start = 0x405fb000, .fs_start = 0x40300000, .fs_end = 0x405fa000, .fs_block_size = 0x2000, .fs_page_size = 0x100, .flash_size_kb = 4096 }, \
+ { .eeprom_start = 0x409fb000, .fs_start = 0x40300000, .fs_end = 0x409fa000, .fs_block_size = 0x2000, .fs_page_size = 0x100, .flash_size_kb = 8192 }, \
+ { .eeprom_start = 0x411fb000, .fs_start = 0x40300000, .fs_end = 0x411fa000, .fs_block_size = 0x2000, .fs_page_size = 0x100, .flash_size_kb = 16384 }, \
+ { .eeprom_start = 0x4027b000, .fs_start = 0x4025b000, .fs_end = 0x4027b000, .fs_block_size = 0x1000, .fs_page_size = 0x100, .flash_size_kb = 512 }, \
+ }
+
+#define FLASH_MAP_NO_FS \
+ { \
+ { .eeprom_start = 0x402fb000, .fs_start = 0x402fb000, .fs_end = 0x402fb000, .fs_block_size = 0x0, .fs_page_size = 0x0, .flash_size_kb = 1024 }, \
+ { .eeprom_start = 0x403fb000, .fs_start = 0x403fb000, .fs_end = 0x403fb000, .fs_block_size = 0x0, .fs_page_size = 0x0, .flash_size_kb = 2048 }, \
+ { .eeprom_start = 0x405fb000, .fs_start = 0x405fb000, .fs_end = 0x405fb000, .fs_block_size = 0x0, .fs_page_size = 0x0, .flash_size_kb = 4096 }, \
+ { .eeprom_start = 0x409fb000, .fs_start = 0x409fb000, .fs_end = 0x409fb000, .fs_block_size = 0x0, .fs_page_size = 0x0, .flash_size_kb = 8192 }, \
+ { .eeprom_start = 0x411fb000, .fs_start = 0x411fb000, .fs_end = 0x411fb000, .fs_block_size = 0x0, .fs_page_size = 0x0, .flash_size_kb = 16384 }, \
+ { .eeprom_start = 0x4027b000, .fs_start = 0x4027b000, .fs_end = 0x4027b000, .fs_block_size = 0x0, .fs_page_size = 0x0, .flash_size_kb = 512 }, \
+ }
+
+#endif // __FLASH_MAP_H
+
diff --git a/cores/esp8266/FunctionalInterrupt.cpp b/cores/esp8266/FunctionalInterrupt.cpp
new file mode 100644
index 0000000000..f468595787
--- /dev/null
+++ b/cores/esp8266/FunctionalInterrupt.cpp
@@ -0,0 +1,65 @@
+#include
+#include
+#include "Arduino.h"
+
+// Duplicate typedefs from core_esp8266_wiring_digital_c
+typedef void (*voidFuncPtr)(void);
+typedef void (*voidFuncPtrArg)(void*);
+
+// Helper functions for Functional interrupt routines
+extern "C" void __attachInterruptFunctionalArg(uint8_t pin, voidFuncPtr userFunc, void*fp, int mode, bool functional);
+
+
+void IRAM_ATTR interruptFunctional(void* arg)
+{
+ ArgStructure* localArg = (ArgStructure*)arg;
+ if (localArg->functionInfo->reqScheduledFunction)
+ {
+ schedule_function(std::bind(localArg->functionInfo->reqScheduledFunction,InterruptInfo(*(localArg->interruptInfo))));
+ }
+ if (localArg->functionInfo->reqFunction)
+ {
+ localArg->functionInfo->reqFunction();
+ }
+}
+
+extern "C"
+{
+ void cleanupFunctional(void* arg)
+ {
+ ArgStructure* localArg = (ArgStructure*)arg;
+ delete (FunctionInfo*)localArg->functionInfo;
+ delete (InterruptInfo*)localArg->interruptInfo;
+ delete localArg;
+ }
+}
+
+void attachInterrupt(uint8_t pin, std::function intRoutine, int mode)
+{
+ // use the local interrupt routine which takes the ArgStructure as argument
+
+ InterruptInfo* ii = nullptr;
+
+ FunctionInfo* fi = new FunctionInfo;
+ fi->reqFunction = intRoutine;
+
+ ArgStructure* as = new ArgStructure;
+ as->interruptInfo = ii;
+ as->functionInfo = fi;
+
+ __attachInterruptFunctionalArg(pin, (voidFuncPtr)interruptFunctional, as, mode, true);
+}
+
+void attachScheduledInterrupt(uint8_t pin, std::function scheduledIntRoutine, int mode)
+{
+ InterruptInfo* ii = new InterruptInfo;
+
+ FunctionInfo* fi = new FunctionInfo;
+ fi->reqScheduledFunction = scheduledIntRoutine;
+
+ ArgStructure* as = new ArgStructure;
+ as->interruptInfo = ii;
+ as->functionInfo = fi;
+
+ __attachInterruptFunctionalArg(pin, (voidFuncPtr)interruptFunctional, as, mode, true);
+}
diff --git a/cores/esp8266/FunctionalInterrupt.h b/cores/esp8266/FunctionalInterrupt.h
new file mode 100644
index 0000000000..968793e499
--- /dev/null
+++ b/cores/esp8266/FunctionalInterrupt.h
@@ -0,0 +1,35 @@
+#ifndef FUNCTIONALINTERRUPT_H
+#define FUNCTIONALINTERRUPT_H
+
+#include
+#include
+#include
+
+extern "C" {
+#include "c_types.h"
+#include "ets_sys.h"
+}
+
+// Structures for communication
+
+struct InterruptInfo {
+ uint8_t pin = 0;
+ uint8_t value = 0;
+ uint32_t micro = 0;
+};
+
+struct FunctionInfo {
+ std::function reqFunction = nullptr;
+ std::function reqScheduledFunction = nullptr;
+};
+
+struct ArgStructure {
+ InterruptInfo* interruptInfo = nullptr;
+ FunctionInfo* functionInfo = nullptr;
+};
+
+void attachInterrupt(uint8_t pin, std::function intRoutine, int mode);
+void attachScheduledInterrupt(uint8_t pin, std::function scheduledIntRoutine, int mode);
+
+
+#endif //INTERRUPTS_H
diff --git a/cores/esp8266/HardwareSerial.cpp b/cores/esp8266/HardwareSerial.cpp
index 18a581dde5..4896e27758 100644
--- a/cores/esp8266/HardwareSerial.cpp
+++ b/cores/esp8266/HardwareSerial.cpp
@@ -1,190 +1,180 @@
-/*
- HardwareSerial.cpp - esp8266 UART support
-
- Copyright (c) 2014 Ivan Grokhotkov. All rights reserved.
- This file is part of the esp8266 core for Arduino environment.
-
- 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 31 March 2015 by Markus Sattler (rewrite the code for UART0 + UART1 support in ESP8266)
- Modified 25 April 2015 by Thomas Flayols (add configuration different from 8N1 in ESP8266)
- Modified 3 May 2015 by Hristo Gochkov (change register access methods)
- */
-
-#include
-#include
-#include
-#include
-#include "Arduino.h"
-#include "HardwareSerial.h"
-
-
-HardwareSerial::HardwareSerial(int uart_nr)
- : _uart_nr(uart_nr)
-{}
-
-void HardwareSerial::begin(unsigned long baud, SerialConfig config, SerialMode mode, uint8_t tx_pin)
-{
- if(uart_get_debug() == _uart_nr) {
- uart_set_debug(UART_NO);
- }
-
- if (_uart) {
- free(_uart);
- }
-
- _uart = uart_init(_uart_nr, baud, (int) config, (int) mode, tx_pin);
- _peek_char = -1;
-}
-
-void HardwareSerial::end()
-{
- if(uart_get_debug() == _uart_nr) {
- uart_set_debug(UART_NO);
- }
-
- uart_uninit(_uart);
- _uart = NULL;
-}
-
-void HardwareSerial::swap(uint8_t tx_pin)
-{
- if(!_uart) {
- return;
- }
- uart_swap(_uart, tx_pin);
-}
-
-void HardwareSerial::set_tx(uint8_t tx_pin)
-{
- if(!_uart) {
- return;
- }
- uart_set_tx(_uart, tx_pin);
-}
-
-void HardwareSerial::pins(uint8_t tx, uint8_t rx)
-{
- if(!_uart) {
- return;
- }
- uart_set_pins(_uart, tx, rx);
-}
-
-void HardwareSerial::setDebugOutput(bool en)
-{
- if(!_uart) {
- return;
- }
- if(en) {
- if(uart_tx_enabled(_uart)) {
- uart_set_debug(_uart_nr);
- } else {
- uart_set_debug(UART_NO);
- }
- } else {
- // disable debug for this interface
- if(uart_get_debug() == _uart_nr) {
- uart_set_debug(UART_NO);
- }
- }
-}
-
-bool HardwareSerial::isTxEnabled(void)
-{
- return _uart && uart_tx_enabled(_uart);
-}
-
-bool HardwareSerial::isRxEnabled(void)
-{
- return _uart && uart_rx_enabled(_uart);
-}
-
-int HardwareSerial::available(void)
-{
- if(!_uart || !uart_rx_enabled(_uart)) {
- return 0;
- }
-
- int result = static_cast(uart_rx_available(_uart));
- if (_peek_char != -1) {
- result += 1;
- }
- if (!result) {
- optimistic_yield(10000);
- }
- return result;
-}
-
-int HardwareSerial::peek(void)
-{
- if (_peek_char != -1) {
- return _peek_char;
- }
- // this may return -1, but that's okay
- _peek_char = uart_read_char(_uart);
- return _peek_char;
-}
-
-int HardwareSerial::read(void)
-{
- if(!_uart || !uart_rx_enabled(_uart)) {
- return -1;
- }
-
- if (_peek_char != -1) {
- auto tmp = _peek_char;
- _peek_char = -1;
- return tmp;
- }
- return uart_read_char(_uart);
-}
-
-int HardwareSerial::availableForWrite(void)
-{
- if(!_uart || !uart_tx_enabled(_uart)) {
- return 0;
- }
-
- return static_cast(uart_tx_free(_uart));
-}
-
-void HardwareSerial::flush()
-{
- if(!_uart || !uart_tx_enabled(_uart)) {
- return;
- }
-
- uart_wait_tx_empty(_uart);
-}
-
-size_t HardwareSerial::write(uint8_t c)
-{
- if(!_uart || !uart_tx_enabled(_uart)) {
- return 0;
- }
-
- uart_write_char(_uart, c);
- return 1;
-}
-
-HardwareSerial::operator bool() const
-{
- return _uart != 0;
-}
-
-
-HardwareSerial Serial(UART0);
-HardwareSerial Serial1(UART1);
+/*
+ HardwareSerial.cpp - esp8266 UART support
+
+ Copyright (c) 2014 Ivan Grokhotkov. All rights reserved.
+ This file is part of the esp8266 core for Arduino environment.
+
+ 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 31 March 2015 by Markus Sattler (rewrite the code for UART0 + UART1 support in ESP8266)
+ Modified 25 April 2015 by Thomas Flayols (add configuration different from 8N1 in ESP8266)
+ Modified 3 May 2015 by Hristo Gochkov (change register access methods)
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include "Arduino.h"
+#include "HardwareSerial.h"
+#include "Esp.h"
+
+
+// SerialEvent functions are weak, so when the user doesn't define them,
+// the linker just sets their address to 0 (which is checked below).
+void serialEvent() __attribute__((weak));
+
+HardwareSerial::HardwareSerial(int uart_nr)
+ : _uart_nr(uart_nr), _rx_size(256)
+{}
+
+void HardwareSerial::begin(unsigned long baud, SerialConfig config, SerialMode mode, uint8_t tx_pin, bool invert)
+{
+ end();
+ _uart = uart_init(_uart_nr, baud, (int) config, (int) mode, tx_pin, _rx_size, invert);
+#if defined(DEBUG_ESP_PORT) && !defined(NDEBUG)
+ if (static_cast(this) == static_cast(&DEBUG_ESP_PORT))
+ {
+ setDebugOutput(true);
+ println();
+ println(ESP.getFullVersion());
+ }
+#endif
+}
+
+void HardwareSerial::end()
+{
+ if(uart_get_debug() == _uart_nr) {
+ uart_set_debug(UART_NO);
+ }
+
+ uart_uninit(_uart);
+ _uart = NULL;
+}
+
+void HardwareSerial::updateBaudRate(unsigned long baud)
+{
+ if(!_uart) {
+ return;
+ }
+
+ uart_set_baudrate(_uart, baud);
+}
+
+size_t HardwareSerial::setRxBufferSize(size_t size){
+ if(_uart) {
+ _rx_size = uart_resize_rx_buffer(_uart, size);
+ } else {
+ _rx_size = size;
+ }
+ return _rx_size;
+}
+
+void HardwareSerial::setDebugOutput(bool en)
+{
+ if(!_uart) {
+ return;
+ }
+ if(en) {
+ if(uart_tx_enabled(_uart)) {
+ uart_set_debug(_uart_nr);
+ } else {
+ uart_set_debug(UART_NO);
+ }
+ } else {
+ // disable debug for this interface
+ if(uart_get_debug() == _uart_nr) {
+ uart_set_debug(UART_NO);
+ }
+ }
+}
+
+int HardwareSerial::available(void)
+{
+ int result = static_cast(uart_rx_available(_uart));
+ if (!result) {
+ optimistic_yield(10000);
+ }
+ return result;
+}
+
+void HardwareSerial::flush()
+{
+ uint8_t bit_length = 0;
+ if(!_uart || !uart_tx_enabled(_uart)) {
+ return;
+ }
+
+ bit_length = uart_get_bit_length(_uart_nr); // data width, parity and stop
+ uart_wait_tx_empty(_uart);
+ //Workaround for a bug in serial not actually being finished yet
+ //Wait for 8 data bits, 1 parity and 2 stop bits, just in case
+ delayMicroseconds(bit_length * 1000000 / uart_get_baudrate(_uart) + 1);
+}
+
+void HardwareSerial::startDetectBaudrate()
+{
+ uart_start_detect_baudrate(_uart_nr);
+}
+
+unsigned long HardwareSerial::testBaudrate()
+{
+ return uart_detect_baudrate(_uart_nr);
+}
+
+unsigned long HardwareSerial::detectBaudrate(time_t timeoutMillis)
+{
+ esp8266::polledTimeout::oneShotFastMs timeOut(timeoutMillis);
+ unsigned long detectedBaudrate = 0;
+ while (!timeOut) {
+ if ((detectedBaudrate = testBaudrate())) {
+ break;
+ }
+ esp_delay(100);
+ }
+ return detectedBaudrate;
+}
+
+size_t HardwareSerial::readBytes(char* buffer, size_t size)
+{
+ size_t got = 0;
+
+ while (got < size)
+ {
+ esp8266::polledTimeout::oneShotFastMs timeOut(_timeout);
+ size_t avail;
+ while ((avail = available()) == 0 && !timeOut);
+ if (avail == 0)
+ break;
+ got += read(buffer + got, std::min(size - got, avail));
+ }
+ return got;
+}
+
+#if !defined(NO_GLOBAL_INSTANCES) && !defined(NO_GLOBAL_SERIAL)
+HardwareSerial Serial(UART0);
+
+// Executed at end of loop() processing when > 0 bytes available in the Serial port
+void serialEventRun(void)
+{
+ if (serialEvent && Serial.available()) {
+ serialEvent();
+ }
+}
+#endif
+#if !defined(NO_GLOBAL_INSTANCES) && !defined(NO_GLOBAL_SERIAL1)
+HardwareSerial Serial1(UART1);
+#endif
diff --git a/cores/esp8266/HardwareSerial.h b/cores/esp8266/HardwareSerial.h
index bf3dc68cb6..3ef45892e6 100644
--- a/cores/esp8266/HardwareSerial.h
+++ b/cores/esp8266/HardwareSerial.h
@@ -28,6 +28,7 @@
#define HardwareSerial_h
#include
+#include <../include/time.h> // See issue #6714
#include "Stream.h"
#include "uart.h"
@@ -72,75 +73,173 @@ class HardwareSerial: public Stream
void begin(unsigned long baud)
{
- begin(baud, SERIAL_8N1, SERIAL_FULL, 1);
+ begin(baud, SERIAL_8N1, SERIAL_FULL, 1, false);
}
void begin(unsigned long baud, SerialConfig config)
{
- begin(baud, config, SERIAL_FULL, 1);
+ begin(baud, config, SERIAL_FULL, 1, false);
}
void begin(unsigned long baud, SerialConfig config, SerialMode mode)
{
- begin(baud, config, mode, 1);
+ begin(baud, config, mode, 1, false);
}
- void begin(unsigned long baud, SerialConfig config, SerialMode mode, uint8_t tx_pin);
+ void begin(unsigned long baud, SerialConfig config, SerialMode mode, uint8_t tx_pin)
+ {
+ begin(baud, config, mode, tx_pin, false);
+ }
+
+ void begin(unsigned long baud, SerialConfig config, SerialMode mode, uint8_t tx_pin, bool invert);
void end();
- void swap()
+ void updateBaudRate(unsigned long baud);
+
+ size_t setRxBufferSize(size_t size);
+ size_t getRxBufferSize()
+ {
+ return uart_get_rx_buffer_size(_uart);
+ }
+
+ bool swap()
{
- swap(1);
+ return swap(1);
+ }
+ bool swap(uint8_t tx_pin) //toggle between use of GPIO13/GPIO15 or GPIO3/GPIO(1/2) as RX and TX
+ {
+ return uart_swap(_uart, tx_pin);
}
- void swap(uint8_t tx_pin); //toggle between use of GPIO13/GPIO15 or GPIO3/GPIO(1/2) as RX and TX
/*
* Toggle between use of GPIO1 and GPIO2 as TX on UART 0.
* Note: UART 1 can't be used if GPIO2 is used with UART 0!
*/
- void set_tx(uint8_t tx_pin);
+ bool set_tx(uint8_t tx_pin)
+ {
+ return uart_set_tx(_uart, tx_pin);
+ }
/*
* UART 0 possible options are (1, 3), (2, 3) or (15, 13)
* UART 1 allows only TX on 2 if UART 0 is not (2, 3)
*/
- void pins(uint8_t tx, uint8_t rx);
+ bool pins(uint8_t tx, uint8_t rx)
+ {
+ return uart_set_pins(_uart, tx, rx);
+ }
int available(void) override;
- int peek(void) override;
- int read(void) override;
- int availableForWrite(void);
- void flush(void) override;
- size_t write(uint8_t) override;
- inline size_t write(unsigned long n)
+
+ int peek(void) override
{
- return write((uint8_t) n);
+ // return -1 when data is unavailable (arduino api)
+ return uart_peek_char(_uart);
}
- inline size_t write(long n)
+
+ virtual bool hasPeekBufferAPI () const override
{
- return write((uint8_t) n);
+ return true;
}
- inline size_t write(unsigned int n)
+
+ // return a pointer to available data buffer (size = available())
+ // semantic forbids any kind of read() before calling peekConsume()
+ const char* peekBuffer () override
{
- return write((uint8_t) n);
+ return uart_peek_buffer(_uart);
}
- inline size_t write(int n)
+
+ // return number of byte accessible by peekBuffer()
+ size_t peekAvailable () override
{
- return write((uint8_t) n);
+ return uart_peek_available(_uart);
}
- using Print::write; // pull in write(str) and write(buf, size) from Print
- operator bool() const;
+ // consume bytes after use (see peekBuffer)
+ void peekConsume (size_t consume) override
+ {
+ return uart_peek_consume(_uart, consume);
+ }
+
+ int read(void) override
+ {
+ // return -1 when data is unavailable (arduino api)
+ return uart_read_char(_uart);
+ }
+ // ::read(buffer, size): same as readBytes without timeout
+ int read(char* buffer, size_t size)
+ {
+ return uart_read(_uart, buffer, size);
+ }
+ int read(uint8_t* buffer, size_t size) override
+ {
+ return uart_read(_uart, (char*)buffer, size);
+ }
+ size_t readBytes(char* buffer, size_t size) override;
+ size_t readBytes(uint8_t* buffer, size_t size) override
+ {
+ return readBytes((char*)buffer, size);
+ }
+ int availableForWrite(void) override
+ {
+ return static_cast(uart_tx_free(_uart));
+ }
+ void flush(void) override; // wait for all outgoing characters to be sent, output buffer is empty after this call
+ size_t write(uint8_t c) override
+ {
+ return uart_write_char(_uart, c);
+ }
+ size_t write(const uint8_t *buffer, size_t size) override
+ {
+ return uart_write(_uart, (const char*)buffer, size);
+ }
+ using Print::write; // Import other write() methods to support things like write(0) properly
+ operator bool() const
+ {
+ return _uart != 0;
+ }
void setDebugOutput(bool);
- bool isTxEnabled(void);
- bool isRxEnabled(void);
+ bool isTxEnabled(void)
+ {
+ return uart_tx_enabled(_uart);
+ }
+ bool isRxEnabled(void)
+ {
+ return uart_rx_enabled(_uart);
+ }
+ int baudRate(void)
+ {
+ return uart_get_baudrate(_uart);
+ }
+
+ bool hasOverrun(void)
+ {
+ return uart_has_overrun(_uart);
+ }
+
+ bool hasRxError(void)
+ {
+ return uart_has_rx_error(_uart);
+ }
+
+ void startDetectBaudrate();
+
+ unsigned long testBaudrate();
+
+ unsigned long detectBaudrate(time_t timeoutMillis);
protected:
int _uart_nr;
uart_t* _uart = nullptr;
- int _peek_char = -1;
+ size_t _rx_size;
};
+#if !defined(NO_GLOBAL_INSTANCES) && !defined(NO_GLOBAL_SERIAL)
extern HardwareSerial Serial;
+#endif
+#if !defined(NO_GLOBAL_INSTANCES) && !defined(NO_GLOBAL_SERIAL1)
extern HardwareSerial Serial1;
+#endif
+
+extern void serialEventRun(void) __attribute__((weak));
#endif
diff --git a/cores/esp8266/IPAddress.cpp b/cores/esp8266/IPAddress.cpp
index 93a081eb25..6f68bc56e9 100644
--- a/cores/esp8266/IPAddress.cpp
+++ b/cores/esp8266/IPAddress.cpp
@@ -20,28 +20,50 @@
#include
#include
#include
+#include
-IPAddress::IPAddress() {
- _address.dword = 0;
+IPAddress::IPAddress(const IPAddress& from)
+{
+ ip_addr_copy(_ip, from._ip);
}
-IPAddress::IPAddress(uint8_t first_octet, uint8_t second_octet, uint8_t third_octet, uint8_t fourth_octet) {
- _address.bytes[0] = first_octet;
- _address.bytes[1] = second_octet;
- _address.bytes[2] = third_octet;
- _address.bytes[3] = fourth_octet;
+IPAddress::IPAddress(IPAddress&& from)
+{
+ ip_addr_copy(_ip, from._ip);
+}
+
+IPAddress::IPAddress() {
+ _ip = *IP_ANY_TYPE; // lwIP's v4-or-v6 generic address
}
-IPAddress::IPAddress(uint32_t address) {
- _address.dword = address;
+bool IPAddress::isSet () const {
+ return !ip_addr_isany(&_ip) && ((*this) != IPADDR_NONE);
}
-IPAddress::IPAddress(const uint8_t *address) {
- memcpy(_address.bytes, address, sizeof(_address.bytes));
+IPAddress::IPAddress(uint8_t first_octet, uint8_t second_octet, uint8_t third_octet, uint8_t fourth_octet) {
+ uint8_t addr[] {
+ first_octet,
+ second_octet,
+ third_octet,
+ fourth_octet,
+ };
+
+ *this = &addr[0];
}
bool IPAddress::fromString(const char *address) {
- // TODO: add support for "a", "a.b", "a.b.c" formats
+ if (!fromString4(address)) {
+#if LWIP_IPV6
+ return fromString6(address);
+#else
+ return false;
+#endif
+ }
+ return true;
+}
+
+bool IPAddress::fromString4(const char *address) {
+ // TODO: (IPv4) add support for "a", "a.b", "a.b.c" formats
uint16_t acc = 0; // Accumulator
uint8_t dots = 0;
@@ -63,7 +85,7 @@ bool IPAddress::fromString(const char *address) {
// Too much dots (there must be 3 dots)
return false;
}
- _address.bytes[dots++] = acc;
+ (*this)[dots++] = acc;
acc = 0;
}
else
@@ -77,39 +99,153 @@ bool IPAddress::fromString(const char *address) {
// Too few dots (there must be 3 dots)
return false;
}
- _address.bytes[3] = acc;
+ (*this)[3] = acc;
+
+ setV4();
return true;
}
IPAddress& IPAddress::operator=(const uint8_t *address) {
- memcpy(_address.bytes, address, sizeof(_address.bytes));
+ uint32_t value;
+ memcpy_P(&value, address, sizeof(value));
+
+ *this = value;
return *this;
}
IPAddress& IPAddress::operator=(uint32_t address) {
- _address.dword = address;
+ setV4();
+ v4() = address;
return *this;
}
bool IPAddress::operator==(const uint8_t* addr) const {
- return memcmp(addr, _address.bytes, sizeof(_address.bytes)) == 0;
+ if (!isV4()) {
+ return false;
+ }
+
+ uint32_t value;
+ memcpy_P(&value, addr, sizeof(value));
+
+ return v4() == value;
}
size_t IPAddress::printTo(Print& p) const {
size_t n = 0;
- for(int i = 0; i < 3; i++) {
- n += p.print(_address.bytes[i], DEC);
- n += p.print('.');
+
+ if (!isSet())
+ return p.print(F("(IP unset)"));
+
+#if LWIP_IPV6
+ if (isV6()) {
+ int count0 = 0;
+ for (int i = 0; i < 8; i++) {
+ uint16_t bit = PP_NTOHS(raw6()[i]);
+ if (bit || count0 < 0) {
+ n += p.printf("%x", bit);
+ if (count0 > 0)
+ // no more hiding 0
+ count0 = -8;
+ } else
+ count0++;
+ if ((i != 7 && count0 < 2) || count0 == 7)
+ n += p.print(':');
+ }
+ return n;
+ }
+#endif
+
+ for(int i = 0; i < 4; i++) {
+ n += p.print((*this)[i], DEC);
+ if (i != 3)
+ n += p.print('.');
}
- n += p.print(_address.bytes[3], DEC);
return n;
}
-String IPAddress::toString()
+String IPAddress::toString() const
{
- char szRet[16];
- sprintf(szRet,"%u.%u.%u.%u", _address.bytes[0], _address.bytes[1], _address.bytes[2], _address.bytes[3]);
- return String(szRet);
+ StreamString sstr;
+#if LWIP_IPV6
+ if (isV6())
+ sstr.reserve(40); // 8 shorts x 4 chars each + 7 colons + nullterm
+ else
+#endif
+ sstr.reserve(16); // 4 bytes with 3 chars max + 3 dots + nullterm, or '(IP unset)'
+ printTo(sstr);
+ return sstr;
+}
+
+bool IPAddress::isValid(const String& arg) {
+ return IPAddress().fromString(arg);
+}
+
+bool IPAddress::isValid(const char* arg) {
+ return IPAddress().fromString(arg);
+}
+
+const IPAddress INADDR_ANY; // generic "0.0.0.0" for IPv4 & IPv6
+const IPAddress INADDR_NONE(255,255,255,255);
+
+void IPAddress::clear() {
+ (*this) = INADDR_ANY;
+}
+
+/**************************************/
+
+#if LWIP_IPV6
+
+bool IPAddress::fromString6(const char *address) {
+ // TODO: test test test
+
+ uint32_t acc = 0; // Accumulator
+ int dots = 0, doubledots = -1;
+
+ while (*address)
+ {
+ char c = tolower(*address++);
+ if (isalnum(c)) {
+ if (c >= 'a')
+ c -= 'a' - '0' - 10;
+ acc = acc * 16 + (c - '0');
+ if (acc > 0xffff)
+ // Value out of range
+ return false;
+ }
+ else if (c == ':') {
+ if (*address == ':') {
+ if (doubledots >= 0)
+ // :: allowed once
+ return false;
+ // remember location
+ doubledots = dots + !!acc;
+ address++;
+ }
+ if (dots == 7)
+ // too many separators
+ return false;
+ raw6()[dots++] = PP_HTONS(acc);
+ acc = 0;
+ }
+ else
+ // Invalid char
+ return false;
+ }
+
+ if (doubledots == -1 && dots != 7)
+ // Too few separators
+ return false;
+ raw6()[dots++] = PP_HTONS(acc);
+
+ if (doubledots != -1) {
+ for (int i = dots - doubledots - 1; i >= 0; i--)
+ raw6()[8 - dots + doubledots + i] = raw6()[doubledots + i];
+ for (int i = doubledots; i < 8 - dots + doubledots; i++)
+ raw6()[i] = 0;
+ }
+
+ setV6();
+ return true;
}
-const IPAddress INADDR_NONE(0, 0, 0, 0);
+#endif
diff --git a/cores/esp8266/IPAddress.h b/cores/esp8266/IPAddress.h
index 9e7dfe5e29..99419b92a9 100644
--- a/cores/esp8266/IPAddress.h
+++ b/cores/esp8266/IPAddress.h
@@ -24,60 +24,127 @@
#include
#include
+#include
+#include
+#include
+
+#if !LWIP_IPV6
+struct ip_addr: ipv4_addr { };
+#endif // !LWIP_IPV6
+
+// to display a netif id with printf:
+#define NETIFID_STR "%c%c%u"
+#define NETIFID_VAL(netif) \
+ ((netif)? (netif)->name[0]: '-'), \
+ ((netif)? (netif)->name[1]: '-'), \
+ ((netif)? netif_get_index(netif): 42)
+
// A class to make it easier to handle and pass around IP addresses
+// IPv6 update:
+// IPAddress is now a decorator class for lwIP's ip_addr_t
+// fully backward compatible with legacy IPv4-only Arduino's
+// with unchanged footprint when IPv6 is disabled
class IPAddress: public Printable {
private:
- union {
- uint8_t bytes[4]; // IPv4 address
- uint32_t dword;
- } _address;
+
+ ip_addr_t _ip;
// Access the raw byte array containing the address. Because this returns a pointer
// to the internal structure rather than a copy of the address this function should only
// be used when you know that the usage of the returned uint8_t* will be transient and not
// stored.
uint8_t* raw_address() {
- return _address.bytes;
+ return reinterpret_cast(&v4());
+ }
+ const uint8_t* raw_address() const {
+ return reinterpret_cast(&v4());
}
public:
- // Constructors
IPAddress();
+ IPAddress(const IPAddress&);
+ IPAddress(IPAddress&&);
+
IPAddress(uint8_t first_octet, uint8_t second_octet, uint8_t third_octet, uint8_t fourth_octet);
- IPAddress(uint32_t address);
- IPAddress(const uint8_t *address);
+ IPAddress(uint32_t address) { *this = address; }
+ IPAddress(unsigned long address) { *this = address; }
+ IPAddress(int address) { *this = address; }
+ IPAddress(const uint8_t *address) { *this = address; }
bool fromString(const char *address);
bool fromString(const String &address) { return fromString(address.c_str()); }
// Overloaded cast operator to allow IPAddress objects to be used where a pointer
// to a four-byte uint8_t array is expected
- operator uint32_t() const {
- return _address.dword;
- }
+ operator uint32_t() const { return isV4()? v4(): (uint32_t)0; }
+ operator uint32_t() { return isV4()? v4(): (uint32_t)0; }
+
+ bool isSet () const;
+ operator bool () const { return isSet(); } // <-
+ operator bool () { return isSet(); } // <- both are needed
+
+ // generic IPv4 wrapper to uint32-view like arduino loves to see it
+ const uint32_t& v4() const { return ip_2_ip4(&_ip)->addr; }
+ uint32_t& v4() { return ip_2_ip4(&_ip)->addr; }
+
bool operator==(const IPAddress& addr) const {
- return _address.dword == addr._address.dword;
+ return ip_addr_cmp(&_ip, &addr._ip);
+ }
+ bool operator!=(const IPAddress& addr) const {
+ return !ip_addr_cmp(&_ip, &addr._ip);
}
bool operator==(uint32_t addr) const {
- return _address.dword == addr;
+ return isV4() && v4() == addr;
+ }
+ bool operator==(unsigned long addr) const {
+ return isV4() && v4() == (uint32_t)addr;
+ }
+ bool operator!=(uint32_t addr) const {
+ return !(isV4() && v4() == addr);
+ }
+ bool operator!=(unsigned long addr) const {
+ return isV4() && v4() != (uint32_t)addr;
}
bool operator==(const uint8_t* addr) const;
+ int operator>>(int n) const {
+ return isV4()? v4() >> n: 0;
+ }
+
// Overloaded index operator to allow getting and setting individual octets of the address
uint8_t operator[](int index) const {
- return _address.bytes[index];
+ if (!isV4()) {
+ return 0;
+ }
+
+ return ip4_addr_get_byte_val(*ip_2_ip4(&_ip), index);
}
+
uint8_t& operator[](int index) {
- return _address.bytes[index];
+ setV4();
+
+ uint8_t* ptr = reinterpret_cast(&v4());
+ return *(ptr + index);
}
// Overloaded copy operators to allow initialisation of IPAddress objects from other types
IPAddress& operator=(const uint8_t *address);
IPAddress& operator=(uint32_t address);
+ IPAddress& operator=(const IPAddress&) = default;
virtual size_t printTo(Print& p) const;
- String toString();
+ String toString() const;
+
+ void clear();
+
+ /*
+ check if input string(arg) is a valid IPV4 address or not.
+ return true on valid.
+ return false on invalid.
+ */
+ static bool isValid(const String& arg);
+ static bool isValid(const char* arg);
friend class EthernetClass;
friend class UDP;
@@ -85,8 +152,71 @@ class IPAddress: public Printable {
friend class Server;
friend class DhcpClass;
friend class DNSClient;
+
+ /*
+ lwIP address compatibility
+ */
+ IPAddress(const ipv4_addr& fw_addr) { setV4(); v4() = fw_addr.addr; }
+ IPAddress(const ipv4_addr* fw_addr) { setV4(); v4() = fw_addr->addr; }
+
+ IPAddress& operator=(const ipv4_addr& fw_addr) { setV4(); v4() = fw_addr.addr; return *this; }
+ IPAddress& operator=(const ipv4_addr* fw_addr) { setV4(); v4() = fw_addr->addr; return *this; }
+
+ operator ip_addr_t () const { return _ip; }
+ operator const ip_addr_t*() const { return &_ip; }
+ operator ip_addr_t*() { return &_ip; }
+
+ bool isV4() const { return IP_IS_V4_VAL(_ip); }
+ void setV4() { IP_SET_TYPE_VAL(_ip, IPADDR_TYPE_V4); }
+
+ bool isLocal () const { return ip_addr_islinklocal(&_ip); }
+
+#if LWIP_IPV6
+
+ IPAddress(const ip_addr_t& lwip_addr) { ip_addr_copy(_ip, lwip_addr); }
+ IPAddress(const ip_addr_t* lwip_addr) { ip_addr_copy(_ip, *lwip_addr); }
+
+ IPAddress& operator=(const ip_addr_t& lwip_addr) { ip_addr_copy(_ip, lwip_addr); return *this; }
+ IPAddress& operator=(const ip_addr_t* lwip_addr) { ip_addr_copy(_ip, *lwip_addr); return *this; }
+
+ uint16_t* raw6()
+ {
+ setV6();
+ return reinterpret_cast(ip_2_ip6(&_ip));
+ }
+
+ const uint16_t* raw6() const
+ {
+ return isV6()? reinterpret_cast(ip_2_ip6(&_ip)): nullptr;
+ }
+
+ // when not IPv6, ip_addr_t == ip4_addr_t so this one would be ambiguous
+ // required otherwise
+ operator const ip4_addr_t*() const { return isV4()? ip_2_ip4(&_ip): nullptr; }
+
+ bool isV6() const { return IP_IS_V6_VAL(_ip); }
+ void setV6() { IP_SET_TYPE_VAL(_ip, IPADDR_TYPE_V6); }
+
+ protected:
+ bool fromString6(const char *address);
+
+#else
+
+ // allow portable code when IPv6 is not enabled
+
+ uint16_t* raw6() { return nullptr; }
+ const uint16_t* raw6() const { return nullptr; }
+ bool isV6() const { return false; }
+ void setV6() { }
+
+#endif
+
+ protected:
+ bool fromString4(const char *address);
+
};
+extern const IPAddress INADDR_ANY;
extern const IPAddress INADDR_NONE;
#endif
diff --git a/cores/esp8266/LwipDhcpServer-NonOS.cpp b/cores/esp8266/LwipDhcpServer-NonOS.cpp
new file mode 100644
index 0000000000..a5324ec5d5
--- /dev/null
+++ b/cores/esp8266/LwipDhcpServer-NonOS.cpp
@@ -0,0 +1,97 @@
+/*
+ NonOS DHCP server helpers
+
+ Copyright (c) 2020-2022 esp8266 arduino. All rights reserved.
+ This file is part of the esp8266 core for Arduino environment.
+ 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 "LwipDhcpServer-NonOS.h"
+
+#include
+#include
+
+// Global static DHCP instance for softAP interface
+// (since the netif object never goes away, even when AP is disabled)
+// Initial version fully emulates nonos-sdk api in DhcpServer class,
+// before trying to further change it and possibly break legacy behaviour
+DhcpServer& getNonOSDhcpServer()
+{
+ extern netif netif_git[2];
+ static DhcpServer server(&netif_git[SOFTAP_IF]);
+ return server;
+}
+
+extern "C"
+{
+ // `ip_info` is useless, since we get the information from the netif directly
+ // `netif` would be netif_git[SOFTAP_IF], which we get from the lwip2 glue
+ void dhcps_start(ip_info*, netif*)
+ {
+ auto& server = getNonOSDhcpServer();
+ if (!server.isRunning())
+ {
+ server.begin();
+ }
+ }
+
+ void dhcps_stop()
+ {
+ auto& server = getNonOSDhcpServer();
+ if (server.isRunning())
+ {
+ server.end();
+ }
+ }
+
+ // providing the rest of the nonos-sdk API, which was originally removed in 3.0.0
+
+ bool wifi_softap_set_dhcps_lease(dhcps_lease* please)
+ {
+ auto& server = getNonOSDhcpServer();
+ return server.set_dhcps_lease(please);
+ }
+
+ bool wifi_softap_get_dhcps_lease(dhcps_lease* please)
+ {
+ auto& server = getNonOSDhcpServer();
+ return server.get_dhcps_lease(please);
+ }
+
+ uint32 wifi_softap_get_dhcps_lease_time()
+ {
+ auto& server = getNonOSDhcpServer();
+ return server.getLeaseTime();
+ }
+
+ bool wifi_softap_set_dhcps_lease_time(uint32 minutes)
+ {
+ auto& server = getNonOSDhcpServer();
+ server.setLeaseTime(minutes);
+ return true;
+ }
+
+ bool wifi_softap_reset_dhcps_lease_time()
+ {
+ auto& server = getNonOSDhcpServer();
+ server.resetLeaseTime();
+ return true;
+ }
+
+ bool wifi_softap_add_dhcps_lease(uint8* macaddr)
+ {
+ auto& server = getNonOSDhcpServer();
+ return server.add_dhcps_lease(macaddr);
+ }
+
+} // extern "C"
diff --git a/cores/esp8266/LwipDhcpServer-NonOS.h b/cores/esp8266/LwipDhcpServer-NonOS.h
new file mode 100644
index 0000000000..4da4eca1b3
--- /dev/null
+++ b/cores/esp8266/LwipDhcpServer-NonOS.h
@@ -0,0 +1,24 @@
+/*
+ NonOS DHCP server helpers
+
+ Copyright (c) 2020-2022 esp8266 arduino. All rights reserved.
+ This file is part of the esp8266 core for Arduino environment.
+ 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 "LwipDhcpServer.h"
+
+// Global static DHCP instance for softAP interface
+DhcpServer& getNonOSDhcpServer();
diff --git a/cores/esp8266/LwipDhcpServer.cpp b/cores/esp8266/LwipDhcpServer.cpp
new file mode 100644
index 0000000000..0f5d2bcf32
--- /dev/null
+++ b/cores/esp8266/LwipDhcpServer.cpp
@@ -0,0 +1,1371 @@
+/*
+ lwIPDhcpServer.c - DHCP server
+
+ Copyright (c) 2016 Espressif. All rights reserved.
+ Copyright (c) 2020 esp8266 arduino. All rights reserved.
+ This file is part of the esp8266 core for Arduino environment.
+
+ 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
+
+ // original sources (no license provided)
+ // ESP8266_NONOS_SDK/third_party/lwip/app/dhcpserver.c
+ // ESP8266_NONOS_SDK/third_party/include/lwip/app/dhcpserver.h
+*/
+
+// lwIPDhcpServer.{cc,h} encapsulate original nonos-sdk dhcp server
+// nearly as-is. This is an initial version to guaranty legacy behavior
+// with same default values.
+
+// vv this comment is supposed to be removed after the first commit
+// Logic and coding style in this file can be wrong but left to the closest
+// of the initial version for easier issue tracking.
+// (better is enemy of [good = already working])
+// ^^ this comment is supposed to be removed after the first commit
+
+#include // LWIP_VERSION
+
+#define USE_DNS
+
+#include "lwip/inet.h"
+#include "lwip/err.h"
+#include "lwip/pbuf.h"
+#include "lwip/udp.h"
+#include "lwip/mem.h"
+#include "osapi.h"
+
+#include "LwipDhcpServer.h"
+
+#include "user_interface.h"
+#include "mem.h"
+
+#include
+#include
+
+typedef struct dhcps_state
+{
+ sint16_t state;
+} dhcps_state;
+
+typedef struct dhcps_msg
+{
+ uint8_t op, htype, hlen, hops;
+ uint8_t xid[4];
+ uint16_t secs, flags;
+ uint8_t ciaddr[4];
+ uint8_t yiaddr[4];
+ uint8_t siaddr[4];
+ uint8_t giaddr[4];
+ uint8_t chaddr[16];
+ uint8_t sname[64];
+ uint8_t file[128];
+ uint8_t options[312];
+} dhcps_msg;
+
+#ifndef LWIP_OPEN_SRC
+struct dhcps_lease
+{
+ bool enable;
+ struct ipv4_addr start_ip;
+ struct ipv4_addr end_ip;
+};
+
+#endif
+
+typedef enum
+{
+ DHCPS_TYPE_DYNAMIC,
+ DHCPS_TYPE_STATIC
+} dhcps_type_t;
+
+typedef enum
+{
+ DHCPS_STATE_ONLINE,
+ DHCPS_STATE_OFFLINE
+} dhcps_state_t;
+
+struct dhcps_pool
+{
+ struct ipv4_addr ip;
+ uint8 mac[6];
+ uint32 lease_timer;
+ dhcps_type_t type;
+ dhcps_state_t state;
+};
+
+#define DHCPS_MAX_LEASE 0x64
+#define BOOTP_BROADCAST 0x8000
+
+#define DHCP_REQUEST 1
+#define DHCP_REPLY 2
+#define DHCP_HTYPE_ETHERNET 1
+#define DHCP_HLEN_ETHERNET 6
+#define DHCP_MSG_LEN 236
+
+#define DHCPS_SERVER_PORT 67
+#define DHCPS_CLIENT_PORT 68
+
+static constexpr uint8_t DHCPDISCOVER = 1;
+static constexpr uint8_t DHCPOFFER = 2;
+static constexpr uint8_t DHCPREQUEST = 3;
+static constexpr uint8_t DHCPDECLINE = 4;
+static constexpr uint8_t DHCPACK = 5;
+static constexpr uint8_t DHCPNAK = 6;
+static constexpr uint8_t DHCPRELEASE = 7;
+
+#define DHCP_OPTION_SUBNET_MASK 1
+#define DHCP_OPTION_ROUTER 3
+#define DHCP_OPTION_DNS_SERVER 6
+#define DHCP_OPTION_REQ_IPADDR 50
+#define DHCP_OPTION_LEASE_TIME 51
+#define DHCP_OPTION_MSG_TYPE 53
+#define DHCP_OPTION_SERVER_ID 54
+#define DHCP_OPTION_INTERFACE_MTU 26
+#define DHCP_OPTION_PERFORM_ROUTER_DISCOVERY 31
+#define DHCP_OPTION_BROADCAST_ADDRESS 28
+#define DHCP_OPTION_REQ_LIST 55
+#define DHCP_OPTION_END 255
+
+//#define USE_CLASS_B_NET 1
+#define DHCPS_DEBUG 0
+#define MAX_STATION_NUM 8
+
+#define DHCPS_STATE_OFFER 1
+#define DHCPS_STATE_DECLINE 2
+#define DHCPS_STATE_ACK 3
+#define DHCPS_STATE_NAK 4
+#define DHCPS_STATE_IDLE 5
+#define DHCPS_STATE_RELEASE 6
+
+#ifdef MEMLEAK_DEBUG
+const char mem_debug_file[] ICACHE_RODATA_ATTR = __FILE__;
+#endif
+
+#if DHCPS_DEBUG
+#define LWIP_IS_OK(what, err) \
+ ({ \
+ int ret = 1, errval = (err); \
+ if (errval != ERR_OK) \
+ { \
+ os_printf("DHCPS ERROR: %s (lwip:%s(%d))\n", what, lwip_strerr(errval), errval); \
+ ret = 0; \
+ } \
+ ret; \
+ })
+#else
+#define LWIP_IS_OK(what, err) ((err) == ERR_OK)
+#endif
+
+////////////////////////////////////////////////////////////////////////////////////
+
+DhcpServer::OptionsBuffer& DhcpServer::OptionsBuffer::add(uint8_t code, const uint8_t* data,
+ size_t size)
+{
+ if (size >= UINT8_MAX)
+ {
+ return *this;
+ }
+
+ if ((size_t)(_end - _it) < (size + 2))
+ {
+ return *this;
+ }
+
+ *_it++ = code;
+ *_it++ = size;
+
+ memcpy_P(_it, data, size);
+ _it += size;
+
+ return *this;
+}
+
+////////////////////////////////////////////////////////////////////////////////////
+
+DhcpServer::DhcpServer(netif* netif) : _netif(netif) { }
+
+// wifi_softap_set_station_info is missing in user_interface.h:
+extern "C" void wifi_softap_set_station_info(uint8_t* mac, struct ipv4_addr*);
+
+/******************************************************************************
+ FunctionName : node_insert_to_list
+ Description : insert the node to the list
+ Parameters : arg -- Additional argument to pass to the callback function
+ Returns : none
+*******************************************************************************/
+void DhcpServer::node_insert_to_list(list_node** phead, list_node* pinsert)
+{
+ list_node* plist = nullptr;
+ struct dhcps_pool* pdhcps_pool = nullptr;
+ struct dhcps_pool* pdhcps_node = nullptr;
+ if (*phead == nullptr)
+ {
+ *phead = pinsert;
+ }
+ else
+ {
+ plist = *phead;
+ pdhcps_node = (struct dhcps_pool*)pinsert->pnode;
+ pdhcps_pool = (struct dhcps_pool*)plist->pnode;
+
+ if (pdhcps_node->ip.addr < pdhcps_pool->ip.addr)
+ {
+ pinsert->pnext = plist;
+ *phead = pinsert;
+ }
+ else
+ {
+ while (plist->pnext != nullptr)
+ {
+ pdhcps_pool = (struct dhcps_pool*)plist->pnext->pnode;
+ if (pdhcps_node->ip.addr < pdhcps_pool->ip.addr)
+ {
+ pinsert->pnext = plist->pnext;
+ plist->pnext = pinsert;
+ break;
+ }
+ plist = plist->pnext;
+ }
+
+ if (plist->pnext == nullptr)
+ {
+ plist->pnext = pinsert;
+ }
+ }
+ }
+ // pinsert->pnext = nullptr;
+}
+
+/******************************************************************************
+ FunctionName : node_delete_from_list
+ Description : remove the node from list
+ Parameters : arg -- Additional argument to pass to the callback function
+ Returns : none
+*******************************************************************************/
+void DhcpServer::node_remove_from_list(list_node** phead, list_node* pdelete)
+{
+ list_node* plist = nullptr;
+
+ plist = *phead;
+ if (plist == nullptr)
+ {
+ *phead = nullptr;
+ }
+ else
+ {
+ if (plist == pdelete)
+ {
+ *phead = plist->pnext;
+ pdelete->pnext = nullptr;
+ }
+ else
+ {
+ while (plist != nullptr)
+ {
+ if (plist->pnext == pdelete)
+ {
+ plist->pnext = pdelete->pnext;
+ pdelete->pnext = nullptr;
+ }
+ plist = plist->pnext;
+ }
+ }
+ }
+}
+
+/******************************************************************************
+ FunctionName : add_dhcps_lease
+ Description : add static lease on the list, this will be the next available @
+ Parameters : mac address
+ Returns : true if ok and false if this mac already exist or if all ip are already reserved
+*******************************************************************************/
+bool DhcpServer::add_dhcps_lease(uint8* macaddr)
+{
+ struct dhcps_pool* pdhcps_pool = nullptr;
+ list_node* pback_node = nullptr;
+
+ uint32 start_ip = lease.start_ip.addr;
+ uint32 end_ip = lease.end_ip.addr;
+
+ for (pback_node = plist; pback_node != nullptr; pback_node = pback_node->pnext)
+ {
+ pdhcps_pool = (dhcps_pool*)pback_node->pnode;
+ if (memcmp(pdhcps_pool->mac, macaddr, sizeof(pdhcps_pool->mac)) == 0)
+ {
+#if DHCPS_DEBUG
+ os_printf("this mac already exist");
+#endif
+ return false;
+ }
+ else
+ {
+ start_ip = htonl((ntohl(start_ip) + 1));
+ }
+ }
+
+ if (start_ip > end_ip)
+ {
+#if DHCPS_DEBUG
+ os_printf("no more ip available");
+#endif
+ return false;
+ }
+
+ pdhcps_pool = (struct dhcps_pool*)zalloc(sizeof(struct dhcps_pool));
+ pdhcps_pool->ip.addr = start_ip;
+ memcpy(pdhcps_pool->mac, macaddr, sizeof(pdhcps_pool->mac));
+ pdhcps_pool->lease_timer = this->lease_time;
+ pdhcps_pool->type = DHCPS_TYPE_STATIC;
+ pdhcps_pool->state = DHCPS_STATE_ONLINE;
+ pback_node = (list_node*)zalloc(sizeof(list_node));
+ pback_node->pnode = pdhcps_pool;
+ pback_node->pnext = nullptr;
+ node_insert_to_list(&plist, pback_node);
+
+ return true;
+}
+
+///////////////////////////////////////////////////////////////////////////////////
+/*
+ Set DHCP msg offer options for the given server
+
+ @param buffer -- DHCP options buffer
+ @param server -- DHCP server instance
+*/
+///////////////////////////////////////////////////////////////////////////////////
+void DhcpServer::add_offer_options(OptionsBuffer& options)
+{
+ options.add(DHCP_OPTION_SUBNET_MASK, ip_2_ip4(&_netif->netmask))
+ .add(DHCP_OPTION_SERVER_ID, ip_2_ip4(&_netif->ip_addr));
+
+ // option units are seconds, while server opt is minutes
+ const uint32_t lease_time_seconds = lease_time * 60;
+ options.add(DHCP_OPTION_LEASE_TIME, lease_time_seconds);
+
+ if (offer_router && !ip4_addr_isany_val(*ip_2_ip4(&_netif->gw)))
+ {
+ options.add(DHCP_OPTION_ROUTER, ip_2_ip4(&_netif->gw));
+ }
+
+#ifdef USE_DNS
+ options.add(DHCP_OPTION_DNS_SERVER,
+ !ip4_addr_isany_val(dns_address) ? &dns_address : ip_2_ip4(&_netif->ip_addr));
+#endif
+
+ {
+ const auto* addr = ip_2_ip4(&_netif->ip_addr);
+ const auto* mask = ip_2_ip4(&_netif->netmask);
+ const auto broadcast = ip4_addr_t { .addr = (addr->addr & mask->addr) | ~mask->addr };
+
+ options.add(DHCP_OPTION_BROADCAST_ADDRESS, &broadcast);
+ }
+
+ // TODO: _netif->mtu ?
+ static constexpr uint16_t Mtu { 1500 };
+ options.add(DHCP_OPTION_INTERFACE_MTU, Mtu);
+
+ static constexpr uint8_t RouterDiscovery { 0 };
+ options.add(DHCP_OPTION_PERFORM_ROUTER_DISCOVERY, RouterDiscovery);
+}
+
+///////////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////////
+DhcpServer::OptionsBuffer DhcpServer::create_msg(struct dhcps_msg* m)
+{
+ struct ipv4_addr client;
+
+ client.addr = client_address.addr;
+
+ m->op = DHCP_REPLY;
+ m->htype = DHCP_HTYPE_ETHERNET;
+ m->hlen = 6;
+ m->hops = 0;
+ m->secs = 0;
+ m->flags = htons(BOOTP_BROADCAST);
+
+ memcpy((char*)m->yiaddr, (char*)&client.addr, sizeof(m->yiaddr));
+ memset((char*)m->ciaddr, 0, sizeof(m->ciaddr));
+ memset((char*)m->siaddr, 0, sizeof(m->siaddr));
+ memset((char*)m->giaddr, 0, sizeof(m->giaddr));
+ memset((char*)m->sname, 0, sizeof(m->sname));
+ memset((char*)m->file, 0, sizeof(m->file));
+ memset((char*)m->options, 0, sizeof(m->options));
+ memcpy((char*)m->options, &MagicCookie, sizeof(MagicCookie));
+
+ return { &m->options[sizeof(magic_cookie)], std::end(m->options) };
+}
+///////////////////////////////////////////////////////////////////////////////////
+/*
+ OFFER
+
+ @param -- m DHCP msg
+*/
+///////////////////////////////////////////////////////////////////////////////////
+void DhcpServer::send_offer(struct dhcps_msg* m)
+{
+ struct pbuf* p;
+
+ auto options = create_msg(m);
+ options.add(DHCP_OPTION_MSG_TYPE, DHCPOFFER);
+
+ add_offer_options(options);
+ if (custom_offer_options)
+ {
+ custom_offer_options(*this, options);
+ }
+
+ options.add(DHCP_OPTION_END);
+
+ p = pbuf_alloc(PBUF_TRANSPORT, sizeof(struct dhcps_msg), PBUF_RAM);
+#if DHCPS_DEBUG
+ os_printf("udhcp: send_offer>>p->ref = %d\n", p->ref);
+#endif
+ if (p != nullptr)
+ {
+#if DHCPS_DEBUG
+ os_printf("dhcps: send_offer>>pbuf_alloc succeed\n");
+ os_printf("dhcps: send_offer>>p->tot_len = %d\n", p->tot_len);
+ os_printf("dhcps: send_offer>>p->len = %d\n", p->len);
+#endif
+ pbuf_take(p, m, sizeof(struct dhcps_msg));
+ }
+ else
+ {
+#if DHCPS_DEBUG
+ os_printf("dhcps: send_offer>>pbuf_alloc failed\n");
+#endif
+ return;
+ }
+ if (!LWIP_IS_OK("send_offer", udp_sendto(pcb_dhcps, p, &broadcast_dhcps, DHCPS_CLIENT_PORT)))
+ {
+#if DHCPS_DEBUG
+ os_printf("dhcps: send_offer>>udp_sendto\n");
+#endif
+ }
+ if (p->ref != 0)
+ {
+#if DHCPS_DEBUG
+ os_printf("udhcp: send_offer>>free pbuf\n");
+#endif
+ pbuf_free(p);
+ }
+}
+///////////////////////////////////////////////////////////////////////////////////
+/*
+ NAK
+
+ @param m DHCP msg
+*/
+///////////////////////////////////////////////////////////////////////////////////
+void DhcpServer::send_nak(struct dhcps_msg* m)
+{
+ struct pbuf* p;
+
+ auto options = create_msg(m);
+ options.add(DHCP_OPTION_MSG_TYPE, DHCPNAK);
+ options.add(DHCP_OPTION_END);
+
+ p = pbuf_alloc(PBUF_TRANSPORT, sizeof(struct dhcps_msg), PBUF_RAM);
+#if DHCPS_DEBUG
+ os_printf("udhcp: send_nak>>p->ref = %d\n", p->ref);
+#endif
+ if (p != nullptr)
+ {
+#if DHCPS_DEBUG
+ os_printf("dhcps: send_nak>>pbuf_alloc succeed\n");
+ os_printf("dhcps: send_nak>>p->tot_len = %d\n", p->tot_len);
+ os_printf("dhcps: send_nak>>p->len = %d\n", p->len);
+#endif
+ pbuf_take(p, m, sizeof(struct dhcps_msg));
+ }
+ else
+ {
+#if DHCPS_DEBUG
+ os_printf("dhcps: send_nak>>pbuf_alloc failed\n");
+#endif
+ return;
+ }
+ LWIP_IS_OK("dhcps send nak", udp_sendto(pcb_dhcps, p, &broadcast_dhcps, DHCPS_CLIENT_PORT));
+ if (p->ref != 0)
+ {
+#if DHCPS_DEBUG
+ os_printf("udhcp: send_nak>>free pbuf\n");
+#endif
+ pbuf_free(p);
+ }
+}
+///////////////////////////////////////////////////////////////////////////////////
+/*
+ ACK DHCP
+
+ @param m DHCP msg
+*/
+///////////////////////////////////////////////////////////////////////////////////
+void DhcpServer::send_ack(struct dhcps_msg* m)
+{
+ struct pbuf* p;
+
+ auto options = create_msg(m);
+ options.add(DHCP_OPTION_MSG_TYPE, DHCPACK);
+
+ add_offer_options(options);
+ if (custom_offer_options)
+ {
+ custom_offer_options(*this, options);
+ }
+
+ options.add(DHCP_OPTION_END);
+
+ p = pbuf_alloc(PBUF_TRANSPORT, sizeof(struct dhcps_msg), PBUF_RAM);
+#if DHCPS_DEBUG
+ os_printf("udhcp: send_ack>>p->ref = %d\n", p->ref);
+#endif
+ if (p != nullptr)
+ {
+#if DHCPS_DEBUG
+ os_printf("dhcps: send_ack>>pbuf_alloc succeed\n");
+ os_printf("dhcps: send_ack>>p->tot_len = %d\n", p->tot_len);
+ os_printf("dhcps: send_ack>>p->len = %d\n", p->len);
+#endif
+ pbuf_take(p, m, sizeof(struct dhcps_msg));
+ }
+ else
+ {
+#if DHCPS_DEBUG
+ os_printf("dhcps: send_ack>>pbuf_alloc failed\n");
+#endif
+ return;
+ }
+ if (!LWIP_IS_OK("dhcps send ack",
+ udp_sendto(pcb_dhcps, p, &broadcast_dhcps, DHCPS_CLIENT_PORT)))
+ {
+#if DHCPS_DEBUG
+ os_printf("dhcps: send_ack>>udp_sendto\n");
+#endif
+ }
+
+ if (p->ref != 0)
+ {
+#if DHCPS_DEBUG
+ os_printf("udhcp: send_ack>>free pbuf\n");
+#endif
+ pbuf_free(p);
+ }
+}
+///////////////////////////////////////////////////////////////////////////////////
+/*
+ DHCP
+
+ @param optptr DHCP msg е
+ @param len
+
+ @return uint8_t* DHCP Server
+*/
+///////////////////////////////////////////////////////////////////////////////////
+uint8_t DhcpServer::parse_options(uint8_t* optptr, sint16_t len)
+{
+ struct ipv4_addr client;
+ bool is_dhcp_parse_end = false;
+ struct dhcps_state s;
+
+ client.addr = client_address.addr;
+
+ u8_t* end = optptr + len;
+ u16_t type = 0;
+
+ s.state = DHCPS_STATE_IDLE;
+
+ while (optptr < end)
+ {
+#if DHCPS_DEBUG
+ os_printf("dhcps: (sint16_t)*optptr = %d\n", (sint16_t)*optptr);
+#endif
+ switch ((sint16_t)*optptr)
+ {
+ case DHCP_OPTION_MSG_TYPE: // 53
+ type = *(optptr + 2);
+ break;
+
+ case DHCP_OPTION_REQ_IPADDR: // 50
+ // os_printf("dhcps:0x%08x,0x%08x\n",client.addr,*(uint32*)(optptr+2));
+ if (memcmp((char*)&client.addr, (char*)optptr + 2, 4) == 0)
+ {
+#if DHCPS_DEBUG
+ os_printf("dhcps: DHCP_OPTION_REQ_IPADDR = 0 ok\n");
+#endif
+ s.state = DHCPS_STATE_ACK;
+ }
+ else
+ {
+#if DHCPS_DEBUG
+ os_printf("dhcps: DHCP_OPTION_REQ_IPADDR != 0 err\n");
+#endif
+ s.state = DHCPS_STATE_NAK;
+ }
+ break;
+ case DHCP_OPTION_END:
+ {
+ is_dhcp_parse_end = true;
+ }
+ break;
+ }
+
+ if (is_dhcp_parse_end)
+ {
+ break;
+ }
+
+ optptr += optptr[1] + 2;
+ }
+
+ switch (type)
+ {
+ case DHCPDISCOVER: // 1
+ s.state = DHCPS_STATE_OFFER;
+#if DHCPS_DEBUG
+ os_printf("dhcps: DHCPD_STATE_OFFER\n");
+#endif
+ break;
+
+ case DHCPREQUEST: // 3
+ if (!(s.state == DHCPS_STATE_ACK || s.state == DHCPS_STATE_NAK))
+ {
+ if (renew == true)
+ {
+ s.state = DHCPS_STATE_ACK;
+ }
+ else
+ {
+ s.state = DHCPS_STATE_NAK;
+ }
+#if DHCPS_DEBUG
+ os_printf("dhcps: DHCPD_STATE_NAK\n");
+#endif
+ }
+ break;
+
+ case DHCPDECLINE: // 4
+ s.state = DHCPS_STATE_IDLE;
+#if DHCPS_DEBUG
+ os_printf("dhcps: DHCPD_STATE_IDLE\n");
+#endif
+ break;
+
+ case DHCPRELEASE: // 7
+ s.state = DHCPS_STATE_RELEASE;
+#if DHCPS_DEBUG
+ os_printf("dhcps: DHCPD_STATE_IDLE\n");
+#endif
+ break;
+ }
+#if DHCPS_DEBUG
+ os_printf("dhcps: return s.state = %d\n", s.state);
+#endif
+ return s.state;
+}
+///////////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////////
+sint16_t DhcpServer::parse_msg(struct dhcps_msg* m, u16_t len)
+{
+ if (memcmp((char*)m->options, &MagicCookie, sizeof(MagicCookie)) == 0)
+ {
+ struct ipv4_addr ip;
+ memcpy(&ip.addr, m->ciaddr, sizeof(ip.addr));
+ client_address.addr = dhcps_client_update(m->chaddr, &ip);
+
+ sint16_t ret = parse_options(&m->options[4], len);
+
+ if (ret == DHCPS_STATE_RELEASE)
+ {
+ dhcps_client_leave(m->chaddr, &ip, true); // force to delete
+ client_address.addr = ip.addr;
+ }
+
+ return ret;
+ }
+ return 0;
+}
+///////////////////////////////////////////////////////////////////////////////////
+/*
+ DHCP
+ udp_recv() callback
+
+ @param arg
+ @param pcb
+ @param p
+ @param addr
+ @param port
+*/
+///////////////////////////////////////////////////////////////////////////////////
+
+void DhcpServer::S_handle_dhcp(void* arg, struct udp_pcb* pcb, struct pbuf* p,
+ const ip_addr_t* addr, uint16_t port)
+{
+ DhcpServer* instance = reinterpret_cast(arg);
+ instance->handle_dhcp(pcb, p, addr, port);
+}
+
+void DhcpServer::handle_dhcp(struct udp_pcb* pcb, struct pbuf* p, const ip_addr_t* addr,
+ uint16_t port)
+{
+ (void)pcb;
+ (void)addr;
+ (void)port;
+
+ struct dhcps_msg* pmsg_dhcps = nullptr;
+ sint16_t tlen = 0;
+ u16_t i = 0;
+ u16_t dhcps_msg_cnt = 0;
+ u8_t* p_dhcps_msg = nullptr;
+ u8_t* data = nullptr;
+
+#if DHCPS_DEBUG
+ os_printf("dhcps: handle_dhcp-> receive a packet\n");
+#endif
+ if (p == nullptr)
+ {
+ return;
+ }
+
+ pmsg_dhcps = (struct dhcps_msg*)zalloc(sizeof(struct dhcps_msg));
+ if (nullptr == pmsg_dhcps)
+ {
+ pbuf_free(p);
+ return;
+ }
+ p_dhcps_msg = (u8_t*)pmsg_dhcps;
+ tlen = p->tot_len;
+ data = (u8_t*)p->payload;
+
+#if DHCPS_DEBUG
+ os_printf("dhcps: handle_dhcp-> p->tot_len = %d\n", tlen);
+ os_printf("dhcps: handle_dhcp-> p->len = %d\n", p->len);
+#endif
+
+ for (i = 0; i < p->len; i++)
+ {
+ p_dhcps_msg[dhcps_msg_cnt++] = data[i];
+ }
+
+ if (p->next != nullptr)
+ {
+#if DHCPS_DEBUG
+ os_printf("dhcps: handle_dhcp-> p->next != nullptr\n");
+ os_printf("dhcps: handle_dhcp-> p->next->tot_len = %d\n", p->next->tot_len);
+ os_printf("dhcps: handle_dhcp-> p->next->len = %d\n", p->next->len);
+#endif
+
+ data = (u8_t*)p->next->payload;
+ for (i = 0; i < p->next->len; i++)
+ {
+ p_dhcps_msg[dhcps_msg_cnt++] = data[i];
+ }
+ }
+
+#if DHCPS_DEBUG
+ os_printf("dhcps: handle_dhcp-> parse_msg(p)\n");
+#endif
+
+ switch (parse_msg(pmsg_dhcps, tlen - 240))
+ {
+ case DHCPS_STATE_OFFER: // 1
+#if DHCPS_DEBUG
+ os_printf("dhcps: handle_dhcp-> DHCPD_STATE_OFFER\n");
+#endif
+ send_offer(pmsg_dhcps);
+ break;
+ case DHCPS_STATE_ACK: // 3
+#if DHCPS_DEBUG
+ os_printf("dhcps: handle_dhcp-> DHCPD_STATE_ACK\n");
+#endif
+ send_ack(pmsg_dhcps);
+ if (_netif->num == SOFTAP_IF)
+ {
+ wifi_softap_set_station_info(pmsg_dhcps->chaddr, &client_address);
+ }
+ break;
+ case DHCPS_STATE_NAK: // 4
+#if DHCPS_DEBUG
+ os_printf("dhcps: handle_dhcp-> DHCPD_STATE_NAK\n");
+#endif
+ send_nak(pmsg_dhcps);
+ break;
+ default:
+ break;
+ }
+#if DHCPS_DEBUG
+ os_printf("dhcps: handle_dhcp-> pbuf_free(p)\n");
+#endif
+ pbuf_free(p);
+ free(pmsg_dhcps);
+ pmsg_dhcps = nullptr;
+}
+///////////////////////////////////////////////////////////////////////////////////
+void DhcpServer::init_dhcps_lease(uint32 ip)
+{
+ uint32 softap_ip = 0, local_ip = 0;
+ uint32 start_ip = 0;
+ uint32 end_ip = 0;
+ if (lease.enable == true)
+ {
+ softap_ip = htonl(ip);
+ start_ip = htonl(lease.start_ip.addr);
+ end_ip = htonl(lease.end_ip.addr);
+ /*config ip information can't contain local ip*/
+ if ((start_ip <= softap_ip) && (softap_ip <= end_ip))
+ {
+ lease.enable = false;
+ }
+ else
+ {
+ /*config ip information must be in the same segment as the local ip*/
+ softap_ip >>= 8;
+ if (((start_ip >> 8 != softap_ip) || (end_ip >> 8 != softap_ip))
+ || (end_ip - start_ip > DHCPS_MAX_LEASE))
+ {
+ lease.enable = false;
+ }
+ }
+ }
+
+ if (lease.enable == false)
+ {
+ local_ip = softap_ip = htonl(ip);
+ softap_ip &= 0xFFFFFF00;
+ local_ip &= 0xFF;
+ if (local_ip >= 0x80)
+ {
+ local_ip -= DHCPS_MAX_LEASE;
+ }
+ else
+ {
+ local_ip++;
+ }
+
+ bzero(&lease, sizeof(lease));
+ lease.start_ip.addr = softap_ip | local_ip;
+ lease.end_ip.addr = softap_ip | (local_ip + DHCPS_MAX_LEASE - 1);
+ lease.start_ip.addr = htonl(lease.start_ip.addr);
+ lease.end_ip.addr = htonl(lease.end_ip.addr);
+ }
+ // lease.start_ip.addr = htonl(lease.start_ip.addr);
+ // lease.end_ip.addr= htonl(lease.end_ip.addr);
+ // os_printf("start_ip = 0x%x, end_ip = 0x%x\n",lease.start_ip, lease.end_ip);
+}
+///////////////////////////////////////////////////////////////////////////////////
+
+bool DhcpServer::begin()
+{
+ if (pcb_dhcps != nullptr)
+ {
+ udp_remove(pcb_dhcps);
+ }
+
+ pcb_dhcps = udp_new();
+ if (pcb_dhcps == nullptr)
+ {
+#if DHCPS_DEBUG
+ os_printf("dhcps_start(): could not obtain pcb\n");
+#endif
+ return false;
+ }
+
+ // wrong: answer will go to sta IP4_ADDR(&broadcast_dhcps, 255, 255, 255, 255);
+ // good: going to ap IP4_ADDR(&broadcast_dhcps, 192, 168, 4, 255);
+ // semi proper way:
+ broadcast_dhcps = _netif->ip_addr;
+ ip_2_ip4(&broadcast_dhcps)->addr &= ip_2_ip4(&_netif->netmask)->addr;
+ ip_2_ip4(&broadcast_dhcps)->addr |= ~ip_2_ip4(&_netif->netmask)->addr;
+ // XXXFIXMEIPV6 broadcast address?
+
+ server_address = *ip_2_ip4(&_netif->ip_addr);
+ init_dhcps_lease(server_address.addr);
+
+ udp_bind(pcb_dhcps, IP_ADDR_ANY, DHCPS_SERVER_PORT);
+ udp_recv(pcb_dhcps, S_handle_dhcp, this);
+#if DHCPS_DEBUG
+ os_printf("dhcps:dhcps_start->udp_recv function Set a receive callback handle_dhcp for UDP_PCB "
+ "pcb_dhcps\n");
+#endif
+
+ return true;
+}
+
+DhcpServer::~DhcpServer()
+{
+ end();
+}
+
+void DhcpServer::end()
+{
+ if (!pcb_dhcps)
+ {
+ return;
+ }
+
+ udp_disconnect(pcb_dhcps);
+ udp_remove(pcb_dhcps);
+ pcb_dhcps = nullptr;
+
+ // udp_remove(pcb_dhcps);
+ list_node* pnode = nullptr;
+ list_node* pback_node = nullptr;
+ struct dhcps_pool* dhcp_node = nullptr;
+ struct ipv4_addr ip_zero;
+
+ memset(&ip_zero, 0x0, sizeof(ip_zero));
+ pnode = plist;
+ while (pnode != nullptr)
+ {
+ pback_node = pnode;
+ pnode = pback_node->pnext;
+ node_remove_from_list(&plist, pback_node);
+ dhcp_node = (struct dhcps_pool*)pback_node->pnode;
+ // dhcps_client_leave(dhcp_node->mac,&dhcp_node->ip,true); // force to delete
+ if (_netif->num == SOFTAP_IF)
+ {
+ wifi_softap_set_station_info(dhcp_node->mac, &ip_zero);
+ }
+ free(pback_node->pnode);
+ pback_node->pnode = nullptr;
+ free(pback_node);
+ pback_node = nullptr;
+ }
+}
+
+bool DhcpServer::isRunning() const
+{
+ return pcb_dhcps != nullptr;
+}
+
+/******************************************************************************
+ FunctionName : set_dhcps_lease
+ Description : set the lease information of DHCP server
+ Parameters : please -- Additional argument to set the lease information,
+ Little-Endian.
+ Returns : true or false
+*******************************************************************************/
+bool DhcpServer::set_dhcps_lease(struct dhcps_lease* please)
+{
+ uint32 softap_ip = 0;
+ uint32 start_ip = 0;
+ uint32 end_ip = 0;
+
+ if (_netif->num == SOFTAP_IF || _netif->num == STATION_IF)
+ {
+ uint8 opmode = wifi_get_opmode();
+ if (opmode == STATION_MODE || opmode == NULL_MODE)
+ {
+ return false;
+ }
+ }
+
+ if (please == nullptr || isRunning())
+ {
+ return false;
+ }
+
+ if (please->enable)
+ {
+ // logic below is subject for improvement
+ // - is wrong
+ // - limited to /24 address plans
+ softap_ip = htonl(ip_2_ip4(&_netif->ip_addr)->addr);
+ start_ip = htonl(please->start_ip.addr);
+ end_ip = htonl(please->end_ip.addr);
+ /*config ip information can't contain local ip*/
+ if ((start_ip <= softap_ip) && (softap_ip <= end_ip))
+ {
+ return false;
+ }
+
+ /*config ip information must be in the same segment as the local ip*/
+ softap_ip >>= 8;
+ if ((start_ip >> 8 != softap_ip) || (end_ip >> 8 != softap_ip))
+ {
+ return false;
+ }
+
+ if (end_ip - start_ip > DHCPS_MAX_LEASE)
+ {
+ return false;
+ }
+
+ bzero(&lease, sizeof(lease));
+ // lease.start_ip.addr = start_ip;
+ // lease.end_ip.addr = end_ip;
+ lease.start_ip.addr = please->start_ip.addr;
+ lease.end_ip.addr = please->end_ip.addr;
+ }
+ lease.enable = please->enable;
+ // dhcps_lease_flag = false;
+ return true;
+}
+
+/******************************************************************************
+ FunctionName : get_dhcps_lease
+ Description : get the lease information of DHCP server
+ Parameters : please -- Additional argument to get the lease information,
+ Little-Endian.
+ Returns : true or false
+*******************************************************************************/
+bool DhcpServer::get_dhcps_lease(struct dhcps_lease* please)
+{
+ if (_netif->num == SOFTAP_IF)
+ {
+ uint8 opmode = wifi_get_opmode();
+ if (opmode == STATION_MODE || opmode == NULL_MODE)
+ {
+ return false;
+ }
+ }
+
+ if (nullptr == please)
+ {
+ return false;
+ }
+
+ // if (dhcps_lease_flag){
+ if (lease.enable == false)
+ {
+ if (isRunning())
+ {
+ return false;
+ }
+ }
+ else
+ {
+ // bzero(please, sizeof(*please));
+ // if (!isRunning()){
+ // please->start_ip.addr = htonl(lease.start_ip.addr);
+ // please->end_ip.addr = htonl(lease.end_ip.addr);
+ // }
+ }
+
+ // if (isRunning()){
+ // bzero(please, sizeof(*please));
+ // please->start_ip.addr = lease.start_ip.addr;
+ // please->end_ip.addr = lease.end_ip.addr;
+ // }
+ please->start_ip.addr = lease.start_ip.addr;
+ please->end_ip.addr = lease.end_ip.addr;
+ return true;
+}
+
+void DhcpServer::kill_oldest_dhcps_pool(void)
+{
+ list_node * pre = nullptr, *p = nullptr;
+ list_node * minpre = nullptr, *minp = nullptr;
+ struct dhcps_pool *pdhcps_pool = nullptr, *pmin_pool = nullptr;
+ pre = plist;
+ p = pre->pnext;
+ minpre = pre;
+ minp = p;
+ while (p != nullptr)
+ {
+ pdhcps_pool = (struct dhcps_pool*)p->pnode;
+ pmin_pool = (struct dhcps_pool*)minp->pnode;
+ if (pdhcps_pool->lease_timer < pmin_pool->lease_timer)
+ {
+ minp = p;
+ minpre = pre;
+ }
+ pre = p;
+ p = p->pnext;
+ }
+ minpre->pnext = minp->pnext;
+ pdhcps_pool->state = DHCPS_STATE_OFFLINE;
+ free(minp->pnode);
+ minp->pnode = nullptr;
+ free(minp);
+ minp = nullptr;
+}
+
+void DhcpServer::dhcps_coarse_tmr(void)
+{
+ uint8 num_dhcps_pool = 0;
+ list_node* pback_node = nullptr;
+ list_node* pnode = nullptr;
+ struct dhcps_pool* pdhcps_pool = nullptr;
+ pnode = plist;
+ while (pnode != nullptr)
+ {
+ pdhcps_pool = (struct dhcps_pool*)pnode->pnode;
+ if (pdhcps_pool->type == DHCPS_TYPE_DYNAMIC)
+ {
+ pdhcps_pool->lease_timer--;
+ }
+ if (pdhcps_pool->lease_timer == 0)
+ {
+ pback_node = pnode;
+ pnode = pback_node->pnext;
+ node_remove_from_list(&plist, pback_node);
+ free(pback_node->pnode);
+ pback_node->pnode = nullptr;
+ free(pback_node);
+ pback_node = nullptr;
+ }
+ else
+ {
+ pnode = pnode->pnext;
+ num_dhcps_pool++;
+ }
+ }
+
+ if (num_dhcps_pool >= MAX_STATION_NUM)
+ {
+ kill_oldest_dhcps_pool();
+ }
+}
+
+void DhcpServer::dhcps_client_leave(u8* bssid, struct ipv4_addr* ip, bool force)
+{
+ struct dhcps_pool* pdhcps_pool = nullptr;
+ list_node* pback_node = nullptr;
+
+ if ((bssid == nullptr) || (ip == nullptr))
+ {
+ return;
+ }
+
+ for (pback_node = plist; pback_node != nullptr; pback_node = pback_node->pnext)
+ {
+ pdhcps_pool = (struct dhcps_pool*)pback_node->pnode;
+ if (memcmp(pdhcps_pool->mac, bssid, sizeof(pdhcps_pool->mac)) == 0)
+ {
+ if (memcmp(&pdhcps_pool->ip.addr, &ip->addr, sizeof(pdhcps_pool->ip.addr)) == 0)
+ {
+ if ((pdhcps_pool->type == DHCPS_TYPE_STATIC) || (force))
+ {
+ if (pback_node != nullptr)
+ {
+ node_remove_from_list(&plist, pback_node);
+ free(pback_node);
+ pback_node = nullptr;
+ }
+
+ if (pdhcps_pool != nullptr)
+ {
+ free(pdhcps_pool);
+ pdhcps_pool = nullptr;
+ }
+ }
+ else
+ {
+ pdhcps_pool->state = DHCPS_STATE_OFFLINE;
+ }
+
+ struct ipv4_addr ip_zero;
+ memset(&ip_zero, 0x0, sizeof(ip_zero));
+ if (_netif->num == SOFTAP_IF)
+ {
+ wifi_softap_set_station_info(bssid, &ip_zero);
+ }
+ break;
+ }
+ }
+ }
+}
+
+uint32 DhcpServer::dhcps_client_update(u8* bssid, struct ipv4_addr* ip)
+{
+ struct dhcps_pool* pdhcps_pool = nullptr;
+ list_node* pback_node = nullptr;
+ list_node* pmac_node = nullptr;
+ list_node* pip_node = nullptr;
+ bool flag = false;
+ uint32 start_ip = lease.start_ip.addr;
+ uint32 end_ip = lease.end_ip.addr;
+ dhcps_type_t type = DHCPS_TYPE_DYNAMIC;
+ if (bssid == nullptr)
+ {
+ return IPADDR_ANY;
+ }
+
+ if (ip)
+ {
+ if (IPADDR_BROADCAST == ip->addr)
+ {
+ return IPADDR_ANY;
+ }
+ else if (IPADDR_ANY == ip->addr)
+ {
+ ip = nullptr;
+ }
+ else
+ {
+ type = DHCPS_TYPE_STATIC;
+ }
+ }
+
+ renew = false;
+ for (pback_node = plist; pback_node != nullptr; pback_node = pback_node->pnext)
+ {
+ pdhcps_pool = (struct dhcps_pool*)pback_node->pnode;
+ // os_printf("mac:"MACSTR"bssid:"MACSTR"\r\n",MAC2STR(pdhcps_pool->mac),MAC2STR(bssid));
+ if (memcmp(pdhcps_pool->mac, bssid, sizeof(pdhcps_pool->mac)) == 0)
+ {
+ pmac_node = pback_node;
+ if (ip == nullptr)
+ {
+ flag = true;
+ break;
+ }
+ }
+ if (ip != nullptr)
+ {
+ if (memcmp(&pdhcps_pool->ip.addr, &ip->addr, sizeof(pdhcps_pool->ip.addr)) == 0)
+ {
+ pip_node = pback_node;
+ }
+ }
+ else if (flag == false)
+ {
+ if (memcmp(&pdhcps_pool->ip.addr, &start_ip, sizeof(pdhcps_pool->ip.addr)) != 0)
+ {
+ flag = true;
+ }
+ else
+ {
+ start_ip = htonl((ntohl(start_ip) + 1));
+ }
+ }
+ }
+
+ if ((ip == nullptr) && (flag == false))
+ {
+ if (plist == nullptr)
+ {
+ if (start_ip <= end_ip)
+ {
+ flag = true;
+ }
+ else
+ {
+ return IPADDR_ANY;
+ }
+ }
+ else
+ {
+ if (start_ip > end_ip)
+ {
+ return IPADDR_ANY;
+ }
+ // start_ip = htonl((ntohl(start_ip) + 1));
+ flag = true;
+ }
+ }
+
+ if (pmac_node != nullptr) // update new ip
+ {
+ if (pip_node != nullptr)
+ {
+ pdhcps_pool = (struct dhcps_pool*)pip_node->pnode;
+
+ if (pip_node != pmac_node)
+ {
+ if (pdhcps_pool->state != DHCPS_STATE_OFFLINE) // ip is used
+ {
+ return IPADDR_ANY;
+ }
+
+ // mac exists and ip exists in other node,delete mac
+ node_remove_from_list(&plist, pmac_node);
+ free(pmac_node->pnode);
+ pmac_node->pnode = nullptr;
+ free(pmac_node);
+ pmac_node = pip_node;
+ memcpy(pdhcps_pool->mac, bssid, sizeof(pdhcps_pool->mac));
+ }
+ else
+ {
+ renew = true;
+ type = DHCPS_TYPE_DYNAMIC;
+ }
+
+ pdhcps_pool->lease_timer = this->lease_time;
+ pdhcps_pool->type = type;
+ pdhcps_pool->state = DHCPS_STATE_ONLINE;
+ }
+ else
+ {
+ pdhcps_pool = (struct dhcps_pool*)pmac_node->pnode;
+ if (ip != nullptr)
+ {
+ pdhcps_pool->ip.addr = ip->addr;
+ }
+ else if (flag == true)
+ {
+ pdhcps_pool->ip.addr = start_ip;
+ }
+ else // no ip to distribute
+ {
+ return IPADDR_ANY;
+ }
+
+ node_remove_from_list(&plist, pmac_node);
+ pdhcps_pool->lease_timer = this->lease_time;
+ pdhcps_pool->type = type;
+ pdhcps_pool->state = DHCPS_STATE_ONLINE;
+ node_insert_to_list(&plist, pmac_node);
+ }
+ }
+ else // new station
+ {
+ if (pip_node != nullptr) // maybe ip has used
+ {
+ pdhcps_pool = (struct dhcps_pool*)pip_node->pnode;
+ if (pdhcps_pool->state != DHCPS_STATE_OFFLINE)
+ {
+ return IPADDR_ANY;
+ }
+ memcpy(pdhcps_pool->mac, bssid, sizeof(pdhcps_pool->mac));
+ pdhcps_pool->lease_timer = this->lease_time;
+ pdhcps_pool->type = type;
+ pdhcps_pool->state = DHCPS_STATE_ONLINE;
+ }
+ else
+ {
+ pdhcps_pool = (struct dhcps_pool*)zalloc(sizeof(struct dhcps_pool));
+ if (ip != nullptr)
+ {
+ pdhcps_pool->ip.addr = ip->addr;
+ }
+ else if (flag == true)
+ {
+ pdhcps_pool->ip.addr = start_ip;
+ }
+ else // no ip to distribute
+ {
+ free(pdhcps_pool);
+ return IPADDR_ANY;
+ }
+ if (pdhcps_pool->ip.addr > end_ip)
+ {
+ free(pdhcps_pool);
+ return IPADDR_ANY;
+ }
+ memcpy(pdhcps_pool->mac, bssid, sizeof(pdhcps_pool->mac));
+ pdhcps_pool->lease_timer = this->lease_time;
+ pdhcps_pool->type = type;
+ pdhcps_pool->state = DHCPS_STATE_ONLINE;
+ pback_node = (list_node*)zalloc(sizeof(list_node));
+ pback_node->pnode = pdhcps_pool;
+ pback_node->pnext = nullptr;
+ node_insert_to_list(&plist, pback_node);
+ }
+ }
+
+ return pdhcps_pool->ip.addr;
+}
diff --git a/cores/esp8266/LwipDhcpServer.h b/cores/esp8266/LwipDhcpServer.h
new file mode 100644
index 0000000000..152e54c9e6
--- /dev/null
+++ b/cores/esp8266/LwipDhcpServer.h
@@ -0,0 +1,236 @@
+/*
+ lwIPDhcpServer.h - DHCP server
+
+ Copyright (c) 2016 Espressif. All rights reserved.
+ Copyright (c) 2020 esp8266 arduino. All rights reserved.
+ This file is part of the esp8266 core for Arduino environment.
+
+ 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
+
+ // original sources (no license provided)
+ // ESP8266_NONOS_SDK/third_party/lwip/app/dhcpserver.c
+ // ESP8266_NONOS_SDK/third_party/include/lwip/app/dhcpserver.h
+*/
+
+// lwIPDhcpServer.{cc,h} encapsulate original nonos-sdk dhcp server
+// nearly as-is. This is an initial version to guaranty legacy behavior
+// with same default values.
+
+#pragma once
+
+#include
+
+#include
+#include
+#include
+
+#include
+#include
+
+class DhcpServer
+{
+public:
+ static constexpr int DefaultLeaseTime = 720; // minutes
+ static constexpr uint32 MagicCookie = 0x63538263; // https://tools.ietf.org/html/rfc1497
+ //
+ struct OptionsBuffer
+ {
+ OptionsBuffer(uint8_t* begin, uint8_t* end) : _it(begin), _begin(begin), _end(end) { }
+
+ OptionsBuffer& add(uint8_t code, const uint8_t* data, size_t size);
+
+ OptionsBuffer& add(uint8_t code, const char* data, size_t size)
+ {
+ return add(code, reinterpret_cast(data), size);
+ }
+
+ template
+ OptionsBuffer& add(uint8_t code, const char (&data)[Size])
+ {
+ return add(code, &data[0], Size - 1);
+ }
+
+ template
+ OptionsBuffer& add(uint8_t code, const uint8_t (&data)[Size])
+ {
+ return add(code, &data[0], Size);
+ }
+
+ OptionsBuffer& add(uint8_t code, std::initializer_list data)
+ {
+ return add(code, data.begin(), data.size());
+ }
+
+ OptionsBuffer& add(uint8_t code, const ip4_addr_t* addr)
+ {
+ return add(code,
+ { ip4_addr1(addr), ip4_addr2(addr), ip4_addr3(addr), ip4_addr4(addr) });
+ }
+
+ OptionsBuffer& add(uint8_t code, uint8_t value)
+ {
+ return add(code, { value });
+ }
+
+ OptionsBuffer& add(uint8_t code, uint16_t value)
+ {
+ return add(code, { static_cast((value >> 8) & 0xff),
+ static_cast(value & 0xff) });
+ }
+
+ OptionsBuffer& add(uint8_t code, uint32_t value)
+ {
+ return add(code, { static_cast((value >> 24) & 0xff),
+ static_cast((value >> 16) & 0xff),
+ static_cast((value >> 8) & 0xff),
+ static_cast((value & 0xff)) });
+ }
+
+ OptionsBuffer& add(uint8_t code)
+ {
+ if (_it != _end)
+ {
+ *_it++ = code;
+ }
+ return *this;
+ }
+
+ private:
+ uint8_t* _it;
+ uint8_t* _begin;
+ uint8_t* _end;
+ };
+
+ using OptionsBufferHandler = void (*)(const DhcpServer&, OptionsBuffer&);
+
+ DhcpServer(netif* netif);
+ ~DhcpServer();
+
+ netif* getNetif() const
+ {
+ return _netif;
+ }
+
+ void setRouter(bool value)
+ {
+ offer_router = value;
+ }
+
+ bool getRouter() const
+ {
+ return offer_router;
+ }
+
+ void setDns(ip4_addr_t addr)
+ {
+ dns_address = addr;
+ }
+
+ ip4_addr_t getDns() const
+ {
+ return dns_address;
+ }
+
+ void resetLeaseTime()
+ {
+ lease_time = DefaultLeaseTime;
+ }
+
+ void setLeaseTime(uint32_t minutes)
+ {
+ lease_time = minutes;
+ }
+
+ uint32_t getLeaseTime() const
+ {
+ return lease_time;
+ }
+
+ // Will use provided callback for ACK and OFFER replies
+ // `options.add(...)` to append to the options list
+ // (does not check for duplicates!)
+ void onSendOptions(OptionsBufferHandler handler)
+ {
+ custom_offer_options = handler;
+ }
+
+ bool begin();
+ void end();
+ bool isRunning() const;
+
+ // this is the C interface encapsulated in a class
+ // (originally dhcpserver.c in lwIP-v1.4 in NonOS-SDK)
+ // (not changing everything at once)
+ // the API below is subject to change
+
+ // legacy public C structure and API to eventually turn into C++
+
+ void init_dhcps_lease(uint32 ip);
+ bool set_dhcps_lease(struct dhcps_lease* please);
+ bool get_dhcps_lease(struct dhcps_lease* please);
+ bool add_dhcps_lease(uint8* macaddr);
+
+ void offers();
+
+protected:
+ void add_offer_options(OptionsBuffer&);
+
+ // legacy C structure and API to eventually turn into C++
+
+ typedef struct _list_node
+ {
+ void* pnode;
+ struct _list_node* pnext;
+ } list_node;
+
+ void node_insert_to_list(list_node** phead, list_node* pinsert);
+ void node_remove_from_list(list_node** phead, list_node* pdelete);
+
+ OptionsBuffer create_msg(struct dhcps_msg* m);
+
+ void send_offer(struct dhcps_msg* m);
+ void send_nak(struct dhcps_msg* m);
+ void send_ack(struct dhcps_msg* m);
+ uint8_t parse_options(uint8_t* optptr, sint16_t len);
+ sint16_t parse_msg(struct dhcps_msg* m, u16_t len);
+ static void S_handle_dhcp(void* arg, struct udp_pcb* pcb, struct pbuf* p, const ip_addr_t* addr,
+ uint16_t port);
+ void handle_dhcp(struct udp_pcb* pcb, struct pbuf* p, const ip_addr_t* addr, uint16_t port);
+ void kill_oldest_dhcps_pool(void);
+ void dhcps_coarse_tmr(void); // CURRENTLY NOT CALLED
+ void dhcps_client_leave(u8* bssid, struct ipv4_addr* ip, bool force);
+ uint32 dhcps_client_update(u8* bssid, struct ipv4_addr* ip);
+
+ netif* _netif = nullptr;
+
+ struct udp_pcb* pcb_dhcps = nullptr;
+ ip_addr_t broadcast_dhcps {};
+ ip4_addr_t server_address {};
+ ip4_addr_t client_address {};
+
+ uint32_t lease_time = DefaultLeaseTime;
+
+ bool offer_router = true;
+ ip4_addr_t dns_address {};
+
+ dhcps_lease lease {};
+
+ list_node* plist = nullptr;
+ bool renew = false;
+
+ OptionsBufferHandler custom_offer_options = nullptr;
+
+ static const uint32 magic_cookie;
+};
diff --git a/cores/esp8266/LwipIntf.cpp b/cores/esp8266/LwipIntf.cpp
new file mode 100644
index 0000000000..675063cd62
--- /dev/null
+++ b/cores/esp8266/LwipIntf.cpp
@@ -0,0 +1,198 @@
+/*
+ LwipIntf.cpp
+
+ Arduino interface for lwIP generic callbacks and functions
+
+ Original Copyright (c) 2020 esp8266 Arduino All rights reserved.
+ This file is part of the esp8266 Arduino core environment.
+
+ 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
+*/
+
+extern "C"
+{
+#include "lwip/err.h"
+#include "lwip/ip_addr.h"
+#include "lwip/dns.h"
+#include "lwip/dhcp.h"
+#include "lwip/init.h" // LWIP_VERSION_
+#if LWIP_IPV6
+#include "lwip/netif.h" // struct netif
+#endif
+
+#include
+}
+
+#include "debug.h"
+#include "LwipIntf.h"
+
+// wifi_station_hostname is SDK's station(=global) hostname location
+// - It is never nullptr but wifi_station_get_hostname()
+// can return nullptr when STA is down
+// - Because WiFi is started in off mode at boot time,
+// wifi_station_set/get_hostname() is now no more used
+// because setting hostname first does not work anymore
+// - wifi_station_hostname is overwritten by SDK when wifi is
+// woken up in WiFi::mode()
+//
+extern "C" char* wifi_station_hostname;
+
+// args | esp order arduino order
+// ---- + --------- -------------
+// local_ip | local_ip local_ip
+// arg1 | gateway dns1
+// arg2 | netmask gateway
+// arg3 | dns1 netmask
+//
+// result stored into gateway/netmask/dns1
+
+bool LwipIntf::ipAddressReorder(const IPAddress& local_ip, const IPAddress& arg1,
+ const IPAddress& arg2, const IPAddress& arg3, IPAddress& gateway,
+ IPAddress& netmask, IPAddress& dns1)
+{
+ // To allow compatibility, check first octet of 3rd arg. If 255, interpret as ESP order,
+ // otherwise Arduino order.
+ gateway = arg1;
+ netmask = arg2;
+ dns1 = arg3;
+
+ if (netmask[0] != 255)
+ {
+ // octet is not 255 => interpret as Arduino order
+ gateway = arg2;
+ netmask = arg3[0] == 0 ? IPAddress(255, 255, 255, 0)
+ : arg3; // arg order is arduino and 4th arg not given => assign it
+ // arduino default
+ dns1 = arg1;
+ }
+
+ // check whether all is IPv4 (or gateway not set)
+ if (!(local_ip.isV4() && netmask.isV4() && (!gateway.isSet() || gateway.isV4())))
+ {
+ return false;
+ }
+
+ // ip and gateway must be in the same netmask
+ if (gateway.isSet() && (local_ip.v4() & netmask.v4()) != (gateway.v4() & netmask.v4()))
+ {
+ return false;
+ }
+
+ return true;
+}
+
+/**
+ Get ESP8266 station DHCP hostname
+ @return hostname
+*/
+String LwipIntf::hostname(void)
+{
+ return wifi_station_hostname;
+}
+
+/**
+ Get ESP8266 station DHCP hostname
+ @return hostname
+*/
+const char* LwipIntf::getHostname(void)
+{
+ return wifi_station_hostname;
+}
+
+/**
+ Set ESP8266 station DHCP hostname
+ @param aHostname max length:24
+ @return ok
+*/
+bool LwipIntf::hostname(const char* aHostname)
+{
+ /*
+ vvvv RFC952 vvvv
+ ASSUMPTIONS
+ 1. A "name" (Net, Host, Gateway, or Domain name) is a text string up
+ to 24 characters drawn from the alphabet (A-Z), digits (0-9), minus
+ sign (-), and period (.). Note that periods are only allowed when
+ they serve to delimit components of "domain style names". (See
+ RFC-921, "Domain Name System Implementation Schedule", for
+ background). No blank or space characters are permitted as part of a
+ name. No distinction is made between upper and lower case. The first
+ character must be an alpha character. The last character must not be
+ a minus sign or period. A host which serves as a GATEWAY should have
+ "-GATEWAY" or "-GW" as part of its name. Hosts which do not serve as
+ Internet gateways should not use "-GATEWAY" and "-GW" as part of
+ their names. A host which is a TAC should have "-TAC" as the last
+ part of its host name, if it is a DoD host. Single character names
+ or nicknames are not allowed.
+ ^^^^ RFC952 ^^^^
+
+ - 24 chars max
+ - only a..z A..Z 0..9 '-'
+ - no '-' as last char
+ */
+
+ size_t len = strlen(aHostname);
+
+ if (len == 0 || len > 32)
+ {
+ // nonos-sdk limit is 32
+ // (dhcp hostname option minimum size is ~60)
+ DEBUGV("WiFi.(set)hostname(): empty or large(>32) name\n");
+ return false;
+ }
+
+ // check RFC compliance
+ bool compliant = (len <= 24);
+ for (size_t i = 0; compliant && i < len; i++)
+ if (!isalnum(aHostname[i]) && aHostname[i] != '-')
+ {
+ compliant = false;
+ }
+ if (aHostname[len - 1] == '-')
+ {
+ compliant = false;
+ }
+
+ if (!compliant)
+ {
+ DEBUGV("hostname '%s' is not compliant with RFC952\n", aHostname);
+ }
+
+ bool ret = true;
+
+ strcpy(wifi_station_hostname, aHostname);
+
+ // now we should inform dhcp server for this change, using lwip_renew()
+ // looping through all existing interface
+ // harmless for AP, also compatible with ethernet adapters (to come)
+ for (netif* intf = netif_list; intf; intf = intf->next)
+ {
+ // unconditionally update all known interfaces
+ intf->hostname = wifi_station_hostname;
+
+ if (netif_dhcp_data(intf) != nullptr)
+ {
+ // renew already started DHCP leases
+ err_t lwipret = dhcp_renew(intf);
+ if (lwipret != ERR_OK)
+ {
+ DEBUGV("WiFi.hostname(%s): lwIP error %d on interface %c%c (index %d)\n",
+ intf->hostname, (int)lwipret, intf->name[0], intf->name[1], intf->num);
+ ret = false;
+ }
+ }
+ }
+
+ return ret && compliant;
+}
diff --git a/cores/esp8266/LwipIntf.h b/cores/esp8266/LwipIntf.h
new file mode 100644
index 0000000000..40907cd2bc
--- /dev/null
+++ b/cores/esp8266/LwipIntf.h
@@ -0,0 +1,75 @@
+/*
+ LwipIntf.h
+
+ Arduino interface for lwIP generic callbacks and functions
+
+ Original Copyright (c) 2020 esp8266 Arduino All rights reserved.
+ This file is part of the esp8266 Arduino core environment.
+
+ 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 _LWIPINTF_H
+#define _LWIPINTF_H
+
+#include
+#include
+
+#include
+
+class LwipIntf
+{
+public:
+ using CBType = std::function;
+
+ // reorder WiFi.config() parameters for a esp8266/official Arduino dual-compatibility API
+ // args | esp order arduino order
+ // ---- + --------- -------------
+ // local_ip | local_ip local_ip
+ // arg1 | gateway dns1
+ // arg2 | netmask gateway
+ // arg3 | dns1 netmask
+ //
+ // result stored into gateway/netmask/dns1
+ static bool ipAddressReorder(const IPAddress& local_ip, const IPAddress& arg1,
+ const IPAddress& arg2, const IPAddress& arg3, IPAddress& gateway,
+ IPAddress& netmask, IPAddress& dns1);
+
+ String hostname();
+
+ bool hostname(const String& aHostname)
+ {
+ return hostname(aHostname.c_str());
+ }
+
+ bool hostname(const char* aHostname);
+
+ // ESP32 API compatibility
+ bool setHostname(const char* aHostName)
+ {
+ return hostname(aHostName);
+ }
+
+ // ESP32 API compatibility
+ const char* getHostname();
+
+ // whenever netif status callback is called
+ static bool statusChangeCB(LwipIntf::CBType);
+
+ static bool stateUpCB(LwipIntf::CBType);
+ static bool stateDownCB(LwipIntf::CBType);
+};
+
+#endif // _LWIPINTF_H
diff --git a/cores/esp8266/LwipIntfCB.cpp b/cores/esp8266/LwipIntfCB.cpp
new file mode 100644
index 0000000000..945d7d43ac
--- /dev/null
+++ b/cores/esp8266/LwipIntfCB.cpp
@@ -0,0 +1,78 @@
+/*
+ LwipIntfCB.cpp
+
+ network generic callback implementation
+
+ Original Copyright (c) 2020 esp8266 Arduino All rights reserved.
+ This file is part of the esp8266 Arduino core environment.
+
+ 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
+#include
+#include
+
+static constexpr size_t LwipIntfCallbacks = 3;
+
+static LwipIntf::CBType callbacks[LwipIntfCallbacks];
+static size_t size = 0;
+
+// override empty weak function from glue-lwip
+extern "C" void netif_status_changed(struct netif* netif)
+{
+ for (size_t index = 0; index < size; ++index)
+ {
+ callbacks[index](netif);
+ }
+}
+
+bool LwipIntf::statusChangeCB(LwipIntf::CBType cb)
+{
+ if (size < LwipIntfCallbacks)
+ {
+ callbacks[size++] = std::move(cb);
+ return true;
+ }
+#if defined(DEBUG_ESP_CORE)
+ DEBUGV("LwipIntf::CB %zu/%zu, cannot add more!\n", size, size);
+#endif
+
+ return false;
+}
+
+bool LwipIntf::stateUpCB(LwipIntf::CBType cb)
+{
+ return statusChangeCB(
+ [cb](netif* interface)
+ {
+ if (netif_is_up(interface))
+ {
+ cb(interface);
+ }
+ });
+}
+
+bool LwipIntf::stateDownCB(LwipIntf::CBType cb)
+{
+ return statusChangeCB(
+ [cb](netif* interface)
+ {
+ if (!netif_is_up(interface))
+ {
+ cb(interface);
+ }
+ });
+}
diff --git a/cores/esp8266/LwipIntfDev.h b/cores/esp8266/LwipIntfDev.h
new file mode 100644
index 0000000000..d69e2d73d8
--- /dev/null
+++ b/cores/esp8266/LwipIntfDev.h
@@ -0,0 +1,533 @@
+/*
+ LwipIntfDev.h
+
+ Arduino network template class for generic device
+
+ Original Copyright (c) 2020 esp8266 Arduino All rights reserved.
+ This file is part of the esp8266 Arduino core environment.
+
+ 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 _LWIPINTFDEV_H
+#define _LWIPINTFDEV_H
+
+// TODO:
+// unchain pbufs
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include // wifi_get_macaddr()
+
+#include "SPI.h"
+#include "Schedule.h"
+#include "LwipIntf.h"
+#include "wl_definitions.h"
+
+#ifndef DEFAULT_MTU
+#define DEFAULT_MTU 1500
+#endif
+
+enum EthernetLinkStatus
+{
+ Unknown,
+ LinkON,
+ LinkOFF
+};
+
+template
+class LwipIntfDev: public LwipIntf, public RawDev
+{
+public:
+ LwipIntfDev(int8_t cs = SS, SPIClass& spi = SPI, int8_t intr = -1) :
+ RawDev(cs, spi, intr), _mtu(DEFAULT_MTU), _intrPin(intr), _started(false), _default(false)
+ {
+ memset(&_netif, 0, sizeof(_netif));
+ }
+
+ //The argument order for ESP is not the same as for Arduino. However, there is compatibility code under the hood
+ //to detect Arduino arg order, and handle it correctly.
+ boolean config(const IPAddress& local_ip, const IPAddress& arg1, const IPAddress& arg2,
+ const IPAddress& arg3 = IPADDR_NONE, const IPAddress& dns2 = IPADDR_NONE);
+
+ // two and one parameter version. 2nd parameter is DNS like in Arduino. IPv4 only
+ [[deprecated("It is discouraged to use this 1 or 2 parameters network configuration legacy "
+ "function config(ip[,dns]) as chosen defaults may not match the local network "
+ "configuration")]] boolean
+ config(IPAddress local_ip, IPAddress dns = INADDR_ANY);
+
+ // default mac-address is inferred from esp8266's STA interface
+ boolean begin(const uint8_t* macAddress = nullptr, const uint16_t mtu = DEFAULT_MTU);
+ void end();
+
+ const netif* getNetIf() const
+ {
+ return &_netif;
+ }
+
+ uint8_t* macAddress(uint8_t* mac)
+ {
+ memcpy(mac, &_netif.hwaddr, 6);
+ return mac;
+ }
+ IPAddress localIP() const
+ {
+ return IPAddress(ip4_addr_get_u32(ip_2_ip4(&_netif.ip_addr)));
+ }
+ IPAddress subnetMask() const
+ {
+ return IPAddress(ip4_addr_get_u32(ip_2_ip4(&_netif.netmask)));
+ }
+ IPAddress gatewayIP() const
+ {
+ return IPAddress(ip4_addr_get_u32(ip_2_ip4(&_netif.gw)));
+ }
+ IPAddress dnsIP(int n = 0) const
+ {
+ return IPAddress(dns_getserver(n));
+ }
+ void setDNS(IPAddress dns1, IPAddress dns2 = INADDR_ANY)
+ {
+ if (dns1.isSet())
+ {
+ dns_setserver(0, dns1);
+ }
+ if (dns2.isSet())
+ {
+ dns_setserver(1, dns2);
+ }
+ }
+
+ // 1. Currently when no default is set, esp8266-Arduino uses the first
+ // DHCP client interface receiving a valid address and gateway to
+ // become the new lwIP default interface.
+ // 2. Otherwise - when using static addresses - lwIP for every packets by
+ // defaults selects automatically the best suited output interface
+ // matching the destination address. If several interfaces match,
+ // the first one is picked. On esp8266/Arduno: WiFi interfaces are
+ // checked first.
+ // 3. Or, use `::setDefault(true)` to force using this interface's gateway
+ // as default router.
+ void setDefault(bool deflt = true);
+
+ // true if interface has a valid IPv4 address
+ // (and ethernet link status is not detectable or is up)
+ bool connected()
+ {
+ return !!ip4_addr_get_u32(ip_2_ip4(&_netif.ip_addr))
+ && (!RawDev::isLinkDetectable() || RawDev::isLinked());
+ }
+
+ bool routable()
+ {
+ return !ip_addr_isany(&_netif.gw);
+ }
+
+ // ESP8266WiFi API compatibility
+ wl_status_t status();
+
+ // Arduino Ethernet compatibility
+ EthernetLinkStatus linkStatus();
+
+protected:
+ err_t netif_init();
+ void check_route();
+ void netif_status_callback();
+
+ static err_t netif_init_s(netif* netif);
+ static err_t linkoutput_s(netif* netif, struct pbuf* p);
+ static void netif_status_callback_s(netif* netif);
+
+ // called on a regular basis or on interrupt
+ err_t handlePackets();
+
+ // members
+
+ netif _netif;
+
+ uint16_t _mtu;
+ int8_t _intrPin;
+ uint8_t _macAddress[6];
+ bool _started;
+ bool _scheduled;
+ bool _default;
+};
+
+template
+boolean LwipIntfDev::config(const IPAddress& localIP, const IPAddress& gateway,
+ const IPAddress& netmask, const IPAddress& dns1,
+ const IPAddress& dns2)
+{
+ if (_started)
+ {
+ DEBUGV("LwipIntfDev: use config() then begin()\n");
+ return false;
+ }
+
+ IPAddress realGateway, realNetmask, realDns1;
+ if (!ipAddressReorder(localIP, gateway, netmask, dns1, realGateway, realNetmask, realDns1))
+ {
+ return false;
+ }
+ ip4_addr_set_u32(ip_2_ip4(&_netif.ip_addr), localIP.v4());
+ ip4_addr_set_u32(ip_2_ip4(&_netif.gw), realGateway.v4());
+ ip4_addr_set_u32(ip_2_ip4(&_netif.netmask), realNetmask.v4());
+
+ if (realDns1.isSet())
+ {
+ // Set DNS1-Server
+ dns_setserver(0, realDns1);
+ }
+
+ if (dns2.isSet())
+ {
+ // Set DNS2-Server
+ dns_setserver(1, dns2);
+ }
+ return true;
+}
+
+template
+boolean LwipIntfDev::config(IPAddress local_ip, IPAddress dns)
+{
+ if (!local_ip.isSet())
+ return config(INADDR_ANY, INADDR_ANY, INADDR_ANY);
+
+ if (!local_ip.isV4())
+ return false;
+
+ IPAddress gw(local_ip);
+ gw[3] = 1;
+ if (!dns.isSet())
+ {
+ dns = gw;
+ }
+ return config(local_ip, gw, IPAddress(255, 255, 255, 0), dns);
+}
+
+template
+boolean LwipIntfDev::begin(const uint8_t* macAddress, const uint16_t mtu)
+{
+ if (mtu)
+ {
+ _mtu = mtu;
+ }
+
+ if (macAddress)
+ {
+ memcpy(_macAddress, macAddress, 6);
+ }
+ else
+ {
+ _netif.num = 2;
+ for (auto n = netif_list; n; n = n->next)
+ if (n->num >= _netif.num)
+ {
+ _netif.num = n->num + 1;
+ }
+
+#if 1
+ // forge a new mac-address from the esp's wifi sta one
+ // I understand this is cheating with an official mac-address
+ wifi_get_macaddr(STATION_IF, (uint8*)_macAddress);
+#else
+ // https://serverfault.com/questions/40712/what-range-of-mac-addresses-can-i-safely-use-for-my-virtual-machines
+ memset(_macAddress, 0, 6);
+ _macAddress[0] = 0xEE;
+#endif
+ _macAddress[3] += _netif.num; // alter base mac address
+ _macAddress[0] &= 0xfe; // set as locally administered, unicast, per
+ _macAddress[0] |= 0x02; // https://en.wikipedia.org/wiki/MAC_address#Universal_vs._local
+ }
+
+ if (!RawDev::begin(_macAddress))
+ {
+ return false;
+ }
+
+ // setup lwIP netif
+
+ _netif.hwaddr_len = sizeof _macAddress;
+ memcpy(_netif.hwaddr, _macAddress, sizeof _macAddress);
+
+ // due to netif_add() api: ...
+ ip_addr_t ip_addr, netmask, gw;
+ ip_addr_copy(ip_addr, _netif.ip_addr);
+ ip_addr_copy(netmask, _netif.netmask);
+ ip_addr_copy(gw, _netif.gw);
+
+ if (!netif_add(&_netif, ip_2_ip4(&ip_addr), ip_2_ip4(&netmask), ip_2_ip4(&gw), this,
+ netif_init_s, ethernet_input))
+ {
+ RawDev::end();
+ return false;
+ }
+
+ if (localIP().v4() == 0)
+ {
+ // IP not set, starting DHCP
+ _netif.flags |= NETIF_FLAG_UP;
+ switch (dhcp_start(&_netif))
+ {
+ case ERR_OK:
+ break;
+
+ case ERR_IF:
+ RawDev::end();
+ return false;
+
+ default:
+ end();
+ return false;
+ }
+ }
+ else
+ {
+ // IP is set, static config
+ netif_set_link_up(&_netif);
+ netif_set_up(&_netif);
+ }
+
+ _started = true;
+
+ if (_intrPin >= 0)
+ {
+ if (RawDev::interruptIsPossible())
+ {
+ // attachInterrupt(_intrPin, [&]() { this->handlePackets(); }, FALLING);
+ }
+ else
+ {
+ ::printf((PGM_P)F(
+ "lwIP_Intf: Interrupt not implemented yet, enabling transparent polling\r\n"));
+ _intrPin = -1;
+ }
+ }
+
+ if (_intrPin < 0 && !_scheduled)
+ {
+ _scheduled = schedule_recurrent_function_us(
+ [&]()
+ {
+ if (!_started)
+ {
+ _scheduled = false;
+ return false;
+ }
+ this->handlePackets();
+ return true;
+ },
+ 100);
+ if (!_scheduled)
+ {
+ end();
+ return false;
+ }
+ }
+
+ return true;
+}
+
+template
+void LwipIntfDev::end()
+{
+ if (_started)
+ {
+ netif_remove(&_netif);
+ _started = false;
+ RawDev::end();
+ }
+}
+
+template
+wl_status_t LwipIntfDev::status()
+{
+ return _started ? (connected() ? WL_CONNECTED : WL_DISCONNECTED) : WL_NO_SHIELD;
+}
+
+template
+EthernetLinkStatus LwipIntfDev::linkStatus()
+{
+ return RawDev::isLinkDetectable() ? _started && RawDev::isLinked() ? LinkON : LinkOFF : Unknown;
+}
+
+template
+err_t LwipIntfDev::linkoutput_s(netif* netif, struct pbuf* pbuf)
+{
+ LwipIntfDev* ths = (LwipIntfDev*)netif->state;
+
+ if (pbuf->len != pbuf->tot_len || pbuf->next)
+ {
+ Serial.println("ERRTOT\r\n");
+ }
+
+ uint16_t len = ths->sendFrame((const uint8_t*)pbuf->payload, pbuf->len);
+
+#if PHY_HAS_CAPTURE
+ if (phy_capture)
+ {
+ phy_capture(ths->_netif.num, (const char*)pbuf->payload, pbuf->len, /*out*/ 1,
+ /*success*/ len == pbuf->len);
+ }
+#endif
+
+ return len == pbuf->len ? ERR_OK : ERR_MEM;
+}
+
+template
+err_t LwipIntfDev::netif_init_s(struct netif* netif)
+{
+ return ((LwipIntfDev*)netif->state)->netif_init();
+}
+
+template
+void LwipIntfDev::netif_status_callback_s(struct netif* netif)
+{
+ ((LwipIntfDev*)netif->state)->netif_status_callback();
+}
+
+template
+err_t LwipIntfDev::netif_init()
+{
+ _netif.name[0] = 'e';
+ _netif.name[1] = '0' + _netif.num;
+ _netif.mtu = _mtu;
+ _netif.chksum_flags = NETIF_CHECKSUM_ENABLE_ALL;
+ _netif.flags = NETIF_FLAG_ETHARP | NETIF_FLAG_IGMP | NETIF_FLAG_BROADCAST | NETIF_FLAG_LINK_UP;
+
+ // lwIP's doc: This function typically first resolves the hardware
+ // address, then sends the packet. For ethernet physical layer, this is
+ // usually lwIP's etharp_output()
+ _netif.output = etharp_output;
+
+ // lwIP's doc: This function outputs the pbuf as-is on the link medium
+ // (this must points to the raw ethernet driver, meaning: us)
+ _netif.linkoutput = linkoutput_s;
+
+ _netif.status_callback = netif_status_callback_s;
+
+ return ERR_OK;
+}
+
+template
+void LwipIntfDev::netif_status_callback()
+{
+ check_route();
+ if (connected())
+ {
+ sntp_stop();
+ sntp_init();
+ }
+}
+
+template
+void LwipIntfDev::check_route()
+{
+ if (connected())
+ {
+ if (_default || (netif_default == nullptr && routable()))
+ {
+ // on user request,
+ // or if there is no current default interface, but our gateway is valid
+ netif_set_default(&_netif);
+ }
+ }
+ else if (netif_default == &_netif)
+ {
+ netif_set_default(nullptr);
+ }
+}
+
+template
+err_t LwipIntfDev::handlePackets()
+{
+ int pkt = 0;
+ while (1)
+ {
+ if (++pkt == 10)
+ // prevent starvation
+ {
+ return ERR_OK;
+ }
+
+ uint16_t tot_len = RawDev::readFrameSize();
+ if (!tot_len)
+ {
+ return ERR_OK;
+ }
+
+ // from doc: use PBUF_RAM for TX, PBUF_POOL from RX
+ // however:
+ // PBUF_POOL can return chained pbuf (not in one piece)
+ // and WiznetDriver does not have the proper API to deal with that
+ // so in the meantime, we use PBUF_RAM instead which is currently
+ // guarantying to deliver a continuous chunk of memory.
+ // TODO: tweak the wiznet driver to allow copying partial chunk
+ // of received data and use PBUF_POOL.
+ pbuf* pbuf = pbuf_alloc(PBUF_RAW, tot_len, PBUF_RAM);
+ if (!pbuf || pbuf->len < tot_len)
+ {
+ if (pbuf)
+ {
+ pbuf_free(pbuf);
+ }
+ RawDev::discardFrame(tot_len);
+ return ERR_BUF;
+ }
+
+ uint16_t len = RawDev::readFrameData((uint8_t*)pbuf->payload, tot_len);
+ if (len != tot_len)
+ {
+ // tot_len is given by readFrameSize()
+ // and is supposed to be honoured by readFrameData()
+ // todo: ensure this test is unneeded, remove the print
+ Serial.println("read error?\r\n");
+ pbuf_free(pbuf);
+ return ERR_BUF;
+ }
+
+ err_t err = _netif.input(pbuf, &_netif);
+
+#if PHY_HAS_CAPTURE
+ if (phy_capture)
+ {
+ phy_capture(_netif.num, (const char*)pbuf->payload, tot_len, /*out*/ 0,
+ /*success*/ err == ERR_OK);
+ }
+#endif
+
+ if (err != ERR_OK)
+ {
+ pbuf_free(pbuf);
+ return err;
+ }
+ // (else) allocated pbuf is now lwIP's responsibility
+ }
+}
+
+template
+void LwipIntfDev::setDefault(bool deflt)
+{
+ _default = deflt;
+ check_route();
+}
+
+#endif // _LWIPINTFDEV_H
diff --git a/cores/esp8266/MD5Builder.cpp b/cores/esp8266/MD5Builder.cpp
index dd3d9dd333..3d068b949a 100644
--- a/cores/esp8266/MD5Builder.cpp
+++ b/cores/esp8266/MD5Builder.cpp
@@ -1,82 +1,95 @@
-#include "Arduino.h"
-#include "md5.h"
-#include "MD5Builder.h"
+#include
+#include
+#include
-#define hex_char_to_byte(c) (((c)>='a'&&(c)<='f')?((c)-87):((c)>='A'&&(c)<='F')?((c)-55):((c)>='0'&&(c)<='9')?((c)-48):0)
+uint8_t hex_char_to_byte(uint8_t c) {
+ return (c >= 'a' && c <= 'f') ? (c - ((uint8_t)'a' - 0xa)) :
+ (c >= 'A' && c <= 'F') ? (c - ((uint8_t)'A' - 0xA)) :
+ (c >= '0' && c <= '9') ? (c - (uint8_t)'0') : 0;
+}
void MD5Builder::begin(void){
- memset(_buf, 0x00, 16);
- MD5Init(&_ctx);
+ memset(_buf, 0x00, 16);
+ MD5Init(&_ctx);
}
-void MD5Builder::add(uint8_t * data, uint16_t len){
- MD5Update(&_ctx, data, len);
+void MD5Builder::add(const uint8_t * data, const uint16_t len){
+ MD5Update(&_ctx, data, len);
}
void MD5Builder::addHexString(const char * data){
- uint16_t i, len = strlen(data);
- uint8_t * tmp = (uint8_t*)malloc(len/2);
- if(tmp == NULL)
- return;
- for(i=0; i{new(std::nothrow) uint8_t[len / 2]};
+
+ if (!tmp) {
+ return;
+ }
+
+ for(i=0; i -1) && (bytesleft > 0)) {
- // get available data size
- int sizeAvailable = stream.available();
- if(sizeAvailable) {
- int readBytes = sizeAvailable;
-
- // read only the asked bytes
- if(readBytes > bytesleft) {
- readBytes = bytesleft ;
- }
+bool MD5Builder::addStream(Stream &stream, const size_t maxLen) {
+ const int buf_size = 512;
+ int maxLengthLeft = maxLen;
+
+ auto buf = std::unique_ptr{new(std::nothrow) uint8_t[buf_size]};
+
+ if (!buf) {
+ return false;
+ }
- // not read more the buffer can handle
- if(readBytes > buf_size) {
- readBytes = buf_size;
+ int bytesAvailable = stream.available();
+ while((bytesAvailable > 0) && (maxLengthLeft > 0)) {
+
+ // determine number of bytes to read
+ int readBytes = bytesAvailable;
+ if (readBytes > maxLengthLeft){
+ readBytes = maxLengthLeft; // read only until max_len
+ }
+ if (readBytes > buf_size){
+ readBytes = buf_size; // not read more the buffer can handle
}
- // read data
- int bytesread = stream.readBytes(buf, readBytes);
- bytesleft -= bytesread;
- if(bytesread > 0) {
- MD5Update(&_ctx, buf, bytesread);
+ // read data and check if we got something
+ int numBytesRead = stream.readBytes(buf.get(), readBytes);
+ if (numBytesRead < 1) {
+ return false;
}
- }
- // time for network streams
- delay(0);
+
+ // Update MD5 with buffer payload
+ MD5Update(&_ctx, buf.get(), numBytesRead);
+
+ yield(); // time for network streams
+
+ // update available number of bytes
+ maxLengthLeft -= numBytesRead;
+ bytesAvailable = stream.available();
}
- // guaranteed not null
- free(buf);
- return (bytesleft == 0);
- } else {
- return false;
- }
+
+ return true;
}
void MD5Builder::calculate(void){
- MD5Final(_buf, &_ctx);
+ MD5Final(_buf, &_ctx);
}
-void MD5Builder::getBytes(uint8_t * output){
- memcpy(output, _buf, 16);
+void MD5Builder::getBytes(uint8_t * output) const {
+ memcpy(output, _buf, 16);
}
-void MD5Builder::getChars(char * output){
- for(uint8_t i = 0; i < 16; i++)
- sprintf(output + (i * 2), "%02x", _buf[i]);
+void MD5Builder::getChars(char * output) const {
+ for (uint8_t i=0; i<16; i++){
+ sprintf(output + (i * 2), "%02x", _buf[i]);
+ }
}
-String MD5Builder::toString(void){
- char out[33];
- getChars(out);
- return String(out);
-}
\ No newline at end of file
+String MD5Builder::toString(void) const {
+ char out[33];
+ getChars(out);
+ return String(out);
+}
diff --git a/cores/esp8266/MD5Builder.h b/cores/esp8266/MD5Builder.h
index ec1ac83114..c3fbce5735 100644
--- a/cores/esp8266/MD5Builder.h
+++ b/cores/esp8266/MD5Builder.h
@@ -1,9 +1,9 @@
-/*
+/*
md5.h - exposed md5 ROM functions for esp8266
Copyright (c) 2015 Hristo Gochkov. All rights reserved.
This file is part of the esp8266 core for Arduino environment.
-
+
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
@@ -21,7 +21,8 @@
#ifndef __ESP8266_MD5_BUILDER__
#define __ESP8266_MD5_BUILDER__
-#include "Arduino.h"
+#include
+#include
#include "md5.h"
class MD5Builder {
@@ -30,18 +31,18 @@ class MD5Builder {
uint8_t _buf[16];
public:
void begin(void);
- void add(uint8_t * data, uint16_t len);
- void add(const char * data){ add((uint8_t*)data, strlen(data)); }
+ void add(const uint8_t * data, const uint16_t len);
+ void add(const char * data){ add((const uint8_t*)data, strlen(data)); }
void add(char * data){ add((const char*)data); }
- void add(String data){ add(data.c_str()); }
+ void add(const String& data){ add(data.c_str()); }
void addHexString(const char * data);
void addHexString(char * data){ addHexString((const char*)data); }
- void addHexString(String data){ addHexString(data.c_str()); }
- bool addStream(Stream & stream, const size_t total_len);
+ void addHexString(const String& data){ addHexString(data.c_str()); }
+ bool addStream(Stream & stream, const size_t maxLen);
void calculate(void);
- void getBytes(uint8_t * output);
- void getChars(char * output);
- String toString(void);
+ void getBytes(uint8_t * output) const;
+ void getChars(char * output) const;
+ String toString(void) const;
};
diff --git a/cores/esp8266/PolledTimeout.h b/cores/esp8266/PolledTimeout.h
new file mode 100644
index 0000000000..1252ce6c29
--- /dev/null
+++ b/cores/esp8266/PolledTimeout.h
@@ -0,0 +1,310 @@
+#ifndef __POLLEDTIMING_H__
+#define __POLLEDTIMING_H__
+
+
+/*
+ PolledTimeout.h - Encapsulation of a polled Timeout
+
+ Copyright (c) 2018 Daniel Salazar. All rights reserved.
+ This file is part of the esp8266 core for Arduino environment.
+
+ 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 // IRAM_ATTR
+#include // std::numeric_limits
+#include // std::is_unsigned
+#include
+#include
+
+namespace esp8266
+{
+
+
+namespace polledTimeout
+{
+
+namespace YieldPolicy
+{
+
+struct DoNothing
+{
+ static void execute() {}
+};
+
+struct YieldOrSkip
+{
+ static void execute() {esp_yield();}
+};
+
+template
+struct YieldAndDelayMs
+{
+ static void execute() {delay(delayMs);}
+};
+
+} //YieldPolicy
+
+namespace TimePolicy
+{
+
+struct TimeSourceMillis
+{
+ // time policy in milli-seconds based on millis()
+
+ using timeType = decltype(millis());
+ static timeType time() {return millis();}
+ static constexpr timeType ticksPerSecond = 1000;
+ static constexpr timeType ticksPerSecondMax = 1000;
+};
+
+struct TimeSourceCycles
+{
+ // time policy based on esp_get_cycle_count()
+ // this particular time measurement is intended to be called very often
+ // (every loop, every yield)
+
+ using timeType = decltype(esp_get_cycle_count());
+ static timeType time() {return esp_get_cycle_count();}
+ static constexpr timeType ticksPerSecond = esp_get_cpu_freq_mhz() * 1000000UL; // 80'000'000 or 160'000'000 Hz
+ static constexpr timeType ticksPerSecondMax = 160000000; // 160MHz
+};
+
+template
+ // "second_th" units of timeType for one second
+struct TimeUnit
+{
+ using timeType = typename TimeSourceType::timeType;
+
+#if __GNUC__ < 5
+ // gcc-4.8 cannot compile the constexpr-only version of this function
+ // using #defines instead luckily works
+ static constexpr timeType computeRangeCompensation ()
+ {
+ #define number_of_secondTh_in_one_tick ((1.0 * second_th) / ticksPerSecond)
+ #define fractional (number_of_secondTh_in_one_tick - (long)number_of_secondTh_in_one_tick)
+
+ return ({
+ fractional == 0?
+ 1: // no need for compensation
+ (number_of_secondTh_in_one_tick / fractional) + 0.5; // scalar multiplier allowing exact division
+ });
+
+ #undef number_of_secondTh_in_one_tick
+ #undef fractional
+ }
+#else
+ static constexpr timeType computeRangeCompensation ()
+ {
+ return ({
+ constexpr double number_of_secondTh_in_one_tick = (1.0 * second_th) / ticksPerSecond;
+ constexpr double fractional = number_of_secondTh_in_one_tick - (long)number_of_secondTh_in_one_tick;
+ fractional == 0?
+ 1: // no need for compensation
+ (number_of_secondTh_in_one_tick / fractional) + 0.5; // scalar multiplier allowing exact division
+ });
+ }
+#endif
+
+ static constexpr timeType ticksPerSecond = TimeSourceType::ticksPerSecond;
+ static constexpr timeType ticksPerSecondMax = TimeSourceType::ticksPerSecondMax;
+ static constexpr timeType rangeCompensate = computeRangeCompensation();
+ static constexpr timeType user2UnitMultiplierMax = (ticksPerSecondMax * rangeCompensate) / second_th;
+ static constexpr timeType user2UnitMultiplier = (ticksPerSecond * rangeCompensate) / second_th;
+ static constexpr timeType user2UnitDivider = rangeCompensate;
+ // std::numeric_limits::max() is reserved
+ static constexpr timeType timeMax = (std::numeric_limits::max() - 1) / user2UnitMultiplierMax;
+
+ static timeType toTimeTypeUnit (const timeType userUnit) {return (userUnit * user2UnitMultiplier) / user2UnitDivider;}
+ static timeType toUserUnit (const timeType internalUnit) {return (internalUnit * user2UnitDivider) / user2UnitMultiplier;}
+ static timeType time () {return TimeSourceType::time();}
+};
+
+using TimeMillis = TimeUnit< TimeSourceMillis, 1000 >;
+using TimeFastMillis = TimeUnit< TimeSourceCycles, 1000 >;
+using TimeFastMicros = TimeUnit< TimeSourceCycles, 1000000 >;
+using TimeFastNanos = TimeUnit< TimeSourceCycles, 1000000000 >;
+
+} //TimePolicy
+
+template
+class timeoutTemplate
+{
+public:
+ using timeType = typename TimePolicyT::timeType;
+ static_assert(std::is_unsigned::value == true, "timeType must be unsigned");
+
+ static constexpr timeType alwaysExpired = 0;
+ static constexpr timeType neverExpires = std::numeric_limits::max();
+ static constexpr timeType rangeCompensate = TimePolicyT::rangeCompensate; //debug
+
+ timeoutTemplate(const timeType userTimeout)
+ {
+ reset(userTimeout);
+ }
+
+ IRAM_ATTR // fast
+ bool expired()
+ {
+ YieldPolicyT::execute(); //in case of DoNothing: gets optimized away
+ if(PeriodicT) //in case of false: gets optimized away
+ return expiredRetrigger();
+ return expiredOneShot();
+ }
+
+ IRAM_ATTR // fast
+ operator bool()
+ {
+ return expired();
+ }
+
+ bool canExpire () const
+ {
+ return !_neverExpires;
+ }
+
+ bool canWait () const
+ {
+ return _timeout != alwaysExpired;
+ }
+
+ // Resets, will trigger after this new timeout.
+ IRAM_ATTR // called from ISR
+ void reset(const timeType newUserTimeout)
+ {
+ reset();
+ _timeout = TimePolicyT::toTimeTypeUnit(newUserTimeout);
+ _neverExpires = (newUserTimeout < 0) || (newUserTimeout > timeMax());
+ }
+
+ // Resets, will trigger after the timeout previously set.
+ IRAM_ATTR // called from ISR
+ void reset()
+ {
+ _start = TimePolicyT::time();
+ }
+
+ // Resets to just expired so that on next poll the check will immediately trigger for the user,
+ // also change timeout (after next immediate trigger).
+ IRAM_ATTR // called from ISR
+ void resetAndSetExpired (const timeType newUserTimeout)
+ {
+ reset(newUserTimeout);
+ _start -= _timeout;
+ }
+
+ // Resets to just expired so that on next poll the check will immediately trigger for the user.
+ IRAM_ATTR // called from ISR
+ void resetAndSetExpired ()
+ {
+ reset();
+ _start -= _timeout;
+ }
+
+ void resetToNeverExpires ()
+ {
+ _timeout = alwaysExpired + 1; // because canWait() has precedence
+ _neverExpires = true;
+ }
+
+ timeType getTimeout() const
+ {
+ return TimePolicyT::toUserUnit(_timeout);
+ }
+
+ static constexpr timeType timeMax()
+ {
+ return TimePolicyT::timeMax;
+ }
+
+private:
+
+ IRAM_ATTR // fast
+ bool checkExpired(const timeType internalUnit) const
+ {
+ // canWait() is not checked here
+ // returns "can expire" and "time expired"
+ return (!_neverExpires) && ((internalUnit - _start) >= _timeout);
+ }
+
+protected:
+
+ IRAM_ATTR // fast
+ bool expiredRetrigger()
+ {
+ if (!canWait())
+ return true;
+
+ timeType current = TimePolicyT::time();
+ if(checkExpired(current))
+ {
+ unsigned long n = (current - _start) / _timeout; //how many _timeouts periods have elapsed, will usually be 1 (current - _start >= _timeout)
+ _start += n * _timeout;
+ return true;
+ }
+ return false;
+ }
+
+ IRAM_ATTR // fast
+ bool expiredOneShot() const
+ {
+ // returns "always expired" or "has expired"
+ return !canWait() || checkExpired(TimePolicyT::time());
+ }
+
+ timeType _timeout;
+ timeType _start;
+ bool _neverExpires;
+};
+
+// legacy type names, deprecated (unit is milliseconds)
+
+using oneShot = polledTimeout::timeoutTemplate /*__attribute__((deprecated("use oneShotMs")))*/;
+using periodic = polledTimeout::timeoutTemplate /*__attribute__((deprecated("use periodicMs")))*/;
+
+// standard versions (based on millis())
+// timeMax() is 49.7 days ((2^32)-2 ms)
+
+using oneShotMs = polledTimeout::timeoutTemplate;
+using periodicMs = polledTimeout::timeoutTemplate;
+
+// Time policy based on esp_get_cycle_count(), and intended to be called very often:
+// "Fast" versions sacrifices time range for improved precision and reduced execution time (by 86%)
+// (cpu cycles for ::expired(): 372 (millis()) vs 52 (esp_get_cycle_count()))
+// timeMax() values:
+// Ms: max is 26843 ms (26.8 s)
+// Us: max is 26843545 us (26.8 s)
+// Ns: max is 1073741823 ns ( 1.07 s)
+// (time policy based on esp_get_cycle_count() is intended to be called very often)
+
+using oneShotFastMs = polledTimeout::timeoutTemplate;
+using periodicFastMs = polledTimeout::timeoutTemplate;
+using oneShotFastUs = polledTimeout::timeoutTemplate;
+using periodicFastUs = polledTimeout::timeoutTemplate;
+using oneShotFastNs = polledTimeout::timeoutTemplate;
+using periodicFastNs = polledTimeout::timeoutTemplate;
+
+} //polledTimeout
+
+
+/* A 1-shot timeout that auto-yields when in CONT can be built as follows:
+ * using oneShotYieldMs = esp8266::polledTimeout::timeoutTemplate;
+ *
+ * Other policies can be implemented by the user, e.g.: simple yield that panics in SYS, and the polledTimeout types built as needed as shown above, without modifying this file.
+ */
+
+}//esp8266
+
+#endif
diff --git a/cores/esp8266/Print.cpp b/cores/esp8266/Print.cpp
index 5b481fd403..c2075fa7d8 100644
--- a/cores/esp8266/Print.cpp
+++ b/cores/esp8266/Print.cpp
@@ -33,9 +33,16 @@
/* default implementation: may be overridden */
size_t Print::write(const uint8_t *buffer, size_t size) {
+ IAMSLOW();
+
size_t n = 0;
- while(size--) {
- n += write(*buffer++);
+ while (size--) {
+ size_t ret = write(pgm_read_byte(buffer++));
+ if (ret == 0) {
+ // Write of last byte didn't complete, abort additional processing
+ break;
+ }
+ n += ret;
}
return n;
}
@@ -48,7 +55,7 @@ size_t Print::printf(const char *format, ...) {
size_t len = vsnprintf(temp, sizeof(temp), format, arg);
va_end(arg);
if (len > sizeof(temp) - 1) {
- buffer = new char[len + 1];
+ buffer = new (std::nothrow) char[len + 1];
if (!buffer) {
return 0;
}
@@ -63,14 +70,45 @@ size_t Print::printf(const char *format, ...) {
return len;
}
+size_t Print::printf_P(PGM_P format, ...) {
+ va_list arg;
+ va_start(arg, format);
+ char temp[64];
+ char* buffer = temp;
+ size_t len = vsnprintf_P(temp, sizeof(temp), format, arg);
+ va_end(arg);
+ if (len > sizeof(temp) - 1) {
+ buffer = new (std::nothrow) char[len + 1];
+ if (!buffer) {
+ return 0;
+ }
+ va_start(arg, format);
+ vsnprintf_P(buffer, len + 1, format, arg);
+ va_end(arg);
+ }
+ len = write((const uint8_t*) buffer, len);
+ if (buffer != temp) {
+ delete[] buffer;
+ }
+ return len;
+}
+
size_t Print::print(const __FlashStringHelper *ifsh) {
PGM_P p = reinterpret_cast(ifsh);
+ char buff[128] __attribute__ ((aligned(4)));
+ auto len = strlen_P(p);
size_t n = 0;
- while (1) {
- uint8_t c = pgm_read_byte(p++);
- if (c == 0) break;
- n += write(c);
+ while (n < len) {
+ int to_write = std::min(sizeof(buff), len - n);
+ memcpy_P(buff, p, to_write);
+ auto written = write(buff, to_write);
+ n += written;
+ p += written;
+ if (!written) {
+ // Some error, write() should write at least 1 byte before returning
+ break;
+ }
}
return n;
}
@@ -100,35 +138,39 @@ size_t Print::print(unsigned int n, int base) {
}
size_t Print::print(long n, int base) {
- if(base == 0) {
- return write(n);
- } else if(base == 10) {
- if(n < 0) {
- int t = print('-');
- n = -n;
- return printNumber(n, 10) + t;
- }
- return printNumber(n, 10);
- } else {
- return printNumber(n, base);
+ int t = 0;
+ if (base == 10 && n < 0) {
+ t = print('-');
+ n = -n;
}
+ return printNumber(static_cast(n), base) + t;
}
size_t Print::print(unsigned long n, int base) {
- if(base == 0)
+ if (base == 0) {
return write(n);
- else
- return printNumber(n, base);
+ }
+ return printNumber(n, base);
}
-size_t Print::print(double n, int digits) {
- return printFloat(n, digits);
+size_t Print::print(long long n, int base) {
+ int t = 0;
+ if (base == 10 && n < 0) {
+ t = print('-');
+ n = -n;
+ }
+ return printNumber(static_cast(n), base) + t;
}
-size_t Print::println(const __FlashStringHelper *ifsh) {
- size_t n = print(ifsh);
- n += println();
- return n;
+size_t Print::print(unsigned long long n, int base) {
+ if (base == 0) {
+ return write(n);
+ }
+ return printNumber(n, base);
+}
+
+size_t Print::print(double n, int digits) {
+ return printNumber(n, digits);
}
size_t Print::print(const Printable& x) {
@@ -139,130 +181,90 @@ size_t Print::println(void) {
return print("\r\n");
}
+size_t Print::println(const __FlashStringHelper* ifsh) {
+ return _println(ifsh);
+}
+
size_t Print::println(const String &s) {
- size_t n = print(s);
- n += println();
- return n;
+ return _println(s);
}
size_t Print::println(const char c[]) {
- size_t n = print(c);
- n += println();
- return n;
+ return _println(c);
}
size_t Print::println(char c) {
- size_t n = print(c);
- n += println();
- return n;
+ return _println(c);
}
size_t Print::println(unsigned char b, int base) {
- size_t n = print(b, base);
- n += println();
- return n;
+ return _println(b, base);
}
size_t Print::println(int num, int base) {
- size_t n = print(num, base);
- n += println();
- return n;
+ return _println(num, base);
}
size_t Print::println(unsigned int num, int base) {
- size_t n = print(num, base);
- n += println();
- return n;
+ return _println(num, base);
}
size_t Print::println(long num, int base) {
- size_t n = print(num, base);
- n += println();
- return n;
+ return _println(num, base);
}
size_t Print::println(unsigned long num, int base) {
- size_t n = print(num, base);
- n += println();
- return n;
+ return _println(num, base);
+}
+
+size_t Print::println(long long num, int base) {
+ return _println(num, base);
+}
+
+size_t Print::println(unsigned long long num, int base) {
+ return _println(num, base);
}
size_t Print::println(double num, int digits) {
- size_t n = print(num, digits);
- n += println();
- return n;
+ return _println(num, digits);
}
size_t Print::println(const Printable& x) {
- size_t n = print(x);
- n += println();
- return n;
+ return _println(x);
}
// Private Methods /////////////////////////////////////////////////////////////
-size_t Print::printNumber(unsigned long n, uint8_t base) {
- char buf[8 * sizeof(long) + 1]; // Assumes 8-bit chars plus zero byte.
- char *str = &buf[sizeof(buf) - 1];
+template inline size_t Print::_println(T v, P... args)
+{
+ size_t n = print(v, args...);
+ n += println();
+ return n;
+};
+
+template size_t Print::printNumber(T n, uint8_t base) {
+ char buf[8 * sizeof(n) + 1]; // Assumes 8-bit chars plus zero byte.
+ char* str = &buf[sizeof(buf) - 1];
*str = '\0';
// prevent crash if called with base == 1
- if(base < 2)
+ if (base < 2) {
base = 10;
+ }
do {
- unsigned long m = n;
+ auto m = n;
n /= base;
char c = m - base * n;
+
*--str = c < 10 ? c + '0' : c + 'A' - 10;
- } while(n);
+ } while (n);
return write(str);
}
-size_t Print::printFloat(double number, uint8_t digits) {
- size_t n = 0;
-
- if(isnan(number))
- return print("nan");
- if(isinf(number))
- return print("inf");
- if(number > 4294967040.0)
- return print("ovf"); // constant determined empirically
- if(number < -4294967040.0)
- return print("ovf"); // constant determined empirically
-
- // Handle negative numbers
- if(number < 0.0) {
- n += 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 /= 10.0;
-
- 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;
- n += print(int_part);
-
- // Print the decimal point, but only if there are digits beyond
- if(digits > 0) {
- n += print(".");
- }
-
- // Extract digits from the remainder one at a time
- while(digits-- > 0) {
- remainder *= 10.0;
- int toPrint = int(remainder);
- n += print(toPrint);
- remainder -= toPrint;
- }
-
- return n;
+template<> size_t Print::printNumber(double number, uint8_t digits) {
+ char buf[40];
+ return write(dtostrf(number, 0, digits, buf));
}
diff --git a/cores/esp8266/Print.h b/cores/esp8266/Print.h
index a0df267c1f..67f3ba5502 100644
--- a/cores/esp8266/Print.h
+++ b/cores/esp8266/Print.h
@@ -26,6 +26,8 @@
#include "WString.h"
#include "Printable.h"
+#include "stdlib_noniso.h"
+
#define DEC 10
#define HEX 16
#define OCT 8
@@ -33,17 +35,15 @@
class Print {
private:
- int write_error;
- size_t printNumber(unsigned long, uint8_t);
- size_t printFloat(double, uint8_t);
+ int write_error = 0;
+ template size_t printNumber(T n, uint8_t base);
+ template inline size_t _println(T v, P... args);
protected:
void setWriteError(int err = 1) {
write_error = err;
}
public:
- Print() :
- write_error(0) {
- }
+ Print() {}
int getWriteError() {
return write_error;
@@ -56,14 +56,31 @@ class Print {
size_t write(const char *str) {
if(str == NULL)
return 0;
- return write((const uint8_t *) str, strlen(str));
+ return write((const uint8_t *) str, strlen_P(str));
}
virtual size_t write(const uint8_t *buffer, size_t size);
size_t write(const char *buffer, size_t size) {
return write((const uint8_t *) buffer, size);
}
+ // These handle ambiguity for write(0) case, because (0) can be a pointer or an integer
+ inline size_t write(short t) { return write((uint8_t)t); }
+ inline size_t write(unsigned short t) { return write((uint8_t)t); }
+ inline size_t write(int t) { return write((uint8_t)t); }
+ inline size_t write(unsigned int t) { return write((uint8_t)t); }
+ inline size_t write(long t) { return write((uint8_t)t); }
+ inline size_t write(unsigned long t) { return write((uint8_t)t); }
+ inline size_t write(long long t) { return write((uint8_t)t); }
+ inline size_t write(unsigned long long t) { return write((uint8_t)t); }
+ // Enable write(char) to fall through to write(uint8_t)
+ inline size_t write(char c) { return write((uint8_t) c); }
+ inline size_t write(int8_t c) { return write((uint8_t) c); }
+
+ // default to zero, meaning "a single write may block"
+ // should be overridden by subclasses with buffering
+ virtual int availableForWrite() { return 0; }
size_t printf(const char * format, ...) __attribute__ ((format (printf, 2, 3)));
+ size_t printf_P(PGM_P format, ...) __attribute__((format(printf, 2, 3)));
size_t print(const __FlashStringHelper *);
size_t print(const String &);
size_t print(const char[]);
@@ -73,6 +90,8 @@ class Print {
size_t print(unsigned int, int = DEC);
size_t print(long, int = DEC);
size_t print(unsigned long, int = DEC);
+ size_t print(long long, int = DEC);
+ size_t print(unsigned long long, int = DEC);
size_t print(double, int = 2);
size_t print(const Printable&);
@@ -85,9 +104,22 @@ class Print {
size_t println(unsigned int, int = DEC);
size_t println(long, int = DEC);
size_t println(unsigned long, int = DEC);
+ size_t println(long long, int = DEC);
+ size_t println(unsigned long long, int = DEC);
size_t println(double, int = 2);
size_t println(const Printable&);
size_t println(void);
+
+ // flush():
+ // Empty implementation by default in Print::
+ // should wait for all outgoing characters to be sent, output buffer is empty after this call
+ virtual void flush() { }
+
+ // by default write timeout is possible (outgoing data from network,serial..)
+ // (children can override to false (like String))
+ virtual bool outputCanTimeout () { return true; }
};
+template<> size_t Print::printNumber(double number, uint8_t digits);
+
#endif
diff --git a/cores/esp8266/Schedule.cpp b/cores/esp8266/Schedule.cpp
new file mode 100644
index 0000000000..f6c650fcf9
--- /dev/null
+++ b/cores/esp8266/Schedule.cpp
@@ -0,0 +1,282 @@
+/*
+ Schedule.cpp - Scheduled functions.
+ Copyright (c) 2020 esp8266/Arduino
+
+ This file is part of the esp8266 core for Arduino environment.
+ 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
+#include
+
+#include "Schedule.h"
+#include "PolledTimeout.h"
+#include "interrupts.h"
+#include "coredecls.h"
+
+typedef std::function mSchedFuncT;
+struct scheduled_fn_t
+{
+ scheduled_fn_t* mNext = nullptr;
+ mSchedFuncT mFunc;
+};
+
+static scheduled_fn_t* sFirst = nullptr;
+static scheduled_fn_t* sLast = nullptr;
+static scheduled_fn_t* sUnused = nullptr;
+static int sCount = 0;
+static uint32_t recurrent_max_grain_mS = 0;
+
+typedef std::function mRecFuncT;
+struct recurrent_fn_t
+{
+ recurrent_fn_t* mNext = nullptr;
+ mRecFuncT mFunc;
+ esp8266::polledTimeout::periodicFastUs callNow;
+ std::function alarm = nullptr;
+ recurrent_fn_t(esp8266::polledTimeout::periodicFastUs interval) : callNow(interval) { }
+};
+
+static recurrent_fn_t* rFirst = nullptr;
+static recurrent_fn_t* rLast = nullptr;
+
+// Returns a pointer to an unused sched_fn_t,
+// or if none are available allocates a new one,
+// or nullptr if limit is reached
+IRAM_ATTR // called from ISR
+static scheduled_fn_t* get_fn_unsafe()
+{
+ scheduled_fn_t* result = nullptr;
+ // try to get an item from unused items list
+ if (sUnused)
+ {
+ result = sUnused;
+ sUnused = sUnused->mNext;
+ }
+ // if no unused items, and count not too high, allocate a new one
+ else if (sCount < SCHEDULED_FN_MAX_COUNT)
+ {
+ result = new (std::nothrow) scheduled_fn_t;
+ if (result)
+ ++sCount;
+ }
+ return result;
+}
+
+static void recycle_fn_unsafe(scheduled_fn_t* fn)
+{
+ fn->mFunc = nullptr; // special overload in c++ std lib
+ fn->mNext = sUnused;
+ sUnused = fn;
+}
+
+IRAM_ATTR // (not only) called from ISR
+bool schedule_function(const std::function& fn)
+{
+ if (!fn)
+ return false;
+
+ esp8266::InterruptLock lockAllInterruptsInThisScope;
+
+ scheduled_fn_t* item = get_fn_unsafe();
+ if (!item)
+ return false;
+
+ item->mFunc = fn;
+ item->mNext = nullptr;
+
+ if (sFirst)
+ sLast->mNext = item;
+ else
+ sFirst = item;
+ sLast = item;
+
+ return true;
+}
+
+IRAM_ATTR // (not only) called from ISR
+bool schedule_recurrent_function_us(const std::function& fn,
+ uint32_t repeat_us, const std::function& alarm)
+{
+ assert(repeat_us < decltype(recurrent_fn_t::callNow)::neverExpires); //~26800000us (26.8s)
+
+ if (!fn)
+ return false;
+
+ recurrent_fn_t* item = new (std::nothrow) recurrent_fn_t(repeat_us);
+ if (!item)
+ return false;
+
+ item->mFunc = fn;
+ item->alarm = alarm;
+
+ esp8266::InterruptLock lockAllInterruptsInThisScope;
+
+ if (rLast)
+ {
+ rLast->mNext = item;
+ }
+ else
+ {
+ rFirst = item;
+ }
+ rLast = item;
+
+ // grain needs to be recomputed
+ recurrent_max_grain_mS = 0;
+
+ return true;
+}
+
+uint32_t compute_scheduled_recurrent_grain ()
+{
+ if (recurrent_max_grain_mS == 0)
+ {
+ if (rFirst)
+ {
+ uint32_t recurrent_max_grain_uS = rFirst->callNow.getTimeout();
+ for (auto it = rFirst->mNext; it; it = it->mNext)
+ recurrent_max_grain_uS = std::gcd(recurrent_max_grain_uS, it->callNow.getTimeout());
+ if (recurrent_max_grain_uS)
+ // round to the upper millis
+ recurrent_max_grain_mS = recurrent_max_grain_uS <= 1000? 1: (recurrent_max_grain_uS + 999) / 1000;
+ }
+
+#ifdef DEBUG_ESP_CORE
+ static uint32_t last_grain = 0;
+ if (recurrent_max_grain_mS != last_grain)
+ {
+ ::printf(":rsf %u->%u\n", last_grain, recurrent_max_grain_mS);
+ last_grain = recurrent_max_grain_mS;
+ }
+#endif
+ }
+
+ return recurrent_max_grain_mS;
+}
+
+void run_scheduled_functions()
+{
+ // prevent scheduling of new functions during this run
+ auto stop = sLast;
+ bool done = false;
+ while (sFirst && !done)
+ {
+ done = sFirst == stop;
+
+ sFirst->mFunc();
+
+ {
+ // remove function from stack
+ esp8266::InterruptLock lockAllInterruptsInThisScope;
+
+ auto to_recycle = sFirst;
+
+ // removing rLast
+ if (sLast == sFirst)
+ sLast = nullptr;
+
+ sFirst = sFirst->mNext;
+
+ recycle_fn_unsafe(to_recycle);
+ }
+
+ // scheduled functions might last too long for watchdog etc.
+ // yield() is allowed in scheduled functions, therefore
+ // recursion into run_scheduled_recurrent_functions() is permitted
+ optimistic_yield(100000);
+ }
+}
+
+void run_scheduled_recurrent_functions()
+{
+ esp8266::polledTimeout::periodicFastMs yieldNow(100); // yield every 100ms
+
+ // Note to the reader:
+ // There is no exposed API to remove a scheduled function:
+ // Scheduled functions are removed only from this function, and
+ // its purpose is that it is never called from an interrupt
+ // (always on cont stack).
+
+ auto current = rFirst;
+ if (!current)
+ return;
+
+ static bool fence = false;
+ {
+ // fence is like a mutex but as we are never called from ISR,
+ // locking is useless here. Leaving comment for reference.
+ //esp8266::InterruptLock lockAllInterruptsInThisScope;
+
+ if (fence)
+ // prevent recursive calls from yield()
+ // (even if they are not allowed)
+ return;
+ fence = true;
+ }
+
+ recurrent_fn_t* prev = nullptr;
+ // prevent scheduling of new functions during this run
+ auto stop = rLast;
+
+ bool done;
+ do
+ {
+ done = current == stop;
+ const bool wakeup = current->alarm && current->alarm();
+ bool callNow = current->callNow;
+
+ if ((wakeup || callNow) && !current->mFunc())
+ {
+ // remove function from stack
+ esp8266::InterruptLock lockAllInterruptsInThisScope;
+
+ auto to_ditch = current;
+
+ // removing rLast
+ if (rLast == current)
+ rLast = prev;
+
+ current = current->mNext;
+ if (prev)
+ {
+ prev->mNext = current;
+ }
+ else
+ {
+ rFirst = current;
+ }
+
+ delete(to_ditch);
+
+ // grain needs to be recomputed
+ recurrent_max_grain_mS = 0;
+ }
+ else
+ {
+ prev = current;
+ current = current->mNext;
+ }
+
+ if (yieldNow)
+ {
+ // because scheduled functions might last too long for watchdog etc,
+ // this is yield() in cont stack, but need to call cont_suspend directly
+ // to prevent recursion into run_scheduled_recurrent_functions()
+ esp_schedule();
+ cont_suspend(g_pcont);
+ }
+ } while (current && !done);
+
+ fence = false;
+}
diff --git a/cores/esp8266/Schedule.h b/cores/esp8266/Schedule.h
new file mode 100644
index 0000000000..362d15b5f3
--- /dev/null
+++ b/cores/esp8266/Schedule.h
@@ -0,0 +1,96 @@
+/*
+ Schedule.h - Header file for scheduled functions.
+ Copyright (c) 2020 esp8266/Arduino
+
+ This file is part of the esp8266 core for Arduino environment.
+ 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 ESP_SCHEDULE_H
+#define ESP_SCHEDULE_H
+
+#include
+#include
+
+#define SCHEDULED_FN_MAX_COUNT 32
+
+// The purpose of scheduled functions is to trigger, from SYS stack (like in
+// an interrupt or a system event), registration of user code to be executed
+// in user stack (called CONT stack) without the common restrictions from
+// system context. Details are below.
+
+// The purpose of recurrent scheduled function is to independently execute
+// user code in CONT stack on a regular basis.
+// It has been introduced with ethernet service in mind, it can also be used
+// for all libraries in the need of a regular `libdaemon_handlestuff()`.
+// It allows these services to be run even from a user loop not going back
+// to `loop()`.
+// Ticker + scheduled function offer the same service but recurrent
+// scheduled function happen more often: every yield() (vs every loop()),
+// and time resolution is microsecond (vs millisecond). Details are below.
+
+// compute_scheduled_recurrent_grain() is used by delay() to give a chance to
+// all recurrent functions to run per their timing requirement.
+
+uint32_t compute_scheduled_recurrent_grain ();
+
+// scheduled functions called once:
+//
+// * internal queue is FIFO.
+// * Add the given lambda to a fifo list of lambdas, which is run when
+// `loop` function returns.
+// * Use lambdas to pass arguments to a function, or call a class/static
+// member function.
+// * Please ensure variables or instances used from inside lambda will exist
+// when lambda is later called.
+// * There is no mechanism for cancelling scheduled functions.
+// * `yield` can be called from inside lambdas.
+// * Returns false if the number of scheduled functions exceeds
+// SCHEDULED_FN_MAX_COUNT (or memory shortage).
+// * Run the lambda only once next time.
+// * A scheduled function can schedule a function.
+
+bool schedule_function (const std::function& fn);
+
+// Run all scheduled functions.
+// Use this function if your are not using `loop`,
+// or `loop` does not return on a regular basis.
+
+void run_scheduled_functions();
+
+// recurrent scheduled function:
+//
+// * Internal queue is a FIFO.
+// * Run the lambda periodically about every microseconds until
+// it returns false.
+// * Note that it may be more than microseconds between calls if
+// `yield` is not called frequently, and therefore should not be used for
+// timing critical operations.
+// * Please ensure variables or instances used from inside lambda will exist
+// when lambda is later called.
+// * There is no mechanism for externally cancelling recurrent scheduled
+// functions. However a user function returning false will cancel itself.
+// * Long running operations or yield() or delay() are not allowed in the
+// recurrent function.
+// * If alarm is used, anytime during scheduling when it returns true,
+// any remaining delay from repeat_us is disregarded, and fn is executed.
+
+bool schedule_recurrent_function_us(const std::function& fn,
+ uint32_t repeat_us, const std::function& alarm = nullptr);
+
+// Test recurrence and run recurrent scheduled functions.
+// (internally called at every `yield()` and `loop()`)
+
+void run_scheduled_recurrent_functions();
+
+#endif // ESP_SCHEDULE_H
diff --git a/cores/esp8266/StackThunk.cpp b/cores/esp8266/StackThunk.cpp
new file mode 100644
index 0000000000..baa793bdc5
--- /dev/null
+++ b/cores/esp8266/StackThunk.cpp
@@ -0,0 +1,194 @@
+/*
+ StackThunk.c - Allow use second stack for BearSSL calls
+
+ BearSSL uses a significant amount of stack space, much larger than
+ the default Arduino core stack. These routines handle swapping
+ between a secondary, user-allocated stack on the heap and the real
+ stack.
+
+ Copyright (c) 2017 Earle F. Philhower, III. All rights 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 8 May 2015 by Hristo Gochkov (proper post and file upload handling)
+*/
+
+#include
+#include
+#include
+
+#include "debug.h"
+#include "StackThunk.h"
+
+#include
+#include
+
+#include
+#include
+
+extern "C" {
+
+extern void optimistic_yield(uint32_t);
+
+uint32_t *stack_thunk_ptr = NULL;
+uint32_t *stack_thunk_top = NULL;
+
+uint32_t *stack_thunk_save = NULL; /* Saved A1 while in BearSSL */
+uint32_t *stack_thunk_yield_save = NULL; /* Saved A1 when yielding from within BearSSL */
+
+uint32_t stack_thunk_refcnt = 0;
+
+/* Largest stack usage seen in the wild at 6120 */
+#define _stackSize (6200/4)
+#define _stackPaint 0xdeadbeef
+
+/* Add a reference, and allocate the stack if necessary */
+void stack_thunk_add_ref()
+{
+ stack_thunk_refcnt++;
+ if (stack_thunk_refcnt == 1) {
+ DBG_MMU_PRINTF("\nStackThunk malloc(%u)\n", _stackSize * sizeof(uint32_t));
+ // The stack must be in DRAM, or an Soft WDT will follow. Not sure why,
+ // maybe too much time is consumed with the non32-bit exception handler.
+ // Also, interrupt handling on an IRAM stack would be very slow.
+ // Strings on the stack would be very slow to access as well.
+ HeapSelectDram ephemeral;
+ stack_thunk_ptr = (uint32_t *)malloc(_stackSize * sizeof(uint32_t));
+ DBG_MMU_PRINTF("StackThunk stack_thunk_ptr: %p\n", stack_thunk_ptr);
+ if (!stack_thunk_ptr) {
+ // This is a fatal error, stop the sketch
+ DEBUGV("Unable to allocate BearSSL stack\n");
+ abort();
+ }
+ stack_thunk_top = stack_thunk_ptr + _stackSize - 1;
+ stack_thunk_save = NULL;
+ stack_thunk_repaint();
+ }
+}
+
+/* Drop a reference, and free stack if no more in use */
+void stack_thunk_del_ref()
+{
+ if (stack_thunk_refcnt == 0) {
+ /* Error! */
+ return;
+ }
+ stack_thunk_refcnt--;
+ if (!stack_thunk_refcnt) {
+ free(stack_thunk_ptr);
+ stack_thunk_ptr = NULL;
+ stack_thunk_top = NULL;
+ stack_thunk_save = NULL;
+ }
+}
+
+void stack_thunk_repaint()
+{
+ for (int i=0; i < _stackSize; i++) {
+ stack_thunk_ptr[i] = _stackPaint;
+ }
+}
+
+/* Simple accessor functions used by postmortem */
+uint32_t stack_thunk_get_refcnt() {
+ return stack_thunk_refcnt;
+}
+
+uint32_t stack_thunk_get_stack_top() {
+ return (uint32_t)stack_thunk_top;
+}
+
+uint32_t stack_thunk_get_stack_bot() {
+ return (uint32_t)stack_thunk_ptr;
+}
+
+uint32_t stack_thunk_get_cont_sp() {
+ return (uint32_t)stack_thunk_save;
+}
+
+/* Return the number of bytes ever used since the stack was created */
+uint32_t stack_thunk_get_max_usage()
+{
+ uint32_t cnt = 0;
+
+ /* No stack == no usage by definition! */
+ if (!stack_thunk_ptr) {
+ return 0;
+ }
+
+ for (cnt=0; (cnt < _stackSize) && (stack_thunk_ptr[cnt] == _stackPaint); cnt++) {
+ /* Noop, all work done in for() */
+ }
+ return 4 * (_stackSize - cnt);
+}
+
+/* Print the stack from the first used 16-byte chunk to the top, decodable by the exception decoder */
+void stack_thunk_dump_stack()
+{
+ uint32_t *pos = stack_thunk_ptr;
+ while (pos < stack_thunk_top) {
+ if ((pos[0] != _stackPaint) || (pos[1] != _stackPaint) || (pos[2] != _stackPaint) || (pos[3] != _stackPaint))
+ break;
+ pos += 4;
+ }
+ ets_printf(">>>stack>>>\n");
+ while (pos < stack_thunk_top) {
+ ets_printf("%08x: %08x %08x %08x %08x\n", (int32_t)pos, pos[0], pos[1], pos[2], pos[3]);
+ pos += 4;
+ }
+ ets_printf("<< cont stacks */
+ "movi a2, stack_thunk_yield_save\n\t"
+ "s32i.n a1, a2, 0\n\t"
+ "movi a2, stack_thunk_save\n\t"
+ "l32i.n a1, a2, 0\n\t"
+/* optimistic_yield(10000) without extra l32r */
+ "movi a2, 0x10\n\t"
+ "addmi a2, a2, 0x2700\n\t"
+ "call0 optimistic_yield\n\t"
+/* Swap bearssl <-> cont stacks, again */
+ "movi a2, stack_thunk_yield_save\n\t"
+ "l32i.n a1, a2, 0\n\t"
+ "\n"
+/* Restore caller */
+ "l32i.n a0, a1, 12\n\t"
+ "addi a1, a1, 16\n\t"
+ "ret.n\n\t"
+ ".size stack_thunk_yield, .-stack_thunk_yield\n\t"
+);
+
+}
diff --git a/cores/esp8266/StackThunk.h b/cores/esp8266/StackThunk.h
new file mode 100644
index 0000000000..350775ec24
--- /dev/null
+++ b/cores/esp8266/StackThunk.h
@@ -0,0 +1,94 @@
+/*
+ StackThunk.h - Allow use second stack for BearSSL calls
+
+ BearSSL uses a significant amount of stack space, much larger than
+ the default Arduino core stack. These routines handle swapping
+ between a secondary, user-allocated stack on the heap and the real
+ stack.
+
+ Copyright (c) 2017 Earle F. Philhower, III. All rights 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 8 May 2015 by Hristo Gochkov (proper post and file upload handling)
+*/
+
+#ifndef _STACKTHUNK_H
+#define _STACKTHUNK_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern void stack_thunk_yield(void);
+
+extern void stack_thunk_add_ref();
+extern void stack_thunk_del_ref();
+extern void stack_thunk_repaint();
+
+extern uint32_t stack_thunk_get_refcnt();
+extern uint32_t stack_thunk_get_stack_top();
+extern uint32_t stack_thunk_get_stack_bot();
+extern uint32_t stack_thunk_get_cont_sp();
+extern uint32_t stack_thunk_get_max_usage();
+extern void stack_thunk_dump_stack();
+extern void stack_thunk_fatal_smashing();
+
+// Globals required for thunking operation
+extern uint32_t *stack_thunk_ptr;
+extern uint32_t *stack_thunk_top;
+extern uint32_t *stack_thunk_save;
+extern uint32_t stack_thunk_refcnt;
+
+// Thunking macro
+#define make_stack_thunk(fcnToThunk) \
+__asm__ ("\n\
+.text\n\
+.literal_position\n\
+.literal .LC_STACK_VALUE"#fcnToThunk", 0xdeadbeef\n\
+\n\
+.text\n\
+.global thunk_"#fcnToThunk"\n\
+.type thunk_"#fcnToThunk", @function\n\
+.align 4\n\
+thunk_"#fcnToThunk":\n\
+ addi a1, a1, -16 /* Allocate space for saved registers on stack */\n\
+ s32i a0, a1, 12 /* Store A0, trounced by calls */\n\
+ s32i a15, a1, 8 /* Store A15 (our temporary one) */\n\
+ movi a15, stack_thunk_save /* Store A1(SP) in temp space */\n\
+ s32i a1, a15, 0\n\
+ movi a15, stack_thunk_top /* Load A1(SP) with thunk stack */\n\
+ l32i.n a1, a15, 0\n\
+ call0 "#fcnToThunk" /* Do the call */\n\
+ /* Check the stack canary wasn't overwritten */\n\
+ movi a15, stack_thunk_ptr\n\
+ l32i.n a15, a15, 0 /* A15 now has the pointer to stack end*/ \n\
+ l32i.n a15, a15, 0 /* A15 now has contents of last stack entry */\n\
+ l32r a0, .LC_STACK_VALUE"#fcnToThunk" /* A0 now has the check value */\n\
+ beq a0, a15, .L1"#fcnToThunk"\n\
+ call0 stack_thunk_fatal_smashing\n\
+.L1"#fcnToThunk":\n\
+ movi a15, stack_thunk_save /* Restore A1(SP) */\n\
+ l32i.n a1, a15, 0\n\
+ l32i.n a15, a1, 8 /* Restore the saved registers */\n\
+ l32i.n a0, a1, 12\n\
+ addi a1, a1, 16 /* Free up stack and return to caller */\n\
+ ret\n\
+.size thunk_"#fcnToThunk", . - thunk_"#fcnToThunk"\n");
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/cores/esp8266/Stream.cpp b/cores/esp8266/Stream.cpp
index a29388b2bf..b9b5b95f65 100644
--- a/cores/esp8266/Stream.cpp
+++ b/cores/esp8266/Stream.cpp
@@ -22,6 +22,7 @@
#include
#include
+
#define PARSE_TIMEOUT 1000 // default number of milli-seconds to wait
#define NO_SKIP_CHAR 1 // a magic char not found in a valid ASCII numeric field
@@ -33,6 +34,8 @@ int Stream::timedRead() {
c = read();
if(c >= 0)
return c;
+ if(_timeout == 0)
+ return -1;
yield();
} while(millis() - _startMillis < _timeout);
return -1; // -1 indicates timeout
@@ -46,6 +49,8 @@ int Stream::timedPeek() {
c = peek();
if(c >= 0)
return c;
+ if(_timeout == 0)
+ return -1;
yield();
} while(millis() - _startMillis < _timeout);
return -1; // -1 indicates timeout
@@ -53,16 +58,16 @@ int Stream::timedPeek() {
// returns peek of the next digit in the stream or -1 if timeout
// discards non-numeric characters
-int Stream::peekNextDigit() {
+int Stream::peekNextDigit(bool detectDecimal) {
int c;
while(1) {
c = timedPeek();
- if(c < 0)
- return c; // timeout
- if(c == '-')
- return c;
- if(c >= '0' && c <= '9')
+ if( c < 0 || // timeout
+ c == '-' ||
+ ( c >= '0' && c <= '9' ) ||
+ ( detectDecimal && c == '.' ) ) {
return c;
+ }
read(); // discard non-numeric
}
}
@@ -136,14 +141,14 @@ long Stream::parseInt(char skipChar) {
long value = 0;
int c;
- c = peekNextDigit();
+ c = peekNextDigit(false);
// ignore non numeric leading characters
if(c < 0)
return 0; // zero returned if timeout
do {
if(c == skipChar)
- ; // ignore this charactor
+ ; // ignore this character
else if(c == '-')
isNegative = true;
else if(c >= '0' && c <= '9') // is c a digit?
@@ -169,9 +174,9 @@ float Stream::parseFloat(char skipChar) {
boolean isFraction = false;
long value = 0;
int c;
- float fraction = 1.0;
+ float fraction = 1.0f;
- c = peekNextDigit();
+ c = peekNextDigit(true);
// ignore non numeric leading characters
if(c < 0)
return 0; // zero returned if timeout
@@ -186,7 +191,7 @@ float Stream::parseFloat(char skipChar) {
else if(c >= '0' && c <= '9') { // is c a digit?
value = value * 10 + c - '0';
if(isFraction)
- fraction *= 0.1;
+ fraction *= 0.1f;
}
read(); // consume the character we got with peek
c = timedPeek();
@@ -206,6 +211,8 @@ float Stream::parseFloat(char skipChar) {
// the buffer is NOT null terminated.
//
size_t Stream::readBytes(char *buffer, size_t length) {
+ IAMSLOW();
+
size_t count = 0;
while(count < length) {
int c = timedRead();
@@ -255,3 +262,45 @@ String Stream::readStringUntil(char terminator) {
return ret;
}
+String Stream::readStringUntil(const char* terminator, uint32_t untilTotalNumberOfOccurrences) {
+ String ret;
+ int c;
+ uint32_t occurrences = 0;
+ size_t termLen = strlen(terminator);
+ size_t termIndex = 0;
+ size_t index = 0;
+
+ while ((c = timedRead()) > 0) {
+ ret += (char) c;
+ index++;
+
+ if (terminator[termIndex] == c) {
+ if (++termIndex == termLen && ++occurrences == untilTotalNumberOfOccurrences) {
+ // don't include terminator in returned string
+ ret.remove(index - termIndex, termLen);
+ break;
+ }
+ } else {
+ termIndex = 0;
+ }
+ }
+
+ return ret;
+}
+
+// read what can be read, immediate exit on unavailable data
+// prototype similar to Arduino's `int Client::read(buf, len)`
+int Stream::read (uint8_t* buffer, size_t maxLen)
+{
+ IAMSLOW();
+
+ size_t nbread = 0;
+ while (nbread < maxLen && available())
+ {
+ int c = read();
+ if (c == -1)
+ break;
+ buffer[nbread++] = c;
+ }
+ return nbread;
+}
diff --git a/cores/esp8266/Stream.h b/cores/esp8266/Stream.h
index 6d2646d77c..0706bec001 100644
--- a/cores/esp8266/Stream.h
+++ b/cores/esp8266/Stream.h
@@ -22,10 +22,13 @@
#ifndef Stream_h
#define Stream_h
+#include
#include
-#include "Print.h"
+#include
+#include
+#include // ssize_t
-// compatability macros for testing
+// compatibility macros for testing
/*
#define getInt() parseInt()
#define getInt(skipChar) parseInt(skipchar)
@@ -35,27 +38,35 @@
readBytesBetween( pre_string, terminator, buffer, length)
*/
+// Arduino `Client: public Stream` class defines `virtual int read(uint8_t *buf, size_t size) = 0;`
+// This function is now imported into `Stream::` for `Stream::send*()`.
+// Other classes inheriting from `Stream::` and implementing `read(uint8_t *buf, size_t size)`
+// must consequently use `int` as return type, namely Hardware/SoftwareSerial, FileSystems...
+#define STREAM_READ_RETURNS_INT 1
+
+// Stream::send API is present
+#define STREAMSEND_API 1
+
class Stream: public Print {
protected:
- unsigned long _timeout; // number of milliseconds to wait for the next char before aborting timed read
+ unsigned long _timeout = 1000; // number of milliseconds to wait for the next char before aborting timed read
unsigned long _startMillis; // used for timeout measurement
int timedRead(); // private method to read stream with timeout
int timedPeek(); // private method to peek stream with timeout
- int peekNextDigit(); // returns the next numeric digit in the stream or -1 if timeout
+ int peekNextDigit(bool detectDecimal = false); // returns the next numeric digit in the stream or -1 if timeout
public:
virtual int available() = 0;
virtual int read() = 0;
virtual int peek() = 0;
- virtual void flush() = 0;
- Stream() {
- _timeout = 1000;
- }
+ Stream() {}
+ virtual ~Stream() {}
// parsing methods
void setTimeout(unsigned long timeout); // sets maximum milliseconds to wait for stream data, default is 1 second
+ unsigned long getTimeout () const { return _timeout; }
bool find(const char *target); // reads data from the stream until the target string is found
bool find(uint8_t *target) {
@@ -102,15 +113,152 @@ class Stream: public Print {
// returns the number of characters placed in the buffer (0 means no valid data found)
// Arduino String functions to be added here
- String readString();
+ virtual String readString();
String readStringUntil(char terminator);
+ String readStringUntil(const char* terminator, uint32_t untilTotalNumberOfOccurrences = 1);
+
+ virtual int read (uint8_t* buffer, size_t len);
+ int read (char* buffer, size_t len) { return read((uint8_t*)buffer, len); }
+
+ //////////////////// extension: direct access to input buffer
+ // to provide when possible a pointer to available data for read
+
+ // informs user and ::to*() on effective buffered peek API implementation
+ // by default: not available
+ virtual bool hasPeekBufferAPI () const { return false; }
+
+ // returns number of byte accessible by peekBuffer()
+ virtual size_t peekAvailable () { return 0; }
+
+ // returns a pointer to available data buffer (size = peekAvailable())
+ // semantic forbids any kind of ::read()
+ // - after calling peekBuffer()
+ // - and before calling peekConsume()
+ virtual const char* peekBuffer () { return nullptr; }
+
+ // consumes bytes after peekBuffer() use
+ // (then ::read() is allowed)
+ virtual void peekConsume (size_t consume) { (void)consume; }
+
+ // by default read timeout is possible (incoming data from network,serial..)
+ // children can override to false (like String::)
+ virtual bool inputCanTimeout () { return true; }
+
+ // (outputCanTimeout() is defined in Print::)
+
+ ////////////////////////
+ //////////////////// extensions: Streaming streams to streams
+ // Stream::send*()
+ //
+ // Stream::send*() uses 1-copy transfers when peekBuffer API is
+ // available, or makes a regular transfer through a temporary buffer.
+ //
+ // - for efficiency, Stream classes should implement peekAPI when
+ // possible
+ // - for an efficient timeout management, Print/Stream classes
+ // should implement {output,input}CanTimeout()
+
+ using oneShotMs = esp8266::polledTimeout::oneShotFastMs;
+ static constexpr int temporaryStackBufferSize = 64;
+
+ // ::send*() methods:
+ // - always stop before timeout when "no-more-input-possible-data"
+ // or "no-more-output-possible-data" condition is met
+ // - always return number of transferred bytes
+ // When result is 0 or less than requested maxLen, Print::getLastSend()
+ // contains an error reason.
+
+#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+
+ // transfers already buffered / immediately available data (no timeout)
+ // returns number of transferred bytes
+ [[deprecated]] size_t sendAvailable (Print* to) { return sendGeneric(to, -1, -1, oneShotMs::alwaysExpired); }
+ [[deprecated]] size_t sendAvailable (Print& to) { return sendAvailable(&to); }
+
+ // transfers data until timeout
+ // returns number of transferred bytes
+ [[deprecated]] size_t sendAll (Print* to, const oneShotMs::timeType timeoutMs = oneShotMs::neverExpires) { return sendGeneric(to, -1, -1, timeoutMs); }
+ [[deprecated]] size_t sendAll (Print& to, const oneShotMs::timeType timeoutMs = oneShotMs::neverExpires) { return sendAll(&to, timeoutMs); }
+
+ // transfers data until a char is encountered (the char is swallowed but not transferred) with timeout
+ // returns number of transferred bytes
+ [[deprecated]] size_t sendUntil (Print* to, const int readUntilChar, const oneShotMs::timeType timeoutMs = oneShotMs::neverExpires) { return sendGeneric(to, -1, readUntilChar, timeoutMs); }
+ [[deprecated]] size_t sendUntil (Print& to, const int readUntilChar, const oneShotMs::timeType timeoutMs = oneShotMs::neverExpires) { return sendUntil(&to, readUntilChar, timeoutMs); }
+
+ // transfers data until requested size or timeout
+ // returns number of transferred bytes
+ [[deprecated]] size_t sendSize (Print* to, const ssize_t maxLen, const oneShotMs::timeType timeoutMs = oneShotMs::neverExpires) { return sendGeneric(to, maxLen, -1, timeoutMs); }
+ [[deprecated]] size_t sendSize (Print& to, const ssize_t maxLen, const oneShotMs::timeType timeoutMs = oneShotMs::neverExpires) { return sendSize(&to, maxLen, timeoutMs); }
+
+#pragma GCC diagnostic pop
+
+ // transfers already buffered / immediately available data (no timeout)
+ // returns number of transferred bytes
+ size_t sendAvailable (Stream* to) { return sendGeneric(to, -1, -1, oneShotMs::alwaysExpired); }
+ size_t sendAvailable (Stream& to) { return sendAvailable(&to); }
+ size_t sendAvailable (Stream&& to) { return sendAvailable(&to); }
+
+ // transfers data until timeout
+ // returns number of transferred bytes
+ size_t sendAll (Stream* to, const oneShotMs::timeType timeoutMs = oneShotMs::neverExpires) { return sendGeneric(to, -1, -1, timeoutMs); }
+ size_t sendAll (Stream& to, const oneShotMs::timeType timeoutMs = oneShotMs::neverExpires) { return sendAll(&to, timeoutMs); }
+ size_t sendAll (Stream&& to, const oneShotMs::timeType timeoutMs = oneShotMs::neverExpires) { return sendAll(&to, timeoutMs); }
+
+ // transfers data until a char is encountered (the char is swallowed but not transferred) with timeout
+ // returns number of transferred bytes
+ size_t sendUntil (Stream* to, const int readUntilChar, const oneShotMs::timeType timeoutMs = oneShotMs::neverExpires) { return sendGeneric(to, -1, readUntilChar, timeoutMs); }
+ size_t sendUntil (Stream& to, const int readUntilChar, const oneShotMs::timeType timeoutMs = oneShotMs::neverExpires) { return sendUntil(&to, readUntilChar, timeoutMs); }
+ size_t sendUntil (Stream&& to, const int readUntilChar, const oneShotMs::timeType timeoutMs = oneShotMs::neverExpires) { return sendUntil(&to, readUntilChar, timeoutMs); }
+
+ // transfers data until requested size or timeout
+ // returns number of transferred bytes
+ size_t sendSize (Stream* to, const ssize_t maxLen, const oneShotMs::timeType timeoutMs = oneShotMs::neverExpires) { return sendGeneric(to, maxLen, -1, timeoutMs); }
+ size_t sendSize (Stream& to, const ssize_t maxLen, const oneShotMs::timeType timeoutMs = oneShotMs::neverExpires) { return sendSize(&to, maxLen, timeoutMs); }
+ size_t sendSize (Stream&& to, const ssize_t maxLen, const oneShotMs::timeType timeoutMs = oneShotMs::neverExpires) { return sendSize(&to, maxLen, timeoutMs); }
+
+ // remaining size (-1 by default = unknown)
+ virtual ssize_t streamRemaining () { return -1; }
+
+ enum class Report
+ {
+ Success = 0,
+ TimedOut,
+ ReadError,
+ WriteError,
+ ShortOperation,
+ };
+
+ Report getLastSendReport () const { return _sendReport; }
+
+ protected:
+ [[deprecated]]
+ size_t sendGeneric (Print* to,
+ const ssize_t len = -1,
+ const int readUntilChar = -1,
+ oneShotMs::timeType timeoutMs = oneShotMs::neverExpires /* neverExpires=>getTimeout() */);
+
+ size_t sendGeneric (Stream* to,
+ const ssize_t len = -1,
+ const int readUntilChar = -1,
+ oneShotMs::timeType timeoutMs = oneShotMs::neverExpires /* neverExpires=>getTimeout() */);
+
+ size_t SendGenericPeekBuffer(Print* to, const ssize_t len, const int readUntilChar, const oneShotMs::timeType timeoutMs);
+ size_t SendGenericRegularUntil(Print* to, const ssize_t len, const int readUntilChar, const oneShotMs::timeType timeoutMs);
+ size_t SendGenericRegular(Print* to, const ssize_t len, const oneShotMs::timeType timeoutMs);
+
+ void setReport (Report report) { _sendReport = report; }
+
+ private:
+
+ Report _sendReport = Report::Success;
+
+ //////////////////// end of extensions
protected:
- long parseInt(char skipChar); // as above but the given skipChar is ignored
- // as above but the given skipChar is ignored
+ long parseInt(char skipChar); // as parseInt() but the given skipChar is ignored
// this allows format characters (typically commas) in values to be ignored
- float parseFloat(char skipChar); // as above but the given skipChar is ignored
+ float parseFloat(char skipChar); // as parseFloat() but the given skipChar is ignored
};
#endif
diff --git a/cores/esp8266/StreamDev.h b/cores/esp8266/StreamDev.h
new file mode 100644
index 0000000000..2aeee4c87a
--- /dev/null
+++ b/cores/esp8266/StreamDev.h
@@ -0,0 +1,251 @@
+/*
+ StreamDev.h - Stream helpers
+ Copyright (c) 2019 David Gauchard. 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 __STREAMDEV_H
+#define __STREAMDEV_H
+
+#include
+#include
+#include
+
+///////////////////////////////////////////////
+// /dev/null
+// - black hole as output, swallow everything, availableForWrite = infinite
+// - black hole as input, nothing to read, available = 0
+
+class StreamNull: public Stream
+{
+public:
+
+ // Print
+ virtual size_t write(uint8_t) override
+ {
+ return 1;
+ }
+
+ virtual size_t write(const uint8_t* buffer, size_t size) override
+ {
+ (void)buffer;
+ (void)size;
+ return size;
+ }
+
+ virtual int availableForWrite() override
+ {
+ return std::numeric_limits::max();
+ }
+
+ // Stream
+ virtual int available() override
+ {
+ return 0;
+ }
+
+ virtual int read() override
+ {
+ return -1;
+ }
+
+ virtual int peek() override
+ {
+ return -1;
+ }
+
+ virtual size_t readBytes(char* buffer, size_t len) override
+ {
+ (void)buffer;
+ (void)len;
+ return 0;
+ }
+
+ virtual int read(uint8_t* buffer, size_t len) override
+ {
+ (void)buffer;
+ (void)len;
+ return 0;
+ }
+
+ virtual bool outputCanTimeout() override
+ {
+ return false;
+ }
+
+ virtual bool inputCanTimeout() override
+ {
+ return false;
+ }
+
+ virtual ssize_t streamRemaining() override
+ {
+ return 0;
+ }
+};
+
+///////////////////////////////////////////////
+// /dev/zero
+// - black hole as output, swallow everything, availableForWrite = infinite
+// - big bang as input, gives infinity to read, available = infinite
+
+class StreamZero: public StreamNull
+{
+protected:
+
+ char _zero;
+
+public:
+
+ StreamZero(char zero = 0): _zero(zero) { }
+
+ // Stream
+ virtual int available() override
+ {
+ return std::numeric_limits::max();
+ }
+
+ virtual int read() override
+ {
+ return _zero;
+ }
+
+ virtual int peek() override
+ {
+ return _zero;
+ }
+
+ virtual size_t readBytes(char* buffer, size_t len) override
+ {
+ memset(buffer, _zero, len);
+ return len;
+ }
+
+ virtual int read(uint8_t* buffer, size_t len) override
+ {
+ memset((char*)buffer, _zero, len);
+ return len;
+ }
+
+ virtual ssize_t streamRemaining() override
+ {
+ return std::numeric_limits::max();
+ }
+};
+
+///////////////////////////////////////////////
+// static buffer (in flash or ram)
+// - black hole as output, swallow everything, availableForWrite = infinite
+// - Stream buffer out as input, resettable
+
+class StreamConstPtr: public StreamNull
+{
+protected:
+ const char* _buffer;
+ size_t _size;
+ bool _byteAddressable;
+ size_t _peekPointer = 0;
+
+public:
+ StreamConstPtr(const String&& string) = delete; // prevents passing String temporary, use ctor(buffer,size) if you know what you are doing
+ StreamConstPtr(const String& string): _buffer(string.c_str()), _size(string.length()), _byteAddressable(true) { }
+ StreamConstPtr(const char* buffer, size_t size): _buffer(buffer), _size(size), _byteAddressable(__byteAddressable(buffer)) { }
+ StreamConstPtr(const uint8_t* buffer, size_t size): _buffer((const char*)buffer), _size(size), _byteAddressable(__byteAddressable(buffer)) { }
+ StreamConstPtr(const __FlashStringHelper* buffer, size_t size): _buffer(reinterpret_cast(buffer)), _size(size), _byteAddressable(false) { }
+ StreamConstPtr(const __FlashStringHelper* text): _buffer(reinterpret_cast(text)), _size(strlen_P((PGM_P)text)), _byteAddressable(false) { }
+
+ void resetPointer(int pointer = 0)
+ {
+ _peekPointer = pointer;
+ }
+
+ // Stream
+ virtual int available() override
+ {
+ return peekAvailable();
+ }
+
+ virtual int read() override
+ {
+ // valid with dram, iram and flash
+ return _peekPointer < _size ? pgm_read_byte(&_buffer[_peekPointer++]) : -1;
+ }
+
+ virtual int peek() override
+ {
+ // valid with dram, iram and flash
+ return _peekPointer < _size ? pgm_read_byte(&_buffer[_peekPointer]) : -1;
+ }
+
+ virtual size_t readBytes(char* buffer, size_t len) override
+ {
+ if (_peekPointer >= _size)
+ {
+ return 0;
+ }
+ size_t cpylen = std::min(_size - _peekPointer, len);
+ memcpy_P(buffer, _buffer + _peekPointer, cpylen); // whether byte adressible is true
+ _peekPointer += cpylen;
+ return cpylen;
+ }
+
+ virtual int read(uint8_t* buffer, size_t len) override
+ {
+ return readBytes((char*)buffer, len);
+ }
+
+ virtual ssize_t streamRemaining() override
+ {
+ return _size;
+ }
+
+ // peekBuffer
+ virtual bool hasPeekBufferAPI() const override
+ {
+ return _byteAddressable;
+ }
+
+ virtual size_t peekAvailable() override
+ {
+ return _peekPointer < _size ? _size - _peekPointer : 0;
+ }
+
+ virtual const char* peekBuffer() override
+ {
+ return _peekPointer < _size ? _buffer + _peekPointer : nullptr;
+ }
+
+ virtual void peekConsume(size_t consume) override
+ {
+ _peekPointer += consume;
+ }
+};
+
+///////////////////////////////////////////////
+
+Stream& operator << (Stream& out, String& string);
+Stream& operator << (Stream& out, Stream& stream);
+Stream& operator << (Stream& out, StreamString& stream);
+Stream& operator << (Stream& out, const char* text);
+Stream& operator << (Stream& out, const __FlashStringHelper* text);
+
+///////////////////////////////////////////////
+
+#if !defined(NO_GLOBAL_INSTANCES) && !defined(NO_GLOBAL_STREAMDEV)
+extern StreamNull devnull;
+#endif
+
+#endif // __STREAMDEV_H
diff --git a/cores/esp8266/StreamSend.cpp b/cores/esp8266/StreamSend.cpp
new file mode 100644
index 0000000000..b46d1c1560
--- /dev/null
+++ b/cores/esp8266/StreamSend.cpp
@@ -0,0 +1,402 @@
+/*
+ StreamDev.cpp - 1-copy transfer related methods
+ Copyright (c) 2019 David Gauchard. 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
+
+ parsing functions based on TextFinder library by Michael Margolis
+*/
+
+#include
+#include