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 a7bcd54c23..6413393ea9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,15 +3,9 @@ tools/dist/
tools/xtensa-lx106-elf/
tools/mkspiffs/
tools/mklittlefs/
-tools/python/
tools/python3/
package/versions/
exclude.txt
-tools/sdk/lib/liblwip_src.a
-tools/sdk/lwip/src/build
-tools/sdk/lwip/src/liblwip_src.a
-tools/sdk/ld/backup
-tools/sdk/ld/eagle.app.v6.common.ld
tests/hosts/lcov/
diff --git a/.gitmodules b/.gitmodules
index ca26e7d93b..ae42999675 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -19,3 +19,9 @@
[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 7c50c68de9..0000000000
--- a/.travis.yml
+++ /dev/null
@@ -1,158 +0,0 @@
-language: bash
-os: linux
-dist: bionic
-
-git:
- depth: 1
- submodules: false
-
-before_install:
- - git submodule update --init # no recursive update
-
-cache:
- directories:
- - $HOME/astyle
-
-stages:
- - build
- - deploy
-
-jobs:
- include:
- # Build stage. To save time, run all kinds of builds and tests in parallel.
-
- - name: "Platformio (1)"
- stage: build
- script: $TRAVIS_BUILD_DIR/tests/platformio.sh
- env:
- - BUILD_PARITY=even
- - name: "Platformio (2)"
- stage: build
- script: $TRAVIS_BUILD_DIR/tests/platformio.sh
- env:
- - BUILD_PARITY=odd
-
- - name: "Build (1)"
- stage: build
- script: $TRAVIS_BUILD_DIR/tests/build.sh
- env:
- - BUILD_PARITY=even
- - name: "Build (2)"
- stage: build
- script: $TRAVIS_BUILD_DIR/tests/build.sh
- env:
- - BUILD_PARITY=odd
-
- - name: "Debug (1)"
- stage: build
- script: $TRAVIS_BUILD_DIR/tests/debug.sh
- env:
- - BUILD_PARITY=even
- - name: "Debug (2)"
- stage: build
- script: $TRAVIS_BUILD_DIR/tests/debug.sh
- env:
- - BUILD_PARITY=odd
-
- - name: "Build IPv6 (1)"
- stage: build
- script: $TRAVIS_BUILD_DIR/tests/build6.sh
- env:
- - BUILD_PARITY=even
- - name: "Build IPv6 (2)"
- stage: build
- script: $TRAVIS_BUILD_DIR/tests/build6.sh
- env:
- - BUILD_PARITY=odd
-
- - name: "Build lwIP-v1.4 (1)"
- stage: build
- script: $TRAVIS_BUILD_DIR/tests/build1.sh
- env:
- - BUILD_PARITY=even
- - name: "Build lwIP-v1.4 (2)"
- stage: build
- script: $TRAVIS_BUILD_DIR/tests/build1.sh
- env:
- - BUILD_PARITY=odd
-
- - name: "Host tests"
- stage: build
- script: $TRAVIS_BUILD_DIR/tests/ci/host_test.sh
- install:
- - sudo apt-get install valgrind lcov
-
- - name: "Docs"
- stage: build
- script: $TRAVIS_BUILD_DIR/tests/ci/build_docs.sh
- install:
- - sudo apt-get install python3-pip python3-setuptools
- - pip3 install --user -r doc/requirements.txt;
-
- - name: "Style check"
- stage: build
- script: $TRAVIS_BUILD_DIR/tests/ci/style_check.sh
- install: tests/ci/install_astyle.sh
-
- - name: "Mock trivial test"
- stage: build
- script: $TRAVIS_BUILD_DIR/tests/buildm.sh
-
- - name: "Mac OSX can build sketches"
- os: osx
- stage: build
- script: $TRAVIS_BUILD_DIR/tests/build.sh
- env: MACOSX=1 BUILD_PARITY=custom mod=500 rem=1
-
- - name: "Windows can build sketches"
- os: windows
- stage: build
- script: $TRAVIS_BUILD_DIR/tests/build.sh
- env: WINDOWS=1 BUILD_PARITY=custom mod=500 rem=1
-
- - name: "Boards"
- stage: build
- script: $TRAVIS_BUILD_DIR/tests/ci/build_boards.sh
-
- # Deploy stage.
- # Here we build the package JSON (always) and do the deployments
- - name: "Package / deploy"
- stage: deploy
- script: tests/ci/build_package.sh
- env: BUILD_TYPE=package
- before_deploy: git submodule update --init
- deploy:
- # Create Github release, upload artifacts
- - provider: releases
- draft: true
- skip_cleanup: true
- api_key:
- secure: kYsxX/N21fwLSTLpbb0c96PnQHn1CIMqZstm02hfUhCX83FygWSh4vs3gzW28DMpjQMZ6vC4g+jtfosYU2tUhht/bynurDH4edpEyGeMyK+fzCI9pAr4JT0RbKQI84EC18ScpgP/UP0jTc1LJ+xl8UMwSiDE0mzHx7xJ4mMNQbA=
- file_glob: true
- tag_name: $TRAVIS_TAG
- target_commitish: $TRAVIS_COMMIT
- file:
- - package/versions/$TRAVIS_TAG/esp8266-$TRAVIS_TAG.zip
- - package/versions/$TRAVIS_TAG/package_esp8266com_index.json
- on:
- repo: esp8266/Arduino
- tags: true
-
- # Update the package index URL to point to the new version
- - provider: script
- skip_cleanup: true
- script: bash package/deploy_package_index.sh
- on:
- repo: esp8266/Arduino
- tags: true
-
-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/README.md b/README.md
index 22a12463a3..21ec6ef397 100644
--- a/README.md
+++ b/README.md
@@ -3,7 +3,7 @@ Arduino core for ESP8266 WiFi chip
# Quick links
-- [Latest release documentation](https://arduino-esp8266.readthedocs.io/en/2.5.2/)
+- [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))
@@ -28,39 +28,38 @@ ESP8266 Arduino core comes with libraries to communicate over WiFi using TCP and
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 the current upstream Arduino IDE at the 1.8.7 level or later. The current version is on the [Arduino website](https://www.arduino.cc/en/main/software).
-- Start Arduino and open the Preferences window.
-- Enter ```https://arduino.esp8266.com/stable/package_esp8266com_index.json``` into the *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).
#### Latest release [](https://github.com/esp8266/Arduino/releases/latest/)
Boards manager link: `https://arduino.esp8266.com/stable/package_esp8266com_index.json`
-Documentation: [https://arduino-esp8266.readthedocs.io/en/2.5.2/](https://arduino-esp8266.readthedocs.io/en/2.5.2/)
+Documentation: [https://arduino-esp8266.readthedocs.io/en/3.1.2/](https://arduino-esp8266.readthedocs.io/en/3.1.2/)
### Using git version
-[](https://travis-ci.org/esp8266/Arduino)
Also known as latest git or master branch.
-- Install the current upstream Arduino IDE at the 1.8 level or later. The current version is on the [Arduino website](https://www.arduino.cc/en/main/software).
-- Follow the [instructions in the documentation](https://arduino-esp8266.readthedocs.io/en/latest/installing.html#using-git-version).
+- 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](https://platformio.org?utm_source=github&utm_medium=arduino-esp8266) is an open source ecosystem for IoT
+[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?](https://docs.platformio.org/en/latest/what-is-platformio.html?utm_source=github&utm_medium=arduino-esp8266)
-- [PlatformIO IDE](https://platformio.org/platformio-ide?utm_source=github&utm_medium=arduino-esp8266)
-- [PlatformIO Core](https://docs.platformio.org/en/latest/core.html?utm_source=github&utm_medium=arduino-esp8266) (command line tool)
-- [Advanced usage](https://docs.platformio.org/en/latest/platforms/espressif8266.html?utm_source=github&utm_medium=arduino-esp8266) -
+- [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=github&utm_medium=arduino-esp8266) -
+- [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=github&utm_medium=arduino-esp8266#examples)
+- [Project Examples](https://docs.platformio.org/en/latest/platforms/espressif8266.html?utm_source=arduino-esp8266#examples)
### Building with make
@@ -73,7 +72,7 @@ Documentation for latest development version: https://arduino-esp8266.readthedoc
### Issues and support ###
-[ESP8266 Community Forum](https://www.esp8266.com/u/arduinoanswers) is a well-established community for questions and answers about Arduino for ESP8266. 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.
+[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)
@@ -96,7 +95,7 @@ For minor fixes of code and documentation, please go ahead and submit a pull req
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 by opening an issue 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.
@@ -106,9 +105,9 @@ 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.
@@ -118,8 +117,20 @@ ESP8266 core files are licensed under LGPL.
[SoftwareSerial](https://github.com/plerup/espsoftwareserial) library and examples written by Peter Lerup. Distributed under LGPL 2.1.
-[axTLS](http://axtls.sourceforge.net/) library written by Cameron Rich, built from https://github.com/igrr/axtls-8266, is used in this project. It is distributed under [BSD license](https://github.com/igrr/axtls-8266/blob/master/LICENSE).
-
[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).
+
+[FTP Client/Server Library](https://github.com/dplasa/FTPClientServer)
diff --git a/boards.txt b/boards.txt
index 74509c0b3e..1b44fe3310 100644
--- a/boards.txt
+++ b/boards.txt
@@ -5,6 +5,9 @@
#
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
@@ -12,16 +15,19 @@ menu.eesz=Flash Size
menu.FlashMode=Flash Mode
menu.FlashFreq=Flash Frequency
menu.ResetMethod=Reset Method
-menu.ESPModule=Module
menu.dbg=Debug port
menu.lvl=Debug Level
+menu.optim=Debug Optimization
menu.ip=lwIP Variant
menu.vt=VTables
-menu.exception=Exceptions
-menu.led=Builtin Led
+menu.exception=C++ Exceptions
+menu.stacksmash=Stack Protection
menu.wipe=Erase Flash
-menu.sdk=Espressif FW
+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
@@ -29,13 +35,14 @@ generic.build.board=ESP8266_GENERIC
generic.upload.tool=esptool
generic.upload.maximum_data_size=81920
generic.upload.wait_for_upload_port=true
-generic.upload.erase_cmd=version
+generic.upload.erase_cmd=
generic.serial.disableDTR=true
generic.serial.disableRTS=true
generic.build.mcu=esp8266
generic.build.core=esp8266
generic.build.variant=generic
generic.build.spiffs_pagesize=256
+generic.build.debug_optim=
generic.build.debug_port=
generic.build.debug_level=
generic.menu.xtal.80=80 MHz
@@ -48,30 +55,45 @@ 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.legacy=Legacy (new can return nullptr)
-generic.menu.exception.legacy.build.exception_flags=-fno-exceptions
-generic.menu.exception.legacy.build.stdcpp_lib=-lstdc++
-generic.menu.exception.disabled=Disabled (new can abort)
-generic.menu.exception.disabled.build.exception_flags=-fno-exceptions -DNEW_OOM_ABORT
+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.ResetMethod.ck=ck
-generic.menu.ResetMethod.ck.upload.resetmethod=ck
-generic.menu.ResetMethod.nodemcu=nodemcu
-generic.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu
-generic.menu.ResetMethod.none=none
-generic.menu.ResetMethod.none.upload.resetmethod=none
-generic.menu.ResetMethod.dtrset=dtrset
-generic.menu.ResetMethod.dtrset.upload.resetmethod=dtrset
+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 -DESP8266
+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
@@ -94,251 +116,209 @@ 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_size_bytes=0x100000
generic.menu.eesz.1M64.build.flash_ld=eagle.flash.1m64.ld
generic.menu.eesz.1M64.build.spiffs_pagesize=256
-generic.menu.eesz.1M64.upload.maximum_size=958448
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_size_bytes=0x100000
generic.menu.eesz.1M128.build.flash_ld=eagle.flash.1m128.ld
generic.menu.eesz.1M128.build.spiffs_pagesize=256
-generic.menu.eesz.1M128.upload.maximum_size=892912
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_size_bytes=0x100000
generic.menu.eesz.1M144.build.flash_ld=eagle.flash.1m144.ld
generic.menu.eesz.1M144.build.spiffs_pagesize=256
-generic.menu.eesz.1M144.upload.maximum_size=876528
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_size_bytes=0x100000
generic.menu.eesz.1M160.build.flash_ld=eagle.flash.1m160.ld
generic.menu.eesz.1M160.build.spiffs_pagesize=256
-generic.menu.eesz.1M160.upload.maximum_size=860144
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_size_bytes=0x100000
generic.menu.eesz.1M192.build.flash_ld=eagle.flash.1m192.ld
generic.menu.eesz.1M192.build.spiffs_pagesize=256
-generic.menu.eesz.1M192.upload.maximum_size=827376
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_size_bytes=0x100000
generic.menu.eesz.1M256.build.flash_ld=eagle.flash.1m256.ld
generic.menu.eesz.1M256.build.spiffs_pagesize=256
-generic.menu.eesz.1M256.upload.maximum_size=761840
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_size_bytes=0x100000
generic.menu.eesz.1M512.build.flash_ld=eagle.flash.1m512.ld
generic.menu.eesz.1M512.build.spiffs_pagesize=256
-generic.menu.eesz.1M512.upload.maximum_size=499696
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_size_bytes=0x100000
generic.menu.eesz.1M.build.flash_ld=eagle.flash.1m.ld
generic.menu.eesz.1M.build.spiffs_pagesize=256
-generic.menu.eesz.1M.upload.maximum_size=1023984
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_size_bytes=0x200000
generic.menu.eesz.2M64.build.flash_ld=eagle.flash.2m64.ld
generic.menu.eesz.2M64.build.spiffs_pagesize=256
-generic.menu.eesz.2M64.upload.maximum_size=1044464
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_size_bytes=0x200000
generic.menu.eesz.2M128.build.flash_ld=eagle.flash.2m128.ld
generic.menu.eesz.2M128.build.spiffs_pagesize=256
-generic.menu.eesz.2M128.upload.maximum_size=1044464
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_size_bytes=0x200000
generic.menu.eesz.2M256.build.flash_ld=eagle.flash.2m256.ld
generic.menu.eesz.2M256.build.spiffs_pagesize=256
-generic.menu.eesz.2M256.upload.maximum_size=1044464
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_size_bytes=0x200000
generic.menu.eesz.2M512.build.flash_ld=eagle.flash.2m512.ld
generic.menu.eesz.2M512.build.spiffs_pagesize=256
-generic.menu.eesz.2M512.upload.maximum_size=1044464
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_size_bytes=0x200000
generic.menu.eesz.2M1M.build.flash_ld=eagle.flash.2m1m.ld
generic.menu.eesz.2M1M.build.spiffs_pagesize=256
-generic.menu.eesz.2M1M.upload.maximum_size=1044464
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_size_bytes=0x200000
generic.menu.eesz.2M.build.flash_ld=eagle.flash.2m.ld
generic.menu.eesz.2M.build.spiffs_pagesize=256
-generic.menu.eesz.2M.upload.maximum_size=1044464
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_size_bytes=0x400000
generic.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
generic.menu.eesz.4M2M.build.spiffs_pagesize=256
-generic.menu.eesz.4M2M.upload.maximum_size=1044464
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_size_bytes=0x400000
generic.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
generic.menu.eesz.4M3M.build.spiffs_pagesize=256
-generic.menu.eesz.4M3M.upload.maximum_size=1044464
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_size_bytes=0x400000
generic.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
generic.menu.eesz.4M1M.build.spiffs_pagesize=256
-generic.menu.eesz.4M1M.upload.maximum_size=1044464
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_size_bytes=0x400000
generic.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
generic.menu.eesz.4M.build.spiffs_pagesize=256
-generic.menu.eesz.4M.upload.maximum_size=1044464
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_size_bytes=0x800000
generic.menu.eesz.8M6M.build.flash_ld=eagle.flash.8m6m.ld
generic.menu.eesz.8M6M.build.spiffs_pagesize=256
-generic.menu.eesz.8M6M.upload.maximum_size=1044464
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_size_bytes=0x800000
generic.menu.eesz.8M7M.build.flash_ld=eagle.flash.8m7m.ld
generic.menu.eesz.8M7M.build.spiffs_pagesize=256
-generic.menu.eesz.8M7M.upload.maximum_size=1044464
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_size_bytes=0x1000000
generic.menu.eesz.16M14M.build.flash_ld=eagle.flash.16m14m.ld
generic.menu.eesz.16M14M.build.spiffs_pagesize=256
-generic.menu.eesz.16M14M.upload.maximum_size=1044464
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_size_bytes=0x1000000
generic.menu.eesz.16M15M.build.flash_ld=eagle.flash.16m15m.ld
generic.menu.eesz.16M15M.build.spiffs_pagesize=256
-generic.menu.eesz.16M15M.upload.maximum_size=1044464
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_size_bytes=0x80000
generic.menu.eesz.512K32.build.flash_ld=eagle.flash.512k32.ld
generic.menu.eesz.512K32.build.spiffs_pagesize=256
-generic.menu.eesz.512K32.upload.maximum_size=466928
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_size_bytes=0x80000
generic.menu.eesz.512K64.build.flash_ld=eagle.flash.512k64.ld
generic.menu.eesz.512K64.build.spiffs_pagesize=256
-generic.menu.eesz.512K64.upload.maximum_size=434160
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_size_bytes=0x80000
generic.menu.eesz.512K128.build.flash_ld=eagle.flash.512k128.ld
generic.menu.eesz.512K128.build.spiffs_pagesize=256
-generic.menu.eesz.512K128.upload.maximum_size=368624
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_size_bytes=0x80000
generic.menu.eesz.512K.build.flash_ld=eagle.flash.512k.ld
generic.menu.eesz.512K.build.spiffs_pagesize=256
-generic.menu.eesz.512K.upload.maximum_size=499696
generic.menu.eesz.512K.build.rfcal_addr=0x7C000
generic.menu.led.2=2
generic.menu.led.2.build.led=-DLED_BUILTIN=2
@@ -374,12 +354,20 @@ 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.nonosdk222_100=nonos-sdk 2.2.1+100 (testing)
-generic.menu.sdk.nonosdk222_100.build.sdk=NONOSDK22y
+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.nonosdk3v0=nonos-sdk pre-3 (known issues)
-generic.menu.sdk.nonosdk3v0.build.sdk=NONOSDK3V0
+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
@@ -404,13 +392,6 @@ 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.ip.hb1=v1.4 Higher Bandwidth
-generic.menu.ip.hb1.build.lwip_lib=-llwip_gcc
-generic.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
-generic.menu.ip.src=v1.4 Compile from source
-generic.menu.ip.src.build.lwip_lib=-llwip_src
-generic.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
-generic.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
generic.menu.dbg.Disabled=Disabled
generic.menu.dbg.Disabled.build.debug_port=
generic.menu.dbg.Serial=Serial
@@ -419,6 +400,12 @@ 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
@@ -463,14 +450,26 @@ 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=version
+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
@@ -493,6 +492,15 @@ 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
##############################################################
esp8285.name=Generic ESP8285 Module
@@ -501,12 +509,13 @@ 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=version
+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
@@ -519,110 +528,154 @@ 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.legacy=Legacy (new can return nullptr)
-esp8285.menu.exception.legacy.build.exception_flags=-fno-exceptions
-esp8285.menu.exception.legacy.build.stdcpp_lib=-lstdc++
-esp8285.menu.exception.disabled=Disabled (new can abort)
-esp8285.menu.exception.disabled.build.exception_flags=-fno-exceptions -DNEW_OOM_ABORT
+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.ResetMethod.ck=ck
-esp8285.menu.ResetMethod.ck.upload.resetmethod=ck
-esp8285.menu.ResetMethod.nodemcu=nodemcu
-esp8285.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu
-esp8285.menu.ResetMethod.none=none
-esp8285.menu.ResetMethod.none.upload.resetmethod=none
-esp8285.menu.ResetMethod.dtrset=dtrset
-esp8285.menu.ResetMethod.dtrset.upload.resetmethod=dtrset
+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 -DESP8266
+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_size_bytes=0x100000
esp8285.menu.eesz.1M64.build.flash_ld=eagle.flash.1m64.ld
esp8285.menu.eesz.1M64.build.spiffs_pagesize=256
-esp8285.menu.eesz.1M64.upload.maximum_size=958448
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_size_bytes=0x100000
esp8285.menu.eesz.1M128.build.flash_ld=eagle.flash.1m128.ld
esp8285.menu.eesz.1M128.build.spiffs_pagesize=256
-esp8285.menu.eesz.1M128.upload.maximum_size=892912
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_size_bytes=0x100000
esp8285.menu.eesz.1M144.build.flash_ld=eagle.flash.1m144.ld
esp8285.menu.eesz.1M144.build.spiffs_pagesize=256
-esp8285.menu.eesz.1M144.upload.maximum_size=876528
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_size_bytes=0x100000
esp8285.menu.eesz.1M160.build.flash_ld=eagle.flash.1m160.ld
esp8285.menu.eesz.1M160.build.spiffs_pagesize=256
-esp8285.menu.eesz.1M160.upload.maximum_size=860144
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_size_bytes=0x100000
esp8285.menu.eesz.1M192.build.flash_ld=eagle.flash.1m192.ld
esp8285.menu.eesz.1M192.build.spiffs_pagesize=256
-esp8285.menu.eesz.1M192.upload.maximum_size=827376
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_size_bytes=0x100000
esp8285.menu.eesz.1M256.build.flash_ld=eagle.flash.1m256.ld
esp8285.menu.eesz.1M256.build.spiffs_pagesize=256
-esp8285.menu.eesz.1M256.upload.maximum_size=761840
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_size_bytes=0x100000
esp8285.menu.eesz.1M512.build.flash_ld=eagle.flash.1m512.ld
esp8285.menu.eesz.1M512.build.spiffs_pagesize=256
-esp8285.menu.eesz.1M512.upload.maximum_size=499696
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_size_bytes=0x100000
esp8285.menu.eesz.1M.build.flash_ld=eagle.flash.1m.ld
esp8285.menu.eesz.1M.build.spiffs_pagesize=256
-esp8285.menu.eesz.1M.upload.maximum_size=1023984
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
@@ -657,6 +710,20 @@ 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
@@ -681,13 +748,6 @@ 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.ip.hb1=v1.4 Higher Bandwidth
-esp8285.menu.ip.hb1.build.lwip_lib=-llwip_gcc
-esp8285.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
-esp8285.menu.ip.src=v1.4 Compile from source
-esp8285.menu.ip.src.build.lwip_lib=-llwip_src
-esp8285.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
-esp8285.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
esp8285.menu.dbg.Disabled=Disabled
esp8285.menu.dbg.Disabled.build.debug_port=
esp8285.menu.dbg.Serial=Serial
@@ -696,6 +756,12 @@ 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
@@ -740,14 +806,26 @@ 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=version
+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
@@ -770,300 +848,397 @@ 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
##############################################################
-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=ck
-espduino.menu.ResetMethod.v2=ESPduino-V2
-espduino.menu.ResetMethod.v2.upload.resetmethod=nodemcu
-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.maximum_data_size=81920
-espduino.upload.wait_for_upload_port=true
-espduino.upload.erase_cmd=version
-espduino.serial.disableDTR=true
-espduino.serial.disableRTS=true
-espduino.build.mcu=esp8266
-espduino.build.core=esp8266
-espduino.build.spiffs_pagesize=256
-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.legacy=Legacy (new can return nullptr)
-espduino.menu.exception.legacy.build.exception_flags=-fno-exceptions
-espduino.menu.exception.legacy.build.stdcpp_lib=-lstdc++
-espduino.menu.exception.disabled=Disabled (new can abort)
-espduino.menu.exception.disabled.build.exception_flags=-fno-exceptions -DNEW_OOM_ABORT
-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.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.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_size_bytes=0x400000
-espduino.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
-espduino.menu.eesz.4M2M.build.spiffs_pagesize=256
-espduino.menu.eesz.4M2M.upload.maximum_size=1044464
-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_size_bytes=0x400000
-espduino.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
-espduino.menu.eesz.4M3M.build.spiffs_pagesize=256
-espduino.menu.eesz.4M3M.upload.maximum_size=1044464
-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_size_bytes=0x400000
-espduino.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-espduino.menu.eesz.4M1M.build.spiffs_pagesize=256
-espduino.menu.eesz.4M1M.upload.maximum_size=1044464
-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_size_bytes=0x400000
-espduino.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
-espduino.menu.eesz.4M.build.spiffs_pagesize=256
-espduino.menu.eesz.4M.upload.maximum_size=1044464
-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.ip.hb1=v1.4 Higher Bandwidth
-espduino.menu.ip.hb1.build.lwip_lib=-llwip_gcc
-espduino.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
-espduino.menu.ip.src=v1.4 Compile from source
-espduino.menu.ip.src.build.lwip_lib=-llwip_src
-espduino.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
-espduino.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-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.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.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.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.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=version
-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
-
-##############################################################
-huzzah.name=Adafruit Feather HUZZAH ESP8266
-huzzah.build.board=ESP8266_ESP12
-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=version
-huzzah.serial.disableDTR=true
-huzzah.serial.disableRTS=true
-huzzah.build.mcu=esp8266
-huzzah.build.core=esp8266
-huzzah.build.spiffs_pagesize=256
-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.legacy=Legacy (new can return nullptr)
-huzzah.menu.exception.legacy.build.exception_flags=-fno-exceptions
-huzzah.menu.exception.legacy.build.stdcpp_lib=-lstdc++
-huzzah.menu.exception.disabled=Disabled (new can abort)
-huzzah.menu.exception.disabled.build.exception_flags=-fno-exceptions -DNEW_OOM_ABORT
-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.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.upload.resetmethod=nodemcu
-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_size_bytes=0x400000
-huzzah.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
-huzzah.menu.eesz.4M2M.build.spiffs_pagesize=256
-huzzah.menu.eesz.4M2M.upload.maximum_size=1044464
-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_size_bytes=0x400000
-huzzah.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
-huzzah.menu.eesz.4M3M.build.spiffs_pagesize=256
-huzzah.menu.eesz.4M3M.upload.maximum_size=1044464
-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_size_bytes=0x400000
-huzzah.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-huzzah.menu.eesz.4M1M.build.spiffs_pagesize=256
-huzzah.menu.eesz.4M1M.upload.maximum_size=1044464
-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_size_bytes=0x400000
-huzzah.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
-huzzah.menu.eesz.4M.build.spiffs_pagesize=256
-huzzah.menu.eesz.4M.upload.maximum_size=1044464
-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)
+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
+
+##############################################################
+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
@@ -1075,13 +1250,6 @@ 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.ip.hb1=v1.4 Higher Bandwidth
-huzzah.menu.ip.hb1.build.lwip_lib=-llwip_gcc
-huzzah.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
-huzzah.menu.ip.src=v1.4 Compile from source
-huzzah.menu.ip.src.build.lwip_lib=-llwip_src
-huzzah.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
-huzzah.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
huzzah.menu.dbg.Disabled=Disabled
huzzah.menu.dbg.Disabled.build.debug_port=
huzzah.menu.dbg.Serial=Serial
@@ -1090,6 +1258,12 @@ 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
@@ -1134,14 +1308,26 @@ 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=version
+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
@@ -1164,4584 +1350,15 @@ huzzah.menu.baud.921600=921600
huzzah.menu.baud.921600.upload.speed=921600
huzzah.menu.baud.3000000=3000000
huzzah.menu.baud.3000000.upload.speed=3000000
-
-##############################################################
-inventone.name=Invent One
-inventone.build.board=ESP8266_GENERIC
-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=version
-inventone.serial.disableDTR=true
-inventone.serial.disableRTS=true
-inventone.build.mcu=esp8266
-inventone.build.core=esp8266
-inventone.build.spiffs_pagesize=256
-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.legacy=Legacy (new can return nullptr)
-inventone.menu.exception.legacy.build.exception_flags=-fno-exceptions
-inventone.menu.exception.legacy.build.stdcpp_lib=-lstdc++
-inventone.menu.exception.disabled=Disabled (new can abort)
-inventone.menu.exception.disabled.build.exception_flags=-fno-exceptions -DNEW_OOM_ABORT
-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.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.upload.resetmethod=nodemcu
-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_size_bytes=0x400000
-inventone.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
-inventone.menu.eesz.4M2M.build.spiffs_pagesize=256
-inventone.menu.eesz.4M2M.upload.maximum_size=1044464
-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_size_bytes=0x400000
-inventone.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
-inventone.menu.eesz.4M3M.build.spiffs_pagesize=256
-inventone.menu.eesz.4M3M.upload.maximum_size=1044464
-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_size_bytes=0x400000
-inventone.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-inventone.menu.eesz.4M1M.build.spiffs_pagesize=256
-inventone.menu.eesz.4M1M.upload.maximum_size=1044464
-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_size_bytes=0x400000
-inventone.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
-inventone.menu.eesz.4M.build.spiffs_pagesize=256
-inventone.menu.eesz.4M.upload.maximum_size=1044464
-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.ip.hb1=v1.4 Higher Bandwidth
-inventone.menu.ip.hb1.build.lwip_lib=-llwip_gcc
-inventone.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
-inventone.menu.ip.src=v1.4 Compile from source
-inventone.menu.ip.src.build.lwip_lib=-llwip_src
-inventone.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
-inventone.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-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.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.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.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.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=version
-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
-
-##############################################################
-cw01.name=XinaBox CW01
-cw01.build.board=ESP8266_GENERIC
-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=version
-cw01.serial.disableDTR=true
-cw01.serial.disableRTS=true
-cw01.build.mcu=esp8266
-cw01.build.core=esp8266
-cw01.build.spiffs_pagesize=256
-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.legacy=Legacy (new can return nullptr)
-cw01.menu.exception.legacy.build.exception_flags=-fno-exceptions
-cw01.menu.exception.legacy.build.stdcpp_lib=-lstdc++
-cw01.menu.exception.disabled=Disabled (new can abort)
-cw01.menu.exception.disabled.build.exception_flags=-fno-exceptions -DNEW_OOM_ABORT
-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.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.upload.resetmethod=nodemcu
-cw01.menu.CrystalFreq.26=26 MHz
-cw01.menu.CrystalFreq.40=40 MHz
-cw01.menu.CrystalFreq.40.build.extra_flags=-DF_CRYSTAL=40000000 -DESP8266
-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_size_bytes=0x400000
-cw01.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
-cw01.menu.eesz.4M2M.build.spiffs_pagesize=256
-cw01.menu.eesz.4M2M.upload.maximum_size=1044464
-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_size_bytes=0x400000
-cw01.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
-cw01.menu.eesz.4M3M.build.spiffs_pagesize=256
-cw01.menu.eesz.4M3M.upload.maximum_size=1044464
-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_size_bytes=0x400000
-cw01.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-cw01.menu.eesz.4M1M.build.spiffs_pagesize=256
-cw01.menu.eesz.4M1M.upload.maximum_size=1044464
-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_size_bytes=0x400000
-cw01.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
-cw01.menu.eesz.4M.build.spiffs_pagesize=256
-cw01.menu.eesz.4M.upload.maximum_size=1044464
-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.ip.hb1=v1.4 Higher Bandwidth
-cw01.menu.ip.hb1.build.lwip_lib=-llwip_gcc
-cw01.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
-cw01.menu.ip.src=v1.4 Compile from source
-cw01.menu.ip.src.build.lwip_lib=-llwip_src
-cw01.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
-cw01.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-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.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.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.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.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=version
-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
-
-##############################################################
-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.maximum_data_size=81920
-espresso_lite_v1.upload.wait_for_upload_port=true
-espresso_lite_v1.upload.erase_cmd=version
-espresso_lite_v1.serial.disableDTR=true
-espresso_lite_v1.serial.disableRTS=true
-espresso_lite_v1.build.mcu=esp8266
-espresso_lite_v1.build.core=esp8266
-espresso_lite_v1.build.spiffs_pagesize=256
-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.legacy=Legacy (new can return nullptr)
-espresso_lite_v1.menu.exception.legacy.build.exception_flags=-fno-exceptions
-espresso_lite_v1.menu.exception.legacy.build.stdcpp_lib=-lstdc++
-espresso_lite_v1.menu.exception.disabled=Disabled (new can abort)
-espresso_lite_v1.menu.exception.disabled.build.exception_flags=-fno-exceptions -DNEW_OOM_ABORT
-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.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.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_size_bytes=0x400000
-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.upload.maximum_size=1044464
-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_size_bytes=0x400000
-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.upload.maximum_size=1044464
-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_size_bytes=0x400000
-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.upload.maximum_size=1044464
-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_size_bytes=0x400000
-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.upload.maximum_size=1044464
-espresso_lite_v1.menu.eesz.4M.build.rfcal_addr=0x3FC000
-espresso_lite_v1.menu.ResetMethod.ck=ck
-espresso_lite_v1.menu.ResetMethod.ck.upload.resetmethod=ck
-espresso_lite_v1.menu.ResetMethod.nodemcu=nodemcu
-espresso_lite_v1.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu
-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.ip.hb1=v1.4 Higher Bandwidth
-espresso_lite_v1.menu.ip.hb1.build.lwip_lib=-llwip_gcc
-espresso_lite_v1.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
-espresso_lite_v1.menu.ip.src=v1.4 Compile from source
-espresso_lite_v1.menu.ip.src.build.lwip_lib=-llwip_src
-espresso_lite_v1.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
-espresso_lite_v1.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-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.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.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.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.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=version
-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_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.maximum_data_size=81920
-espresso_lite_v2.upload.wait_for_upload_port=true
-espresso_lite_v2.upload.erase_cmd=version
-espresso_lite_v2.serial.disableDTR=true
-espresso_lite_v2.serial.disableRTS=true
-espresso_lite_v2.build.mcu=esp8266
-espresso_lite_v2.build.core=esp8266
-espresso_lite_v2.build.spiffs_pagesize=256
-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.legacy=Legacy (new can return nullptr)
-espresso_lite_v2.menu.exception.legacy.build.exception_flags=-fno-exceptions
-espresso_lite_v2.menu.exception.legacy.build.stdcpp_lib=-lstdc++
-espresso_lite_v2.menu.exception.disabled=Disabled (new can abort)
-espresso_lite_v2.menu.exception.disabled.build.exception_flags=-fno-exceptions -DNEW_OOM_ABORT
-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.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.build.flash_mode=dio
-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_size_bytes=0x400000
-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.upload.maximum_size=1044464
-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_size_bytes=0x400000
-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.upload.maximum_size=1044464
-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_size_bytes=0x400000
-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.upload.maximum_size=1044464
-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_size_bytes=0x400000
-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.upload.maximum_size=1044464
-espresso_lite_v2.menu.eesz.4M.build.rfcal_addr=0x3FC000
-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
-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.ip.hb1=v1.4 Higher Bandwidth
-espresso_lite_v2.menu.ip.hb1.build.lwip_lib=-llwip_gcc
-espresso_lite_v2.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
-espresso_lite_v2.menu.ip.src=v1.4 Compile from source
-espresso_lite_v2.menu.ip.src.build.lwip_lib=-llwip_src
-espresso_lite_v2.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
-espresso_lite_v2.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-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.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.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.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.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=version
-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
-
-##############################################################
-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=version
-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_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.legacy=Legacy (new can return nullptr)
-phoenix_v1.menu.exception.legacy.build.exception_flags=-fno-exceptions
-phoenix_v1.menu.exception.legacy.build.stdcpp_lib=-lstdc++
-phoenix_v1.menu.exception.disabled=Disabled (new can abort)
-phoenix_v1.menu.exception.disabled.build.exception_flags=-fno-exceptions -DNEW_OOM_ABORT
-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.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.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_size_bytes=0x400000
-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.upload.maximum_size=1044464
-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_size_bytes=0x400000
-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.upload.maximum_size=1044464
-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_size_bytes=0x400000
-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.upload.maximum_size=1044464
-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_size_bytes=0x400000
-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.upload.maximum_size=1044464
-phoenix_v1.menu.eesz.4M.build.rfcal_addr=0x3FC000
-phoenix_v1.menu.ResetMethod.ck=ck
-phoenix_v1.menu.ResetMethod.ck.upload.resetmethod=ck
-phoenix_v1.menu.ResetMethod.nodemcu=nodemcu
-phoenix_v1.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu
-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.ip.hb1=v1.4 Higher Bandwidth
-phoenix_v1.menu.ip.hb1.build.lwip_lib=-llwip_gcc
-phoenix_v1.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
-phoenix_v1.menu.ip.src=v1.4 Compile from source
-phoenix_v1.menu.ip.src.build.lwip_lib=-llwip_src
-phoenix_v1.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
-phoenix_v1.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-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.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.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.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.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=version
-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_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=version
-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_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.legacy=Legacy (new can return nullptr)
-phoenix_v2.menu.exception.legacy.build.exception_flags=-fno-exceptions
-phoenix_v2.menu.exception.legacy.build.stdcpp_lib=-lstdc++
-phoenix_v2.menu.exception.disabled=Disabled (new can abort)
-phoenix_v2.menu.exception.disabled.build.exception_flags=-fno-exceptions -DNEW_OOM_ABORT
-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.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.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_size_bytes=0x400000
-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.upload.maximum_size=1044464
-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_size_bytes=0x400000
-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.upload.maximum_size=1044464
-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_size_bytes=0x400000
-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.upload.maximum_size=1044464
-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_size_bytes=0x400000
-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.upload.maximum_size=1044464
-phoenix_v2.menu.eesz.4M.build.rfcal_addr=0x3FC000
-phoenix_v2.menu.ResetMethod.ck=ck
-phoenix_v2.menu.ResetMethod.ck.upload.resetmethod=ck
-phoenix_v2.menu.ResetMethod.nodemcu=nodemcu
-phoenix_v2.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu
-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.ip.hb1=v1.4 Higher Bandwidth
-phoenix_v2.menu.ip.hb1.build.lwip_lib=-llwip_gcc
-phoenix_v2.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
-phoenix_v2.menu.ip.src=v1.4 Compile from source
-phoenix_v2.menu.ip.src.build.lwip_lib=-llwip_src
-phoenix_v2.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
-phoenix_v2.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-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.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.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.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.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=version
-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
-
-##############################################################
-nodemcu.name=NodeMCU 0.9 (ESP-12 Module)
-nodemcu.build.board=ESP8266_NODEMCU
-nodemcu.build.variant=nodemcu
-nodemcu.upload.tool=esptool
-nodemcu.upload.maximum_data_size=81920
-nodemcu.upload.wait_for_upload_port=true
-nodemcu.upload.erase_cmd=version
-nodemcu.serial.disableDTR=true
-nodemcu.serial.disableRTS=true
-nodemcu.build.mcu=esp8266
-nodemcu.build.core=esp8266
-nodemcu.build.spiffs_pagesize=256
-nodemcu.build.debug_port=
-nodemcu.build.debug_level=
-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.legacy=Legacy (new can return nullptr)
-nodemcu.menu.exception.legacy.build.exception_flags=-fno-exceptions
-nodemcu.menu.exception.legacy.build.stdcpp_lib=-lstdc++
-nodemcu.menu.exception.disabled=Disabled (new can abort)
-nodemcu.menu.exception.disabled.build.exception_flags=-fno-exceptions -DNEW_OOM_ABORT
-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.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.upload.resetmethod=nodemcu
-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_size_bytes=0x400000
-nodemcu.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
-nodemcu.menu.eesz.4M2M.build.spiffs_pagesize=256
-nodemcu.menu.eesz.4M2M.upload.maximum_size=1044464
-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_size_bytes=0x400000
-nodemcu.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
-nodemcu.menu.eesz.4M3M.build.spiffs_pagesize=256
-nodemcu.menu.eesz.4M3M.upload.maximum_size=1044464
-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_size_bytes=0x400000
-nodemcu.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-nodemcu.menu.eesz.4M1M.build.spiffs_pagesize=256
-nodemcu.menu.eesz.4M1M.upload.maximum_size=1044464
-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_size_bytes=0x400000
-nodemcu.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
-nodemcu.menu.eesz.4M.build.spiffs_pagesize=256
-nodemcu.menu.eesz.4M.upload.maximum_size=1044464
-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.ip.hb1=v1.4 Higher Bandwidth
-nodemcu.menu.ip.hb1.build.lwip_lib=-llwip_gcc
-nodemcu.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
-nodemcu.menu.ip.src=v1.4 Compile from source
-nodemcu.menu.ip.src.build.lwip_lib=-llwip_src
-nodemcu.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
-nodemcu.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-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.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.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.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.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=version
-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
-
-##############################################################
-nodemcuv2.name=NodeMCU 1.0 (ESP-12E Module)
-nodemcuv2.build.board=ESP8266_NODEMCU
-nodemcuv2.build.variant=nodemcu
-nodemcuv2.upload.tool=esptool
-nodemcuv2.upload.maximum_data_size=81920
-nodemcuv2.upload.wait_for_upload_port=true
-nodemcuv2.upload.erase_cmd=version
-nodemcuv2.serial.disableDTR=true
-nodemcuv2.serial.disableRTS=true
-nodemcuv2.build.mcu=esp8266
-nodemcuv2.build.core=esp8266
-nodemcuv2.build.spiffs_pagesize=256
-nodemcuv2.build.debug_port=
-nodemcuv2.build.debug_level=
-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.legacy=Legacy (new can return nullptr)
-nodemcuv2.menu.exception.legacy.build.exception_flags=-fno-exceptions
-nodemcuv2.menu.exception.legacy.build.stdcpp_lib=-lstdc++
-nodemcuv2.menu.exception.disabled=Disabled (new can abort)
-nodemcuv2.menu.exception.disabled.build.exception_flags=-fno-exceptions -DNEW_OOM_ABORT
-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.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.upload.resetmethod=nodemcu
-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_size_bytes=0x400000
-nodemcuv2.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
-nodemcuv2.menu.eesz.4M2M.build.spiffs_pagesize=256
-nodemcuv2.menu.eesz.4M2M.upload.maximum_size=1044464
-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_size_bytes=0x400000
-nodemcuv2.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
-nodemcuv2.menu.eesz.4M3M.build.spiffs_pagesize=256
-nodemcuv2.menu.eesz.4M3M.upload.maximum_size=1044464
-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_size_bytes=0x400000
-nodemcuv2.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-nodemcuv2.menu.eesz.4M1M.build.spiffs_pagesize=256
-nodemcuv2.menu.eesz.4M1M.upload.maximum_size=1044464
-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_size_bytes=0x400000
-nodemcuv2.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
-nodemcuv2.menu.eesz.4M.build.spiffs_pagesize=256
-nodemcuv2.menu.eesz.4M.upload.maximum_size=1044464
-nodemcuv2.menu.eesz.4M.build.rfcal_addr=0x3FC000
-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.ip.hb1=v1.4 Higher Bandwidth
-nodemcuv2.menu.ip.hb1.build.lwip_lib=-llwip_gcc
-nodemcuv2.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
-nodemcuv2.menu.ip.src=v1.4 Compile from source
-nodemcuv2.menu.ip.src.build.lwip_lib=-llwip_src
-nodemcuv2.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
-nodemcuv2.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-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.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.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.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.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=version
-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
-
-##############################################################
-modwifi.name=Olimex MOD-WIFI-ESP8266(-DEV)
-modwifi.build.board=MOD_WIFI_ESP8266
-modwifi.build.variant=modwifi
-modwifi.upload.tool=esptool
-modwifi.upload.maximum_data_size=81920
-modwifi.upload.wait_for_upload_port=true
-modwifi.upload.erase_cmd=version
-modwifi.serial.disableDTR=true
-modwifi.serial.disableRTS=true
-modwifi.build.mcu=esp8266
-modwifi.build.core=esp8266
-modwifi.build.spiffs_pagesize=256
-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.legacy=Legacy (new can return nullptr)
-modwifi.menu.exception.legacy.build.exception_flags=-fno-exceptions
-modwifi.menu.exception.legacy.build.stdcpp_lib=-lstdc++
-modwifi.menu.exception.disabled=Disabled (new can abort)
-modwifi.menu.exception.disabled.build.exception_flags=-fno-exceptions -DNEW_OOM_ABORT
-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.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.upload.resetmethod=ck
-modwifi.build.flash_mode=qio
-modwifi.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_size_bytes=0x200000
-modwifi.menu.eesz.2M64.build.flash_ld=eagle.flash.2m64.ld
-modwifi.menu.eesz.2M64.build.spiffs_pagesize=256
-modwifi.menu.eesz.2M64.upload.maximum_size=1044464
-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_size_bytes=0x200000
-modwifi.menu.eesz.2M128.build.flash_ld=eagle.flash.2m128.ld
-modwifi.menu.eesz.2M128.build.spiffs_pagesize=256
-modwifi.menu.eesz.2M128.upload.maximum_size=1044464
-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_size_bytes=0x200000
-modwifi.menu.eesz.2M256.build.flash_ld=eagle.flash.2m256.ld
-modwifi.menu.eesz.2M256.build.spiffs_pagesize=256
-modwifi.menu.eesz.2M256.upload.maximum_size=1044464
-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_size_bytes=0x200000
-modwifi.menu.eesz.2M512.build.flash_ld=eagle.flash.2m512.ld
-modwifi.menu.eesz.2M512.build.spiffs_pagesize=256
-modwifi.menu.eesz.2M512.upload.maximum_size=1044464
-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_size_bytes=0x200000
-modwifi.menu.eesz.2M1M.build.flash_ld=eagle.flash.2m1m.ld
-modwifi.menu.eesz.2M1M.build.spiffs_pagesize=256
-modwifi.menu.eesz.2M1M.upload.maximum_size=1044464
-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_size_bytes=0x200000
-modwifi.menu.eesz.2M.build.flash_ld=eagle.flash.2m.ld
-modwifi.menu.eesz.2M.build.spiffs_pagesize=256
-modwifi.menu.eesz.2M.upload.maximum_size=1044464
-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.ip.hb1=v1.4 Higher Bandwidth
-modwifi.menu.ip.hb1.build.lwip_lib=-llwip_gcc
-modwifi.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
-modwifi.menu.ip.src=v1.4 Compile from source
-modwifi.menu.ip.src.build.lwip_lib=-llwip_src
-modwifi.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
-modwifi.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-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.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.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.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.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=version
-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
-
-##############################################################
-thing.name=SparkFun ESP8266 Thing
-thing.build.board=ESP8266_THING
-thing.build.variant=thing
-thing.upload.tool=esptool
-thing.upload.maximum_data_size=81920
-thing.upload.wait_for_upload_port=true
-thing.upload.erase_cmd=version
-thing.serial.disableDTR=true
-thing.serial.disableRTS=true
-thing.build.mcu=esp8266
-thing.build.core=esp8266
-thing.build.spiffs_pagesize=256
-thing.build.debug_port=
-thing.build.debug_level=
-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.legacy=Legacy (new can return nullptr)
-thing.menu.exception.legacy.build.exception_flags=-fno-exceptions
-thing.menu.exception.legacy.build.stdcpp_lib=-lstdc++
-thing.menu.exception.disabled=Disabled (new can abort)
-thing.menu.exception.disabled.build.exception_flags=-fno-exceptions -DNEW_OOM_ABORT
-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.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.upload.resetmethod=ck
-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_size_bytes=0x80000
-thing.menu.eesz.512K32.build.flash_ld=eagle.flash.512k32.ld
-thing.menu.eesz.512K32.build.spiffs_pagesize=256
-thing.menu.eesz.512K32.upload.maximum_size=466928
-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_size_bytes=0x80000
-thing.menu.eesz.512K64.build.flash_ld=eagle.flash.512k64.ld
-thing.menu.eesz.512K64.build.spiffs_pagesize=256
-thing.menu.eesz.512K64.upload.maximum_size=434160
-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_size_bytes=0x80000
-thing.menu.eesz.512K128.build.flash_ld=eagle.flash.512k128.ld
-thing.menu.eesz.512K128.build.spiffs_pagesize=256
-thing.menu.eesz.512K128.upload.maximum_size=368624
-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_size_bytes=0x80000
-thing.menu.eesz.512K.build.flash_ld=eagle.flash.512k.ld
-thing.menu.eesz.512K.build.spiffs_pagesize=256
-thing.menu.eesz.512K.upload.maximum_size=499696
-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.ip.hb1=v1.4 Higher Bandwidth
-thing.menu.ip.hb1.build.lwip_lib=-llwip_gcc
-thing.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
-thing.menu.ip.src=v1.4 Compile from source
-thing.menu.ip.src.build.lwip_lib=-llwip_src
-thing.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
-thing.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-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.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.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.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.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=version
-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
-
-##############################################################
-thingdev.name=SparkFun ESP8266 Thing Dev
-thingdev.build.board=ESP8266_THING_DEV
-thingdev.build.variant=thing
-thingdev.upload.tool=esptool
-thingdev.upload.maximum_data_size=81920
-thingdev.upload.wait_for_upload_port=true
-thingdev.upload.erase_cmd=version
-thingdev.serial.disableDTR=true
-thingdev.serial.disableRTS=true
-thingdev.build.mcu=esp8266
-thingdev.build.core=esp8266
-thingdev.build.spiffs_pagesize=256
-thingdev.build.debug_port=
-thingdev.build.debug_level=
-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.legacy=Legacy (new can return nullptr)
-thingdev.menu.exception.legacy.build.exception_flags=-fno-exceptions
-thingdev.menu.exception.legacy.build.stdcpp_lib=-lstdc++
-thingdev.menu.exception.disabled=Disabled (new can abort)
-thingdev.menu.exception.disabled.build.exception_flags=-fno-exceptions -DNEW_OOM_ABORT
-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.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.upload.resetmethod=nodemcu
-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_size_bytes=0x80000
-thingdev.menu.eesz.512K32.build.flash_ld=eagle.flash.512k32.ld
-thingdev.menu.eesz.512K32.build.spiffs_pagesize=256
-thingdev.menu.eesz.512K32.upload.maximum_size=466928
-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_size_bytes=0x80000
-thingdev.menu.eesz.512K64.build.flash_ld=eagle.flash.512k64.ld
-thingdev.menu.eesz.512K64.build.spiffs_pagesize=256
-thingdev.menu.eesz.512K64.upload.maximum_size=434160
-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_size_bytes=0x80000
-thingdev.menu.eesz.512K128.build.flash_ld=eagle.flash.512k128.ld
-thingdev.menu.eesz.512K128.build.spiffs_pagesize=256
-thingdev.menu.eesz.512K128.upload.maximum_size=368624
-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_size_bytes=0x80000
-thingdev.menu.eesz.512K.build.flash_ld=eagle.flash.512k.ld
-thingdev.menu.eesz.512K.build.spiffs_pagesize=256
-thingdev.menu.eesz.512K.upload.maximum_size=499696
-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.ip.hb1=v1.4 Higher Bandwidth
-thingdev.menu.ip.hb1.build.lwip_lib=-llwip_gcc
-thingdev.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
-thingdev.menu.ip.src=v1.4 Compile from source
-thingdev.menu.ip.src.build.lwip_lib=-llwip_src
-thingdev.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
-thingdev.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-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.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.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.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.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=version
-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
-
-##############################################################
-esp210.name=SweetPea ESP-210
-esp210.build.board=ESP8266_ESP210
-esp210.upload.tool=esptool
-esp210.upload.maximum_data_size=81920
-esp210.upload.wait_for_upload_port=true
-esp210.upload.erase_cmd=version
-esp210.serial.disableDTR=true
-esp210.serial.disableRTS=true
-esp210.build.mcu=esp8266
-esp210.build.core=esp8266
-esp210.build.variant=generic
-esp210.build.spiffs_pagesize=256
-esp210.build.debug_port=
-esp210.build.debug_level=
-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.legacy=Legacy (new can return nullptr)
-esp210.menu.exception.legacy.build.exception_flags=-fno-exceptions
-esp210.menu.exception.legacy.build.stdcpp_lib=-lstdc++
-esp210.menu.exception.disabled=Disabled (new can abort)
-esp210.menu.exception.disabled.build.exception_flags=-fno-exceptions -DNEW_OOM_ABORT
-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.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.upload.resetmethod=ck
-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_size_bytes=0x400000
-esp210.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
-esp210.menu.eesz.4M2M.build.spiffs_pagesize=256
-esp210.menu.eesz.4M2M.upload.maximum_size=1044464
-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_size_bytes=0x400000
-esp210.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
-esp210.menu.eesz.4M3M.build.spiffs_pagesize=256
-esp210.menu.eesz.4M3M.upload.maximum_size=1044464
-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_size_bytes=0x400000
-esp210.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-esp210.menu.eesz.4M1M.build.spiffs_pagesize=256
-esp210.menu.eesz.4M1M.upload.maximum_size=1044464
-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_size_bytes=0x400000
-esp210.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
-esp210.menu.eesz.4M.build.spiffs_pagesize=256
-esp210.menu.eesz.4M.upload.maximum_size=1044464
-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.ip.hb1=v1.4 Higher Bandwidth
-esp210.menu.ip.hb1.build.lwip_lib=-llwip_gcc
-esp210.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
-esp210.menu.ip.src=v1.4 Compile from source
-esp210.menu.ip.src.build.lwip_lib=-llwip_src
-esp210.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
-esp210.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-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.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.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.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.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=version
-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
-
-##############################################################
-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=version
-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_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.legacy=Legacy (new can return nullptr)
-d1_mini.menu.exception.legacy.build.exception_flags=-fno-exceptions
-d1_mini.menu.exception.legacy.build.stdcpp_lib=-lstdc++
-d1_mini.menu.exception.disabled=Disabled (new can abort)
-d1_mini.menu.exception.disabled.build.exception_flags=-fno-exceptions -DNEW_OOM_ABORT
-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.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.upload.resetmethod=nodemcu
-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_size_bytes=0x400000
-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.upload.maximum_size=1044464
-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_size_bytes=0x400000
-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.upload.maximum_size=1044464
-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_size_bytes=0x400000
-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.upload.maximum_size=1044464
-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_size_bytes=0x400000
-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.upload.maximum_size=1044464
-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.ip.hb1=v1.4 Higher Bandwidth
-d1_mini.menu.ip.hb1.build.lwip_lib=-llwip_gcc
-d1_mini.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
-d1_mini.menu.ip.src=v1.4 Compile from source
-d1_mini.menu.ip.src.build.lwip_lib=-llwip_src
-d1_mini.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
-d1_mini.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-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.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.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.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.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=version
-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_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=version
-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_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.legacy=Legacy (new can return nullptr)
-d1_mini_pro.menu.exception.legacy.build.exception_flags=-fno-exceptions
-d1_mini_pro.menu.exception.legacy.build.stdcpp_lib=-lstdc++
-d1_mini_pro.menu.exception.disabled=Disabled (new can abort)
-d1_mini_pro.menu.exception.disabled.build.exception_flags=-fno-exceptions -DNEW_OOM_ABORT
-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.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.upload.resetmethod=nodemcu
-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_size_bytes=0x1000000
-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.upload.maximum_size=1044464
-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_size_bytes=0x1000000
-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.upload.maximum_size=1044464
-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.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.ip.hb1=v1.4 Higher Bandwidth
-d1_mini_pro.menu.ip.hb1.build.lwip_lib=-llwip_gcc
-d1_mini_pro.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
-d1_mini_pro.menu.ip.src=v1.4 Compile from source
-d1_mini_pro.menu.ip.src.build.lwip_lib=-llwip_src
-d1_mini_pro.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
-d1_mini_pro.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-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.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.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.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.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=version
-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_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=version
-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_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.legacy=Legacy (new can return nullptr)
-d1_mini_lite.menu.exception.legacy.build.exception_flags=-fno-exceptions
-d1_mini_lite.menu.exception.legacy.build.stdcpp_lib=-lstdc++
-d1_mini_lite.menu.exception.disabled=Disabled (new can abort)
-d1_mini_lite.menu.exception.disabled.build.exception_flags=-fno-exceptions -DNEW_OOM_ABORT
-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.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.upload.resetmethod=nodemcu
-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_size_bytes=0x100000
-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.upload.maximum_size=958448
-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_size_bytes=0x100000
-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.upload.maximum_size=892912
-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_size_bytes=0x100000
-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.upload.maximum_size=876528
-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_size_bytes=0x100000
-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.upload.maximum_size=860144
-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_size_bytes=0x100000
-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.upload.maximum_size=827376
-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_size_bytes=0x100000
-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.upload.maximum_size=761840
-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_size_bytes=0x100000
-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.upload.maximum_size=499696
-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_size_bytes=0x100000
-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.upload.maximum_size=1023984
-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.ip.hb1=v1.4 Higher Bandwidth
-d1_mini_lite.menu.ip.hb1.build.lwip_lib=-llwip_gcc
-d1_mini_lite.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
-d1_mini_lite.menu.ip.src=v1.4 Compile from source
-d1_mini_lite.menu.ip.src.build.lwip_lib=-llwip_src
-d1_mini_lite.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
-d1_mini_lite.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-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.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.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.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.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=version
-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.name=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=version
-d1.serial.disableDTR=true
-d1.serial.disableRTS=true
-d1.build.mcu=esp8266
-d1.build.core=esp8266
-d1.build.spiffs_pagesize=256
-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.legacy=Legacy (new can return nullptr)
-d1.menu.exception.legacy.build.exception_flags=-fno-exceptions
-d1.menu.exception.legacy.build.stdcpp_lib=-lstdc++
-d1.menu.exception.disabled=Disabled (new can abort)
-d1.menu.exception.disabled.build.exception_flags=-fno-exceptions -DNEW_OOM_ABORT
-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.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.upload.resetmethod=nodemcu
-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_size_bytes=0x400000
-d1.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
-d1.menu.eesz.4M2M.build.spiffs_pagesize=256
-d1.menu.eesz.4M2M.upload.maximum_size=1044464
-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_size_bytes=0x400000
-d1.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
-d1.menu.eesz.4M3M.build.spiffs_pagesize=256
-d1.menu.eesz.4M3M.upload.maximum_size=1044464
-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_size_bytes=0x400000
-d1.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-d1.menu.eesz.4M1M.build.spiffs_pagesize=256
-d1.menu.eesz.4M1M.upload.maximum_size=1044464
-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_size_bytes=0x400000
-d1.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
-d1.menu.eesz.4M.build.spiffs_pagesize=256
-d1.menu.eesz.4M.upload.maximum_size=1044464
-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.ip.hb1=v1.4 Higher Bandwidth
-d1.menu.ip.hb1.build.lwip_lib=-llwip_gcc
-d1.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
-d1.menu.ip.src=v1.4 Compile from source
-d1.menu.ip.src.build.lwip_lib=-llwip_src
-d1.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
-d1.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-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.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.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.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.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=version
-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
-
-##############################################################
-espino.name=ESPino (ESP-12 Module)
-espino.build.board=ESP8266_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=version
-espino.serial.disableDTR=true
-espino.serial.disableRTS=true
-espino.build.mcu=esp8266
-espino.build.core=esp8266
-espino.build.spiffs_pagesize=256
-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.legacy=Legacy (new can return nullptr)
-espino.menu.exception.legacy.build.exception_flags=-fno-exceptions
-espino.menu.exception.legacy.build.stdcpp_lib=-lstdc++
-espino.menu.exception.disabled=Disabled (new can abort)
-espino.menu.exception.disabled.build.exception_flags=-fno-exceptions -DNEW_OOM_ABORT
-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.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.ResetMethod.ck=ck
-espino.menu.ResetMethod.ck.upload.resetmethod=ck
-espino.menu.ResetMethod.nodemcu=nodemcu
-espino.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu
-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_size_bytes=0x400000
-espino.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
-espino.menu.eesz.4M2M.build.spiffs_pagesize=256
-espino.menu.eesz.4M2M.upload.maximum_size=1044464
-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_size_bytes=0x400000
-espino.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
-espino.menu.eesz.4M3M.build.spiffs_pagesize=256
-espino.menu.eesz.4M3M.upload.maximum_size=1044464
-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_size_bytes=0x400000
-espino.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-espino.menu.eesz.4M1M.build.spiffs_pagesize=256
-espino.menu.eesz.4M1M.upload.maximum_size=1044464
-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_size_bytes=0x400000
-espino.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
-espino.menu.eesz.4M.build.spiffs_pagesize=256
-espino.menu.eesz.4M.upload.maximum_size=1044464
-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.ip.hb1=v1.4 Higher Bandwidth
-espino.menu.ip.hb1.build.lwip_lib=-llwip_gcc
-espino.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
-espino.menu.ip.src=v1.4 Compile from source
-espino.menu.ip.src.build.lwip_lib=-llwip_src
-espino.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
-espino.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-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.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.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.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.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=version
-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
-
-##############################################################
-espinotee.name=ThaiEasyElec's ESPino
-espinotee.build.board=ESP8266_ESP13
-espinotee.build.variant=espinotee
-espinotee.upload.tool=esptool
-espinotee.upload.maximum_data_size=81920
-espinotee.upload.wait_for_upload_port=true
-espinotee.upload.erase_cmd=version
-espinotee.serial.disableDTR=true
-espinotee.serial.disableRTS=true
-espinotee.build.mcu=esp8266
-espinotee.build.core=esp8266
-espinotee.build.spiffs_pagesize=256
-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.legacy=Legacy (new can return nullptr)
-espinotee.menu.exception.legacy.build.exception_flags=-fno-exceptions
-espinotee.menu.exception.legacy.build.stdcpp_lib=-lstdc++
-espinotee.menu.exception.disabled=Disabled (new can abort)
-espinotee.menu.exception.disabled.build.exception_flags=-fno-exceptions -DNEW_OOM_ABORT
-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.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.upload.resetmethod=nodemcu
-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_size_bytes=0x400000
-espinotee.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
-espinotee.menu.eesz.4M2M.build.spiffs_pagesize=256
-espinotee.menu.eesz.4M2M.upload.maximum_size=1044464
-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_size_bytes=0x400000
-espinotee.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
-espinotee.menu.eesz.4M3M.build.spiffs_pagesize=256
-espinotee.menu.eesz.4M3M.upload.maximum_size=1044464
-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_size_bytes=0x400000
-espinotee.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-espinotee.menu.eesz.4M1M.build.spiffs_pagesize=256
-espinotee.menu.eesz.4M1M.upload.maximum_size=1044464
-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_size_bytes=0x400000
-espinotee.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
-espinotee.menu.eesz.4M.build.spiffs_pagesize=256
-espinotee.menu.eesz.4M.upload.maximum_size=1044464
-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.ip.hb1=v1.4 Higher Bandwidth
-espinotee.menu.ip.hb1.build.lwip_lib=-llwip_gcc
-espinotee.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
-espinotee.menu.ip.src=v1.4 Compile from source
-espinotee.menu.ip.src.build.lwip_lib=-llwip_src
-espinotee.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
-espinotee.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-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.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.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.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.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=version
-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
-
-##############################################################
-wifinfo.name=WifInfo
-wifinfo.build.board=WIFINFO
-wifinfo.build.variant=wifinfo
-wifinfo.menu.ESPModule.ESP07192=ESP07 (1M/192K SPIFFS)
-wifinfo.menu.ESPModule.ESP07192.build.board=ESP8266_ESP07
-wifinfo.menu.ESPModule.ESP07192.build.flash_ld=eagle.flash.1m192.ld
-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.ESP12=ESP12 (4M/1M SPIFFS)
-wifinfo.menu.ESPModule.ESP12.build.board=ESP8266_ESP12
-wifinfo.menu.ESPModule.ESP12.build.flash_ld=eagle.flash.4m1m.ld
-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.upload.tool=esptool
-wifinfo.upload.maximum_data_size=81920
-wifinfo.upload.wait_for_upload_port=true
-wifinfo.upload.erase_cmd=version
-wifinfo.serial.disableDTR=true
-wifinfo.serial.disableRTS=true
-wifinfo.build.mcu=esp8266
-wifinfo.build.core=esp8266
-wifinfo.build.spiffs_pagesize=256
-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.legacy=Legacy (new can return nullptr)
-wifinfo.menu.exception.legacy.build.exception_flags=-fno-exceptions
-wifinfo.menu.exception.legacy.build.stdcpp_lib=-lstdc++
-wifinfo.menu.exception.disabled=Disabled (new can abort)
-wifinfo.menu.exception.disabled.build.exception_flags=-fno-exceptions -DNEW_OOM_ABORT
-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.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.upload.resetmethod=nodemcu
-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_size_bytes=0x100000
-wifinfo.menu.eesz.1M64.build.flash_ld=eagle.flash.1m64.ld
-wifinfo.menu.eesz.1M64.build.spiffs_pagesize=256
-wifinfo.menu.eesz.1M64.upload.maximum_size=958448
-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_size_bytes=0x100000
-wifinfo.menu.eesz.1M128.build.flash_ld=eagle.flash.1m128.ld
-wifinfo.menu.eesz.1M128.build.spiffs_pagesize=256
-wifinfo.menu.eesz.1M128.upload.maximum_size=892912
-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_size_bytes=0x100000
-wifinfo.menu.eesz.1M144.build.flash_ld=eagle.flash.1m144.ld
-wifinfo.menu.eesz.1M144.build.spiffs_pagesize=256
-wifinfo.menu.eesz.1M144.upload.maximum_size=876528
-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_size_bytes=0x100000
-wifinfo.menu.eesz.1M160.build.flash_ld=eagle.flash.1m160.ld
-wifinfo.menu.eesz.1M160.build.spiffs_pagesize=256
-wifinfo.menu.eesz.1M160.upload.maximum_size=860144
-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_size_bytes=0x100000
-wifinfo.menu.eesz.1M192.build.flash_ld=eagle.flash.1m192.ld
-wifinfo.menu.eesz.1M192.build.spiffs_pagesize=256
-wifinfo.menu.eesz.1M192.upload.maximum_size=827376
-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_size_bytes=0x100000
-wifinfo.menu.eesz.1M256.build.flash_ld=eagle.flash.1m256.ld
-wifinfo.menu.eesz.1M256.build.spiffs_pagesize=256
-wifinfo.menu.eesz.1M256.upload.maximum_size=761840
-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_size_bytes=0x100000
-wifinfo.menu.eesz.1M512.build.flash_ld=eagle.flash.1m512.ld
-wifinfo.menu.eesz.1M512.build.spiffs_pagesize=256
-wifinfo.menu.eesz.1M512.upload.maximum_size=499696
-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_size_bytes=0x100000
-wifinfo.menu.eesz.1M.build.flash_ld=eagle.flash.1m.ld
-wifinfo.menu.eesz.1M.build.spiffs_pagesize=256
-wifinfo.menu.eesz.1M.upload.maximum_size=1023984
-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.ip.hb1=v1.4 Higher Bandwidth
-wifinfo.menu.ip.hb1.build.lwip_lib=-llwip_gcc
-wifinfo.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
-wifinfo.menu.ip.src=v1.4 Compile from source
-wifinfo.menu.ip.src.build.lwip_lib=-llwip_src
-wifinfo.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
-wifinfo.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-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.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.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.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.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=version
-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
-
-##############################################################
-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 -DESP8266
-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 -DESP8266
-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 -DESP8266
-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=version
-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_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.legacy=Legacy (new can return nullptr)
-arduino-esp8266.menu.exception.legacy.build.exception_flags=-fno-exceptions
-arduino-esp8266.menu.exception.legacy.build.stdcpp_lib=-lstdc++
-arduino-esp8266.menu.exception.disabled=Disabled (new can abort)
-arduino-esp8266.menu.exception.disabled.build.exception_flags=-fno-exceptions -DNEW_OOM_ABORT
-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.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.upload.resetmethod=ck
-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_size_bytes=0x400000
-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.upload.maximum_size=1044464
-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_size_bytes=0x400000
-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.upload.maximum_size=1044464
-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_size_bytes=0x400000
-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.upload.maximum_size=1044464
-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_size_bytes=0x400000
-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.upload.maximum_size=1044464
-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.ip.hb1=v1.4 Higher Bandwidth
-arduino-esp8266.menu.ip.hb1.build.lwip_lib=-llwip_gcc
-arduino-esp8266.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
-arduino-esp8266.menu.ip.src=v1.4 Compile from source
-arduino-esp8266.menu.ip.src.build.lwip_lib=-llwip_src
-arduino-esp8266.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
-arduino-esp8266.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-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.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.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.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.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=version
-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
-
-##############################################################
-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=version
-gen4iod.serial.disableDTR=true
-gen4iod.serial.disableRTS=true
-gen4iod.build.mcu=esp8266
-gen4iod.build.core=esp8266
-gen4iod.build.spiffs_pagesize=256
-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.legacy=Legacy (new can return nullptr)
-gen4iod.menu.exception.legacy.build.exception_flags=-fno-exceptions
-gen4iod.menu.exception.legacy.build.stdcpp_lib=-lstdc++
-gen4iod.menu.exception.disabled=Disabled (new can abort)
-gen4iod.menu.exception.disabled.build.exception_flags=-fno-exceptions -DNEW_OOM_ABORT
-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.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.upload.resetmethod=nodemcu
-gen4iod.build.flash_mode=dio
-gen4iod.build.flash_flags=-DFLASHMODE_DIO
-gen4iod.build.flash_freq=80
-gen4iod.menu.eesz.512K32=512KB (FS:32KB OTA:~230KB)
-gen4iod.menu.eesz.512K32.build.flash_size=512K
-gen4iod.menu.eesz.512K32.build.flash_size_bytes=0x80000
-gen4iod.menu.eesz.512K32.build.flash_ld=eagle.flash.512k32.ld
-gen4iod.menu.eesz.512K32.build.spiffs_pagesize=256
-gen4iod.menu.eesz.512K32.upload.maximum_size=466928
-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_size_bytes=0x80000
-gen4iod.menu.eesz.512K64.build.flash_ld=eagle.flash.512k64.ld
-gen4iod.menu.eesz.512K64.build.spiffs_pagesize=256
-gen4iod.menu.eesz.512K64.upload.maximum_size=434160
-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_size_bytes=0x80000
-gen4iod.menu.eesz.512K128.build.flash_ld=eagle.flash.512k128.ld
-gen4iod.menu.eesz.512K128.build.spiffs_pagesize=256
-gen4iod.menu.eesz.512K128.upload.maximum_size=368624
-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_size_bytes=0x80000
-gen4iod.menu.eesz.512K.build.flash_ld=eagle.flash.512k.ld
-gen4iod.menu.eesz.512K.build.spiffs_pagesize=256
-gen4iod.menu.eesz.512K.upload.maximum_size=499696
-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.ip.hb1=v1.4 Higher Bandwidth
-gen4iod.menu.ip.hb1.build.lwip_lib=-llwip_gcc
-gen4iod.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
-gen4iod.menu.ip.src=v1.4 Compile from source
-gen4iod.menu.ip.src.build.lwip_lib=-llwip_src
-gen4iod.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
-gen4iod.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-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.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.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.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.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=version
-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
-
-##############################################################
-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=version
-oak.serial.disableDTR=true
-oak.serial.disableRTS=true
-oak.build.mcu=esp8266
-oak.build.core=esp8266
-oak.build.spiffs_pagesize=256
-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.legacy=Legacy (new can return nullptr)
-oak.menu.exception.legacy.build.exception_flags=-fno-exceptions
-oak.menu.exception.legacy.build.stdcpp_lib=-lstdc++
-oak.menu.exception.disabled=Disabled (new can abort)
-oak.menu.exception.disabled.build.exception_flags=-fno-exceptions -DNEW_OOM_ABORT
-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.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.upload.resetmethod=none
-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_size_bytes=0x400000
-oak.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
-oak.menu.eesz.4M2M.build.spiffs_pagesize=256
-oak.menu.eesz.4M2M.upload.maximum_size=1044464
-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_size_bytes=0x400000
-oak.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
-oak.menu.eesz.4M3M.build.spiffs_pagesize=256
-oak.menu.eesz.4M3M.upload.maximum_size=1044464
-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_size_bytes=0x400000
-oak.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-oak.menu.eesz.4M1M.build.spiffs_pagesize=256
-oak.menu.eesz.4M1M.upload.maximum_size=1044464
-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_size_bytes=0x400000
-oak.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
-oak.menu.eesz.4M.build.spiffs_pagesize=256
-oak.menu.eesz.4M.upload.maximum_size=1044464
-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.ip.hb1=v1.4 Higher Bandwidth
-oak.menu.ip.hb1.build.lwip_lib=-llwip_gcc
-oak.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
-oak.menu.ip.src=v1.4 Compile from source
-oak.menu.ip.src.build.lwip_lib=-llwip_src
-oak.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
-oak.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-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.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.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.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.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=version
-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
-
-##############################################################
-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=version
-wifiduino.serial.disableDTR=true
-wifiduino.serial.disableRTS=true
-wifiduino.build.mcu=esp8266
-wifiduino.build.core=esp8266
-wifiduino.build.spiffs_pagesize=256
-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.legacy=Legacy (new can return nullptr)
-wifiduino.menu.exception.legacy.build.exception_flags=-fno-exceptions
-wifiduino.menu.exception.legacy.build.stdcpp_lib=-lstdc++
-wifiduino.menu.exception.disabled=Disabled (new can abort)
-wifiduino.menu.exception.disabled.build.exception_flags=-fno-exceptions -DNEW_OOM_ABORT
-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.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.upload.resetmethod=nodemcu
-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_size_bytes=0x400000
-wifiduino.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
-wifiduino.menu.eesz.4M2M.build.spiffs_pagesize=256
-wifiduino.menu.eesz.4M2M.upload.maximum_size=1044464
-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_size_bytes=0x400000
-wifiduino.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
-wifiduino.menu.eesz.4M3M.build.spiffs_pagesize=256
-wifiduino.menu.eesz.4M3M.upload.maximum_size=1044464
-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_size_bytes=0x400000
-wifiduino.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-wifiduino.menu.eesz.4M1M.build.spiffs_pagesize=256
-wifiduino.menu.eesz.4M1M.upload.maximum_size=1044464
-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_size_bytes=0x400000
-wifiduino.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
-wifiduino.menu.eesz.4M.build.spiffs_pagesize=256
-wifiduino.menu.eesz.4M.upload.maximum_size=1044464
-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.ip.hb1=v1.4 Higher Bandwidth
-wifiduino.menu.ip.hb1.build.lwip_lib=-llwip_gcc
-wifiduino.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
-wifiduino.menu.ip.src=v1.4 Compile from source
-wifiduino.menu.ip.src.build.lwip_lib=-llwip_src
-wifiduino.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
-wifiduino.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-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.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.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.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.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=version
-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
+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
##############################################################
wifi_slot.name=Amperka WiFi Slot
@@ -5750,12 +1367,13 @@ 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=version
+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
@@ -5768,20 +1386,37 @@ 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.legacy=Legacy (new can return nullptr)
-wifi_slot.menu.exception.legacy.build.exception_flags=-fno-exceptions
-wifi_slot.menu.exception.legacy.build.stdcpp_lib=-lstdc++
-wifi_slot.menu.exception.disabled=Disabled (new can abort)
-wifi_slot.menu.exception.disabled.build.exception_flags=-fno-exceptions -DNEW_OOM_ABORT
+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.upload.resetmethod=nodemcu
+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
@@ -5804,137 +1439,109 @@ 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_size_bytes=0x100000
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.upload.maximum_size=958448
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_size_bytes=0x100000
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.upload.maximum_size=892912
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_size_bytes=0x100000
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.upload.maximum_size=876528
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_size_bytes=0x100000
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.upload.maximum_size=860144
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_size_bytes=0x100000
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.upload.maximum_size=827376
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_size_bytes=0x100000
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.upload.maximum_size=761840
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_size_bytes=0x100000
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.upload.maximum_size=499696
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_size_bytes=0x100000
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.upload.maximum_size=1023984
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_size_bytes=0x200000
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.upload.maximum_size=1044464
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_size_bytes=0x200000
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.upload.maximum_size=1044464
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_size_bytes=0x200000
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.upload.maximum_size=1044464
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_size_bytes=0x200000
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.upload.maximum_size=1044464
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_size_bytes=0x200000
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.upload.maximum_size=1044464
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_size_bytes=0x200000
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.upload.maximum_size=1044464
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
@@ -5960,13 +1567,6 @@ 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.ip.hb1=v1.4 Higher Bandwidth
-wifi_slot.menu.ip.hb1.build.lwip_lib=-llwip_gcc
-wifi_slot.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
-wifi_slot.menu.ip.src=v1.4 Compile from source
-wifi_slot.menu.ip.src.build.lwip_lib=-llwip_src
-wifi_slot.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
-wifi_slot.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
wifi_slot.menu.dbg.Disabled=Disabled
wifi_slot.menu.dbg.Disabled.build.debug_port=
wifi_slot.menu.dbg.Serial=Serial
@@ -5975,6 +1575,12 @@ 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
@@ -6019,14 +1625,26 @@ 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=version
+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
@@ -6049,390 +1667,7872 @@ 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
+
+##############################################################
+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
+
+##############################################################
+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
+
+##############################################################
+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.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.core=esp8266
+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
+
+##############################################################
+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
+
+##############################################################
+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.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.core=esp8266
+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.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.core=esp8266
+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_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
+
+##############################################################
+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
+
+##############################################################
+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
+
+##############################################################
+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
+
+##############################################################
+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
+
+##############################################################
+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
+
+##############################################################
+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
+
+##############################################################
+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
+
+##############################################################
+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
+
+##############################################################
+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.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.core=esp8266
+nodemcu.build.spiffs_pagesize=256
+nodemcu.build.debug_optim=
+nodemcu.build.debug_port=
+nodemcu.build.debug_level=
+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.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.core=esp8266
+nodemcuv2.build.spiffs_pagesize=256
+nodemcuv2.build.debug_optim=
+nodemcuv2.build.debug_port=
+nodemcuv2.build.debug_level=
+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.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.core=esp8266
+modwifi.build.spiffs_pagesize=256
+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
+
+##############################################################
+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
+
+##############################################################
+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
+
+##############################################################
+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.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.core=esp8266
+thing.build.spiffs_pagesize=256
+thing.build.debug_optim=
+thing.build.debug_port=
+thing.build.debug_level=
+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.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.core=esp8266
+thingdev.build.spiffs_pagesize=256
+thingdev.build.debug_optim=
+thingdev.build.debug_port=
+thingdev.build.debug_level=
+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
##############################################################
-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=version
-wiolink.serial.disableDTR=true
-wiolink.serial.disableRTS=true
-wiolink.build.mcu=esp8266
-wiolink.build.core=esp8266
-wiolink.build.spiffs_pagesize=256
-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.legacy=Legacy (new can return nullptr)
-wiolink.menu.exception.legacy.build.exception_flags=-fno-exceptions
-wiolink.menu.exception.legacy.build.stdcpp_lib=-lstdc++
-wiolink.menu.exception.disabled=Disabled (new can abort)
-wiolink.menu.exception.disabled.build.exception_flags=-fno-exceptions -DNEW_OOM_ABORT
-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.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.upload.resetmethod=nodemcu
-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_size_bytes=0x400000
-wiolink.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
-wiolink.menu.eesz.4M2M.build.spiffs_pagesize=256
-wiolink.menu.eesz.4M2M.upload.maximum_size=1044464
-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_size_bytes=0x400000
-wiolink.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
-wiolink.menu.eesz.4M3M.build.spiffs_pagesize=256
-wiolink.menu.eesz.4M3M.upload.maximum_size=1044464
-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_size_bytes=0x400000
-wiolink.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-wiolink.menu.eesz.4M1M.build.spiffs_pagesize=256
-wiolink.menu.eesz.4M1M.upload.maximum_size=1044464
-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_size_bytes=0x400000
-wiolink.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
-wiolink.menu.eesz.4M.build.spiffs_pagesize=256
-wiolink.menu.eesz.4M.upload.maximum_size=1044464
-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.ip.hb1=v1.4 Higher Bandwidth
-wiolink.menu.ip.hb1.build.lwip_lib=-llwip_gcc
-wiolink.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
-wiolink.menu.ip.src=v1.4 Compile from source
-wiolink.menu.ip.src.build.lwip_lib=-llwip_src
-wiolink.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
-wiolink.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-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.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.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.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.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=version
-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
+esp210.name=SweetPea ESP-210
+esp210.build.board=ESP8266_ESP210
+esp210.upload.tool=esptool
+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.core=esp8266
+esp210.build.variant=generic
+esp210.build.spiffs_pagesize=256
+esp210.build.debug_optim=
+esp210.build.debug_port=
+esp210.build.debug_level=
+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.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.core=esp8266
+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
##############################################################
-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=version
-espectro.serial.disableDTR=true
-espectro.serial.disableRTS=true
-espectro.build.mcu=esp8266
-espectro.build.core=esp8266
-espectro.build.spiffs_pagesize=256
-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.legacy=Legacy (new can return nullptr)
-espectro.menu.exception.legacy.build.exception_flags=-fno-exceptions
-espectro.menu.exception.legacy.build.stdcpp_lib=-lstdc++
-espectro.menu.exception.disabled=Disabled (new can abort)
-espectro.menu.exception.disabled.build.exception_flags=-fno-exceptions -DNEW_OOM_ABORT
-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.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.upload.resetmethod=nodemcu
-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_size_bytes=0x400000
-espectro.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld
-espectro.menu.eesz.4M2M.build.spiffs_pagesize=256
-espectro.menu.eesz.4M2M.upload.maximum_size=1044464
-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_size_bytes=0x400000
-espectro.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld
-espectro.menu.eesz.4M3M.build.spiffs_pagesize=256
-espectro.menu.eesz.4M3M.upload.maximum_size=1044464
-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_size_bytes=0x400000
-espectro.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld
-espectro.menu.eesz.4M1M.build.spiffs_pagesize=256
-espectro.menu.eesz.4M1M.upload.maximum_size=1044464
-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_size_bytes=0x400000
-espectro.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld
-espectro.menu.eesz.4M.build.spiffs_pagesize=256
-espectro.menu.eesz.4M.upload.maximum_size=1044464
-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.ip.hb1=v1.4 Higher Bandwidth
-espectro.menu.ip.hb1.build.lwip_lib=-llwip_gcc
-espectro.menu.ip.hb1.build.lwip_flags=-DLWIP_OPEN_SRC
-espectro.menu.ip.src=v1.4 Compile from source
-espectro.menu.ip.src.build.lwip_lib=-llwip_src
-espectro.menu.ip.src.build.lwip_flags=-DLWIP_OPEN_SRC
-espectro.menu.ip.src.recipe.hooks.sketch.prebuild.1.pattern=make -C "{runtime.platform.path}/tools/sdk/lwip/src" install TOOLS_PATH="{runtime.tools.xtensa-lx106-elf-gcc.path}/bin/xtensa-lx106-elf-"
-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.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.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.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.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=version
-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
+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
+
+##############################################################
+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.build.board=WIFINFO
+wifinfo.build.variant=wifinfo
+wifinfo.menu.ESPModule.ESP07192=ESP07 (1M/192K FS)
+wifinfo.menu.ESPModule.ESP07192.build.board=ESP8266_ESP07
+wifinfo.menu.ESPModule.ESP07192.build.flash_ld=eagle.flash.1m192.ld
+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.ESP12=ESP12 (4M/1M FS)
+wifinfo.menu.ESPModule.ESP12.build.board=ESP8266_ESP12
+wifinfo.menu.ESPModule.ESP12.build.flash_ld=eagle.flash.4m1m.ld
+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.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
+
+##############################################################
+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
diff --git a/bootloaders/eboot/Makefile b/bootloaders/eboot/Makefile
index 3e25eb139e..3eb9fc58f4 100644
--- a/bootloaders/eboot/Makefile
+++ b/bootloaders/eboot/Makefile
@@ -6,49 +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
-CFLAGS += -std=gnu99
+INC += -I../../tools/sdk/include -I../../tools/sdk/uzlib/src
+
+CFLAGS += -std=gnu17
-CFLAGS += -O0 -g -Wpointer-arith -Wno-implicit-function-declaration -Wl,-EL -fno-inline-functions -nostdlib -mlongcalls -mno-text-section-literals
+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 += $(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 69bc692e97..c3d0c278f7 100644
--- a/bootloaders/eboot/eboot.c
+++ b/bootloaders/eboot/eboot.c
@@ -12,11 +12,44 @@
#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)
{
@@ -24,11 +57,7 @@ int print_version(const uint32_t flash_addr)
if (SPIRead(flash_addr + APP_START_OFFSET + sizeof(image_header_t) + sizeof(section_header_t), &ver, sizeof(ver))) {
return 1;
}
- const char* __attribute__ ((aligned (4))) fmtt = "v%08x\n\0\0";
- uint32_t fmt[2];
- fmt[0] = ((uint32_t*) fmtt)[0];
- fmt[1] = ((uint32_t*) fmtt)[1];
- ets_printf((const char*) fmt, ver);
+ ets_printf("v%08x\n", ver);
return 0;
}
@@ -61,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;
}
@@ -80,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;
@@ -123,18 +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
@@ -144,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) {
@@ -167,4 +311,7 @@ void main()
}
while(true){}
+
+ __builtin_unreachable();
+ return 0;
}
diff --git a/bootloaders/eboot/eboot.elf b/bootloaders/eboot/eboot.elf
index da0f845278..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/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
index f7adc3d700..33d1f78eb1 100644
--- a/cores/esp8266/AddrList.h
+++ b/cores/esp8266/AddrList.h
@@ -128,7 +128,7 @@ struct netifWrapper
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 netif* interface () const { return _netif; }
const ip_addr_t* ipFromNetifNum () const
{
diff --git a/cores/esp8266/Arduino.h b/cores/esp8266/Arduino.h
index 54919ba100..60737e0195 100644
--- a/cores/esp8266/Arduino.h
+++ b/cores/esp8266/Arduino.h
@@ -33,18 +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
@@ -127,21 +127,11 @@ 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();
-
#define interrupts() xt_rsil(0)
#define noInterrupts() xt_rsil(15)
@@ -170,25 +160,23 @@ typedef uint16_t word;
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);
-uint64_t micros64(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);
@@ -199,11 +187,15 @@ 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 _PORT_GPIO16 1
@@ -223,34 +215,35 @@ 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
-//for compatibility, below 4 lines to be removed in release 3.0.0
-#ifdef __cplusplus
-extern "C"
-#endif
-const int TIM_DIV265 __attribute__((deprecated, weak)) = TIM_DIV256;
-
-
-
+// from this point onward, we need to configure the c++ environment
#ifdef __cplusplus
#include
+#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"
+
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; })
@@ -275,20 +268,52 @@ long secureRandom(long);
long secureRandom(long, long);
long map(long, long, long, long, long);
-void configTime(int timezone, int daylightOffset_sec, const char* server1,
- const char* server2 = nullptr, const char* server3 = nullptr);
+void setTZ(const char* tz);
+// 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
-// reinclude *alloc redefinition because of undefining them
-// this is mandatory for allowing OOM *alloc definitions in .ino files
-#include "umm_malloc/umm_malloc_cfg.h"
+// 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 6cb99a04b6..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,11 +42,9 @@ class Client: public Stream {
uint8_t* rawIPAddress(IPAddress& addr) {
return addr.raw_address();
}
-#if LWIP_VERSION_MAJOR != 1
const uint8_t* rawIPAddress(const IPAddress& addr) {
return addr.raw_address();
}
-#endif
};
#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
index 34185a4727..9e4e9af6f1 100644
--- a/cores/esp8266/Esp-frag.cpp
+++ b/cores/esp8266/Esp-frag.cpp
@@ -19,30 +19,45 @@
*/
#include "umm_malloc/umm_malloc.h"
-#include "umm_malloc/umm_malloc_cfg.h"
#include "coredecls.h"
#include "Esp.h"
-void EspClass::getHeapStats(uint32_t* hfree, uint16_t* hmax, uint8_t* hfrag)
+#if defined(UMM_INFO)
+void EspClass::getHeapStats(uint32_t* hfree, uint32_t* hmax, uint8_t* hfrag)
{
- // L2 / Euclidian norm of free block sizes.
+ // 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);
- umm_info(NULL, 0);
- uint8_t block_size = umm_block_size();
- uint32_t fh = ummHeapInfo.freeBlocks * block_size;
+ uint32_t free_size = umm_free_heap_size_core(umm_get_current_heap());
if (hfree)
- *hfree = fh;
+ *hfree = free_size;
if (hmax)
- *hmax = ummHeapInfo.maxFreeContiguousBlocks * block_size;
- if (hfrag)
- *hfrag = 100 - (sqrt32(ummHeapInfo.freeSize2) * 100) / fh;
+ *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()
{
- uint8_t hfrag;
- getHeapStats(nullptr, nullptr, &hfrag);
- return hfrag;
+ return (uint8_t)umm_fragmentation_metric();
}
+#endif
diff --git a/cores/esp8266/Esp-version.cpp b/cores/esp8266/Esp-version.cpp
index bdc6108642..c1ff61eb06 100644
--- a/cores/esp8266/Esp-version.cpp
+++ b/cores/esp8266/Esp-version.cpp
@@ -21,36 +21,29 @@
#include
#include
#include
-#include // LWIP_VERSION_*
#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 = STR(ARDUINO_ESP8266_GIT_DESC);
+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()
-{
- return String(F("SDK:")) + system_get_sdk_version()
- + F("/Core:") + FPSTR(arduino_esp8266_git_ver)
- + F("=") + String(esp8266::coreVersionNumeric())
-#if LWIP_VERSION_MAJOR == 1
- + F("/lwIP:") + String(LWIP_VERSION_MAJOR) + "." + String(LWIP_VERSION_MINOR) + "." + String(LWIP_VERSION_REVISION)
-#if LWIP_VERSION_IS_DEVELOPMENT
- + F("-dev")
-#endif
-#if LWIP_VERSION_IS_RC
- + F("rc") + String(LWIP_VERSION_RC)
-#endif
-#else // LWIP_VERSION_MAJOR != 1
- + F("/lwIP:")
-#if LWIP_IPV6
- + F("IPv6+")
-#endif // LWIP_IPV6
- + F(LWIP_HASH_STR)
-#endif // LWIP_VERSION_MAJOR != 1
- + FPSTR(bearssl_version)
- ;
+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 29222d6df5..67719dcfe7 100644
--- a/cores/esp8266/Esp.cpp
+++ b/cores/esp8266/Esp.cpp
@@ -26,6 +26,12 @@
#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"
@@ -39,11 +45,6 @@ extern struct rst_info resetInfo;
#ifndef PUYA_SUPPORT
#define PUYA_SUPPORT 1
#endif
-#ifndef PUYA_BUFFER_SIZE
- // Good alternative for buffer size is: SPI_FLASH_SEC_SIZE (= 4k)
- // Always use a multiple of flash page size (256 bytes)
- #define PUYA_BUFFER_SIZE 256
-#endif
/**
* User-defined Literals
@@ -115,20 +116,18 @@ void EspClass::wdtFeed(void)
system_soft_wdt_feed();
}
-extern "C" void esp_yield();
-
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_yield();
+ esp_suspend();
}
//this calculation was taken verbatim from the SDK api reference for SDK 2.1.0.
@@ -192,9 +191,6 @@ bool EspClass::rtcUserMemoryWrite(uint32_t offset, uint32_t *data, size_t size)
}
}
-
-
-extern "C" void __real_system_restart_local();
void EspClass::reset(void)
{
__real_system_restart_local();
@@ -203,7 +199,16 @@ 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)
@@ -215,13 +220,15 @@ uint16_t EspClass::getVcc(void)
uint32_t EspClass::getFreeHeap(void)
{
- return system_get_free_heap_size();
+ return umm_free_heap_size_lw();
}
-uint16_t EspClass::getMaxFreeBlockSize(void)
+#if defined(UMM_INFO)
+uint32_t EspClass::getMaxFreeBlockSize(void)
{
return umm_max_block_size();
}
+#endif
uint32_t EspClass::getFreeContStack()
{
@@ -266,12 +273,6 @@ uint8_t EspClass::getBootMode(void)
return system_get_boot_mode();
}
-uint8_t EspClass::getCpuFreqMHz(void)
-{
- return system_get_cpu_freq();
-}
-
-
uint32_t EspClass::getFlashChipId(void)
{
static uint32_t flash_chip_id = 0;
@@ -293,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)
@@ -300,6 +304,7 @@ uint32_t EspClass::getFlashChipSize(void)
return magicFlashChipSize((bytes[3] & 0xf0) >> 4);
}
return 0;
+#endif
}
uint32_t EspClass::getFlashChipSpeed(void)
@@ -325,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)
@@ -345,6 +351,7 @@ uint32_t EspClass::magicFlashChipSize(uint8_t byte) {
return 0;
}
}
+#endif
uint32_t EspClass::magicFlashChipSpeed(uint8_t byte) {
switch(byte & 0x0F) {
@@ -405,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
@@ -424,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;
}
@@ -447,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) {
@@ -483,7 +520,7 @@ struct rst_info * EspClass::getResetInfoPtr(void) {
}
bool EspClass::eraseConfig(void) {
- const size_t cfgSize = 0x4000;
+ const size_t cfgSize = 0x4000; // Sectors: RF_CAL + SYSTEMPARAM[3]
size_t cfgAddr = ESP.getFlashChipSize() - cfgSize;
for (size_t offset = 0; offset < cfgSize; offset += SPI_FLASH_SEC_SIZE) {
@@ -495,6 +532,74 @@ bool EspClass::eraseConfig(void) {
return true;
}
+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();
+ }
+ 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 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() {
static uint32_t result = 0;
if (result)
@@ -527,14 +632,12 @@ uint32_t EspClass::getSketchSize() {
return result;
}
-extern "C" uint32_t _FS_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)&_FS_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);
@@ -584,16 +687,58 @@ bool EspClass::flashEraseSector(uint32_t sector) {
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);
+}
+
#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(PUYA_BUFFER_SIZE);
+ 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.
@@ -607,9 +752,9 @@ static SpiFlashOpResult spi_flash_write_puya(uint32_t offset, uint32_t *data, si
uint32_t pos = offset;
while (bytesLeft > 0 && rc == SPI_FLASH_RESULT_OK) {
size_t bytesNow = bytesLeft;
- if (bytesNow > PUYA_BUFFER_SIZE) {
- bytesNow = PUYA_BUFFER_SIZE;
- bytesLeft -= PUYA_BUFFER_SIZE;
+ if (bytesNow > FLASH_PAGE_SIZE) {
+ bytesNow = FLASH_PAGE_SIZE;
+ bytesLeft -= FLASH_PAGE_SIZE;
} else {
bytesLeft = 0;
}
@@ -628,23 +773,175 @@ static SpiFlashOpResult spi_flash_write_puya(uint32_t offset, uint32_t *data, si
}
#endif
-bool EspClass::flashWrite(uint32_t offset, uint32_t *data, size_t size) {
- SpiFlashOpResult rc = SPI_FLASH_RESULT_OK;
+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) {
- rc = spi_flash_write_puya(offset, data, size);
+ result = spi_flash_write_puya(address, const_cast(data), size);
}
else
#endif
{
- rc = spi_flash_write(offset, data, size);
+ 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 rc == SPI_FLASH_RESULT_OK;
+
+ return true;
}
-bool EspClass::flashRead(uint32_t offset, uint32_t *data, size_t size) {
- auto rc = spi_flash_read(offset, (uint32_t*) data, size);
- return rc == SPI_FLASH_RESULT_OK;
+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()
@@ -655,17 +952,17 @@ String EspClass::getSketchMD5()
}
uint32_t lengthLeft = getSketchSize();
const size_t bufSize = 512;
- std::unique_ptr buf(new uint8_t[bufSize]);
+ std::unique_ptr buf(new (std::nothrow) uint8_t[bufSize]);
uint32_t offset = 0;
if(!buf.get()) {
- return String();
+ 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 String();
+ if (!flashRead(offset, reinterpret_cast(buf.get()), (readBytes + 3) & ~3)) {
+ return emptyString;
}
md5.add(buf.get(), readBytes);
lengthLeft -= readBytes;
@@ -675,3 +972,47 @@ String EspClass::getSketchMD5()
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 726633d613..9cb4141292 100644
--- a/cores/esp8266/Esp.h
+++ b/cores/esp8266/Esp.h
@@ -22,46 +22,11 @@
#define ESP_H
#include
-
-// Vendor IDs taken from Flashrom project
-// https://review.coreboot.org/cgit/flashrom.git/tree/flashchips.h?h=1.0.x
-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_UNKNOWN = 0xFF
-} SPI_FLASH_VENDOR_t;
+#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
@@ -122,89 +87,201 @@ 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);
-
- void wdtDisable();
- void wdtFeed();
-
- void deepSleep(uint64_t time_us, RFMode mode = RF_DEFAULT);
- void deepSleepInstant(uint64_t time_us, RFMode mode = RF_DEFAULT);
- uint64_t deepSleepMax();
-
- bool rtcUserMemoryRead(uint32_t offset, uint32_t *data, size_t size);
- bool rtcUserMemoryWrite(uint32_t offset, uint32_t *data, size_t size);
-
- void reset();
- void restart();
-
- uint16_t getVcc();
- uint32_t getChipId();
-
- uint32_t getFreeHeap();
- uint16_t getMaxFreeBlockSize();
- uint8_t getHeapFragmentation(); // in %
- void getHeapStats(uint32_t* free = nullptr, uint16_t* max = nullptr, uint8_t* frag = nullptr);
-
- uint32_t getFreeContStack();
- void resetFreeContStack();
+ 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();
- const char * getSdkVersion();
- String getCoreVersion();
- String getFullVersion();
+ static const char * getSdkVersion();
+ static String getCoreVersion();
+ static String getFullVersion();
- uint8_t getBootVersion();
- uint8_t getBootMode();
+ static uint8_t getBootVersion();
+ static uint8_t getBootMode();
- uint8_t getCpuFreqMHz();
+#if defined(F_CPU) || defined(CORE_MOCK)
+ constexpr
+#endif
+ static inline uint8_t getCpuFreqMHz() __attribute__((always_inline))
+ {
+ return esp_get_cpu_freq_mhz();
+ }
- uint32_t getFlashChipId();
- uint8_t getFlashChipVendorId();
+ static uint32_t getFlashChipId();
+ static uint8_t getFlashChipVendorId();
//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();
- String getSketchMD5();
- 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();
-
-#ifndef CORE_MOCK
- inline uint32_t getCycleCount() __attribute__((always_inline));
+ 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
- uint32_t getCycleCount();
-#endif
-};
-
-#ifndef CORE_MOCK
-uint32_t EspClass::getCycleCount()
-{
- return esp_get_cycle_count();
-}
-
+ 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);
+};
extern EspClass ESP;
diff --git a/cores/esp8266/FS.cpp b/cores/esp8266/FS.cpp
index d7baa43069..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);
}
@@ -165,21 +173,39 @@ File File::openNextFile() {
return _fakeDir->openFile("r");
}
-String File::readString()
-{
+String File::readString() {
String ret;
ret.reserve(size() - position());
- char temp[256+1];
- int countRead = readBytes(temp, sizeof(temp)-1);
- while (countRead > 0)
- {
- temp[countRead] = 0;
- ret += temp;
- countRead = readBytes(temp, sizeof(temp)-1);
- }
+ 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();
@@ -192,7 +218,9 @@ File Dir::openFile(const char* mode) {
return File();
}
- return File(_impl->openFile(om, am), _baseFS);
+ File f(_impl->openFile(om, am), _baseFS);
+ f.setTimeCallback(_timeCallback);
+ return f;
}
String Dir::fileName() {
@@ -203,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;
@@ -241,6 +281,14 @@ bool Dir::rewind() {
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;
@@ -254,6 +302,7 @@ bool FS::begin() {
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;
@@ -315,7 +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), this);
+ File f(_impl->open(path, om, am), this);
+ f.setTimeCallback(_timeCallback);
+ return f;
}
bool FS::exists(const char* path) {
@@ -334,7 +385,9 @@ Dir FS::openDir(const char* path) {
return Dir();
}
DirImplPtr p = _impl->openDir(path);
- return Dir(p, this);
+ Dir d(p, this);
+ d.setTimeCallback(_timeCallback);
+ return d;
}
Dir FS::openDir(const String& path) {
@@ -385,6 +438,19 @@ 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) {
diff --git a/cores/esp8266/FS.h b/cores/esp8266/FS.h
index 669287876d..55305e9688 100644
--- a/cores/esp8266/FS.h
+++ b/cores/esp8266/FS.h
@@ -23,6 +23,7 @@
#include
#include
+#include <../include/time.h> // See issue #6714
class SDClass;
@@ -56,6 +57,7 @@ class File : public Stream
// 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;
@@ -65,13 +67,14 @@ class File : public Stream
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;
@@ -82,13 +85,13 @@ class File : public Stream
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;
- int i;
- while (src.available() > sizeof(obuf)){
+ while (src.available() > (int)sizeof(obuf)){
src.read(obuf, sizeof(obuf));
sentLen = write(obuf, sizeof(obuf));
doneLen = doneLen + sentLen;
@@ -110,8 +113,25 @@ class File : public Stream
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;
@@ -126,15 +146,20 @@ class Dir {
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
@@ -161,12 +186,10 @@ struct FSInfo64 {
class FSConfig
{
public:
- FSConfig(bool autoFormat = true) {
- _type = FSConfig::fsid::FSId;
- _autoFormat = autoFormat;
- }
+ static constexpr uint32_t FSId = 0x00000000;
+
+ FSConfig(uint32_t type = FSId, bool autoFormat = true) : _type(type), _autoFormat(autoFormat) { }
- enum fsid { FSId = 0x00000000 };
FSConfig setAutoFormat(bool val = true) {
_autoFormat = val;
return *this;
@@ -179,17 +202,17 @@ class FSConfig
class SPIFFSConfig : public FSConfig
{
public:
- SPIFFSConfig(bool autoFormat = true) {
- _type = SPIFFSConfig::fsid::FSId;
- _autoFormat = autoFormat;
- }
- enum fsid { FSId = 0x53504946 };
+ 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);
@@ -225,14 +248,27 @@ class FS
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;
@@ -247,7 +283,7 @@ using fs::SPIFFSConfig;
#endif //FS_NO_GLOBALS
#if !defined(NO_GLOBAL_INSTANCES) && !defined(NO_GLOBAL_SPIFFS)
-extern fs::FS 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 b7cf4a7a65..22a058f7b3 100644
--- a/cores/esp8266/FSImpl.h
+++ b/cores/esp8266/FSImpl.h
@@ -30,17 +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 {
@@ -62,10 +78,23 @@ 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 {
@@ -86,6 +115,15 @@ class FSImpl {
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
index 665d8043b3..f468595787 100644
--- a/cores/esp8266/FunctionalInterrupt.cpp
+++ b/cores/esp8266/FunctionalInterrupt.cpp
@@ -10,7 +10,7 @@ typedef void (*voidFuncPtrArg)(void*);
extern "C" void __attachInterruptFunctionalArg(uint8_t pin, voidFuncPtr userFunc, void*fp, int mode, bool functional);
-void ICACHE_RAM_ATTR interruptFunctional(void* arg)
+void IRAM_ATTR interruptFunctional(void* arg)
{
ArgStructure* localArg = (ArgStructure*)arg;
if (localArg->functionInfo->reqScheduledFunction)
diff --git a/cores/esp8266/HardwareSerial.cpp b/cores/esp8266/HardwareSerial.cpp
index 129b55eda3..4896e27758 100644
--- a/cores/esp8266/HardwareSerial.cpp
+++ b/cores/esp8266/HardwareSerial.cpp
@@ -32,14 +32,19 @@
#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)
+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);
+ _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))
{
@@ -133,13 +138,12 @@ unsigned long HardwareSerial::testBaudrate()
unsigned long HardwareSerial::detectBaudrate(time_t timeoutMillis)
{
esp8266::polledTimeout::oneShotFastMs timeOut(timeoutMillis);
- unsigned long detectedBaudrate;
+ unsigned long detectedBaudrate = 0;
while (!timeOut) {
if ((detectedBaudrate = testBaudrate())) {
break;
}
- yield();
- delay(100);
+ esp_delay(100);
}
return detectedBaudrate;
}
@@ -162,6 +166,14 @@ size_t HardwareSerial::readBytes(char* buffer, size_t size)
#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);
diff --git a/cores/esp8266/HardwareSerial.h b/cores/esp8266/HardwareSerial.h
index 2d7f631db1..3ef45892e6 100644
--- a/cores/esp8266/HardwareSerial.h
+++ b/cores/esp8266/HardwareSerial.h
@@ -28,7 +28,7 @@
#define HardwareSerial_h
#include
-#include
+#include <../include/time.h> // See issue #6714
#include "Stream.h"
#include "uart.h"
@@ -73,18 +73,23 @@ 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();
@@ -96,60 +101,89 @@ class HardwareSerial: public Stream
return uart_get_rx_buffer_size(_uart);
}
- void swap()
+ bool swap()
{
- swap(1);
+ return swap(1);
}
- void swap(uint8_t tx_pin) //toggle between use of GPIO13/GPIO15 or GPIO3/GPIO(1/2) as RX and TX
+ bool swap(uint8_t tx_pin) //toggle between use of GPIO13/GPIO15 or GPIO3/GPIO(1/2) as RX and TX
{
- uart_swap(_uart, tx_pin);
+ return uart_swap(_uart, tx_pin);
}
/*
* 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)
{
- uart_set_tx(_uart, 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)
{
- uart_set_pins(_uart, tx, rx);
+ return uart_set_pins(_uart, tx, rx);
}
int available(void) override;
int peek(void) override
{
- // return -1 when data is unvailable (arduino api)
+ // return -1 when data is unavailable (arduino api)
return uart_peek_char(_uart);
}
+
+ virtual bool hasPeekBufferAPI () const override
+ {
+ return true;
+ }
+
+ // return a pointer to available data buffer (size = available())
+ // semantic forbids any kind of read() before calling peekConsume()
+ const char* peekBuffer () override
+ {
+ return uart_peek_buffer(_uart);
+ }
+
+ // return number of byte accessible by peekBuffer()
+ size_t peekAvailable () override
+ {
+ return uart_peek_available(_uart);
+ }
+
+ // 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 unvailable (arduino api)
+ // return -1 when data is unavailable (arduino api)
return uart_read_char(_uart);
}
// ::read(buffer, size): same as readBytes without timeout
- size_t read(char* buffer, size_t size)
+ 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)
+ int availableForWrite(void) override
{
return static_cast(uart_tx_free(_uart));
}
- void flush(void) override;
+ 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);
@@ -199,7 +233,13 @@ class HardwareSerial: public Stream
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 d121ba6e53..6f68bc56e9 100644
--- a/cores/esp8266/IPAddress.cpp
+++ b/cores/esp8266/IPAddress.cpp
@@ -27,33 +27,28 @@ IPAddress::IPAddress(const IPAddress& from)
ip_addr_copy(_ip, from._ip);
}
+IPAddress::IPAddress(IPAddress&& from)
+{
+ ip_addr_copy(_ip, from._ip);
+}
+
IPAddress::IPAddress() {
_ip = *IP_ANY_TYPE; // lwIP's v4-or-v6 generic address
}
bool IPAddress::isSet () const {
- return !ip_addr_isany(&_ip);
+ return !ip_addr_isany(&_ip) && ((*this) != IPADDR_NONE);
}
IPAddress::IPAddress(uint8_t first_octet, uint8_t second_octet, uint8_t third_octet, uint8_t fourth_octet) {
- setV4();
- (*this)[0] = first_octet;
- (*this)[1] = second_octet;
- (*this)[2] = third_octet;
- (*this)[3] = fourth_octet;
-}
+ uint8_t addr[] {
+ first_octet,
+ second_octet,
+ third_octet,
+ fourth_octet,
+ };
-void IPAddress::ctor32(uint32_t address) {
- setV4();
- v4() = address;
-}
-
-IPAddress::IPAddress(const uint8_t *address) {
- setV4();
- (*this)[0] = address[0];
- (*this)[1] = address[1];
- (*this)[2] = address[2];
- (*this)[3] = address[3];
+ *this = &addr[0];
}
bool IPAddress::fromString(const char *address) {
@@ -111,8 +106,10 @@ bool IPAddress::fromString4(const char *address) {
}
IPAddress& IPAddress::operator=(const uint8_t *address) {
- setV4();
- v4() = *reinterpret_cast(address);
+ uint32_t value;
+ memcpy_P(&value, address, sizeof(value));
+
+ *this = value;
return *this;
}
@@ -123,7 +120,14 @@ IPAddress& IPAddress::operator=(uint32_t address) {
}
bool IPAddress::operator==(const uint8_t* addr) const {
- return isV4() && v4() == *reinterpret_cast(addr);
+ if (!isV4()) {
+ return false;
+ }
+
+ uint32_t value;
+ memcpy_P(&value, addr, sizeof(value));
+
+ return v4() == value;
}
size_t IPAddress::printTo(Print& p) const {
@@ -180,9 +184,13 @@ 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_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
diff --git a/cores/esp8266/IPAddress.h b/cores/esp8266/IPAddress.h
index bf5ef1010d..99419b92a9 100644
--- a/cores/esp8266/IPAddress.h
+++ b/cores/esp8266/IPAddress.h
@@ -26,27 +26,18 @@
#include
#include
+#include
-#if LWIP_VERSION_MAJOR == 1
-// compatibility macros to make lwIP-v1 compiling lwIP-v2 API
-#define LWIP_IPV6_NUM_ADDRESSES 0
-#define ip_2_ip4(x) (x)
-#define ipv4_addr ip_addr
-#define IP_IS_V4_VAL(x) (1)
-#define IP_SET_TYPE_VAL(x,y) do { (void)0; } while (0)
-#define IP_ANY_TYPE (&ip_addr_any)
-#define IP4_ADDR_ANY IPADDR_ANY
-#define IP4_ADDR_ANY4 IP_ADDR_ANY
-#define IPADDR4_INIT(x) { x }
-#define CONST /* nothing: lwIP-v1 does not use const */
-#define ip4_addr_netcmp ip_addr_netcmp
-#define netif_dhcp_data(netif) ((netif)->dhcp)
-#else // lwIP-v2+
-#define CONST const
#if !LWIP_IPV6
struct ip_addr: ipv4_addr { };
#endif // !LWIP_IPV6
-#endif // lwIP-v2+
+
+// 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:
@@ -70,17 +61,16 @@ class IPAddress: public Printable {
return reinterpret_cast(&v4());
}
- void ctor32 (uint32_t);
-
public:
- // Constructors
IPAddress();
- IPAddress(const IPAddress& from);
+ 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) { ctor32(address); }
- IPAddress(u32_t address) { ctor32(address); }
- IPAddress(int address) { ctor32(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()); }
@@ -89,16 +79,14 @@ class IPAddress: public Printable {
// to a four-byte uint8_t array is expected
operator uint32_t() const { return isV4()? v4(): (uint32_t)0; }
operator uint32_t() { return isV4()? v4(): (uint32_t)0; }
- operator u32_t() const { return isV4()? v4(): (u32_t)0; }
- operator u32_t() { return isV4()? v4(): (u32_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 u32_t& v4() const { return ip_2_ip4(&_ip)->addr; } // for raw_address(const)
- u32_t& v4() { return ip_2_ip4(&_ip)->addr; }
+ 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 ip_addr_cmp(&_ip, &addr._ip);
@@ -109,14 +97,14 @@ class IPAddress: public Printable {
bool operator==(uint32_t addr) const {
return isV4() && v4() == addr;
}
- bool operator==(u32_t addr) const {
- 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!=(u32_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;
@@ -126,11 +114,18 @@ class IPAddress: public Printable {
// Overloaded index operator to allow getting and setting individual octets of the address
uint8_t operator[](int index) const {
- return isV4()? *(raw_address() + index): 0;
+ if (!isV4()) {
+ return 0;
+ }
+
+ return ip4_addr_get_byte_val(*ip_2_ip4(&_ip), index);
}
+
uint8_t& operator[](int index) {
setV4();
- return *(raw_address() + index);
+
+ uint8_t* ptr = reinterpret_cast(&v4());
+ return *(ptr + index);
}
// Overloaded copy operators to allow initialisation of IPAddress objects from other types
@@ -141,6 +136,8 @@ class IPAddress: public Printable {
virtual size_t printTo(Print& p) const;
String toString() const;
+ void clear();
+
/*
check if input string(arg) is a valid IPV4 address or not.
return true on valid.
@@ -219,7 +216,7 @@ class IPAddress: public Printable {
};
-extern CONST IPAddress INADDR_ANY;
+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 b32693ed73..3d068b949a 100644
--- a/cores/esp8266/MD5Builder.cpp
+++ b/cores/esp8266/MD5Builder.cpp
@@ -1,10 +1,11 @@
#include
#include
+#include
-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;
+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){
@@ -18,25 +19,27 @@ void MD5Builder::add(const uint8_t * data, const uint16_t len){
void MD5Builder::addHexString(const char * data){
uint16_t i, len = strlen(data);
- uint8_t * tmp = (uint8_t*)malloc(len/2);
- if(tmp == NULL) {
+ auto tmp = std::unique_ptr{new(std::nothrow) uint8_t[len / 2]};
+
+ if (!tmp) {
return;
}
+
for(i=0; i{new(std::nothrow) uint8_t[buf_size]};
+
+ if (!buf) {
return false;
}
@@ -45,21 +48,21 @@ bool MD5Builder::addStream(Stream & stream, const size_t maxLen){
// determine number of bytes to read
int readBytes = bytesAvailable;
- if(readBytes > maxLengthLeft) {
- readBytes = maxLengthLeft ; // read only until max_len
+ if (readBytes > maxLengthLeft){
+ readBytes = maxLengthLeft; // read only until max_len
}
- if(readBytes > buf_size) {
+ if (readBytes > buf_size){
readBytes = buf_size; // not read more the buffer can handle
}
// read data and check if we got something
- int numBytesRead = stream.readBytes(buf, readBytes);
- if(numBytesRead< 1) {
+ int numBytesRead = stream.readBytes(buf.get(), readBytes);
+ if (numBytesRead < 1) {
return false;
}
// Update MD5 with buffer payload
- MD5Update(&_ctx, buf, numBytesRead);
+ MD5Update(&_ctx, buf.get(), numBytesRead);
yield(); // time for network streams
@@ -67,7 +70,7 @@ bool MD5Builder::addStream(Stream & stream, const size_t maxLen){
maxLengthLeft -= numBytesRead;
bytesAvailable = stream.available();
}
- free(buf);
+
return true;
}
@@ -75,17 +78,17 @@ void MD5Builder::calculate(void){
MD5Final(_buf, &_ctx);
}
-void MD5Builder::getBytes(uint8_t * output){
+void MD5Builder::getBytes(uint8_t * output) const {
memcpy(output, _buf, 16);
}
-void MD5Builder::getChars(char * output){
- for(uint8_t i = 0; i < 16; 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){
+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 6c6d560a05..c3fbce5735 100644
--- a/cores/esp8266/MD5Builder.h
+++ b/cores/esp8266/MD5Builder.h
@@ -40,9 +40,9 @@ class MD5Builder {
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
index fe9c9ca4bc..1252ce6c29 100644
--- a/cores/esp8266/PolledTimeout.h
+++ b/cores/esp8266/PolledTimeout.h
@@ -4,7 +4,7 @@
/*
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.
@@ -23,9 +23,11 @@
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
-#include
-
-#include
+#include // IRAM_ATTR
+#include // std::numeric_limits
+#include // std::is_unsigned
+#include
+#include
namespace esp8266
{
@@ -44,7 +46,7 @@ struct DoNothing
struct YieldOrSkip
{
- static void execute() {delay(0);}
+ static void execute() {esp_yield();}
};
template
@@ -70,13 +72,13 @@ struct TimeSourceMillis
struct TimeSourceCycles
{
- // time policy based on ESP.getCycleCount()
+ // 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.getCycleCount());
- static timeType time() {return ESP.getCycleCount();}
- static constexpr timeType ticksPerSecond = F_CPU; // 80'000'000 or 160'000'000 Hz
+ 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
};
@@ -161,13 +163,13 @@ class timeoutTemplate
return expiredRetrigger();
return expiredOneShot();
}
-
+
IRAM_ATTR // fast
operator bool()
{
- return expired();
+ return expired();
}
-
+
bool canExpire () const
{
return !_neverExpires;
@@ -178,6 +180,7 @@ class timeoutTemplate
return _timeout != alwaysExpired;
}
+ // Resets, will trigger after this new timeout.
IRAM_ATTR // called from ISR
void reset(const timeType newUserTimeout)
{
@@ -186,12 +189,30 @@ class timeoutTemplate
_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
@@ -202,7 +223,7 @@ class timeoutTemplate
{
return TimePolicyT::toUserUnit(_timeout);
}
-
+
static constexpr timeType timeMax()
{
return TimePolicyT::timeMax;
@@ -235,14 +256,14 @@ class timeoutTemplate
}
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;
@@ -259,14 +280,14 @@ using periodic = polledTimeout::timeoutTemplate /*__attribute__((deprecate
using oneShotMs = polledTimeout::timeoutTemplate;
using periodicMs = polledTimeout::timeoutTemplate;
-// Time policy based on ESP.getCycleCount(), and intended to be called very often:
+// 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.getCycleCount()))
+// (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.getCycleCount() is intended to be called very often)
+// (time policy based on esp_get_cycle_count() is intended to be called very often)
using oneShotFastMs = polledTimeout::timeoutTemplate;
using periodicFastMs = polledTimeout::timeoutTemplate;
diff --git a/cores/esp8266/Print.cpp b/cores/esp8266/Print.cpp
index ff640edae1..c2075fa7d8 100644
--- a/cores/esp8266/Print.cpp
+++ b/cores/esp8266/Print.cpp
@@ -33,15 +33,7 @@
/* default implementation: may be overridden */
size_t Print::write(const uint8_t *buffer, size_t size) {
-
-#ifdef DEBUG_ESP_CORE
- static char not_the_best_way [] PROGMEM STORE_ATTR = "Print::write(data,len) should be overridden for better efficiency\r\n";
- static bool once = false;
- if (!once) {
- once = true;
- os_printf_plus(not_the_best_way);
- }
-#endif
+ IAMSLOW();
size_t n = 0;
while (size--) {
@@ -63,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;
}
@@ -86,7 +78,7 @@ size_t Print::printf_P(PGM_P format, ...) {
size_t len = vsnprintf_P(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;
}
@@ -104,11 +96,19 @@ size_t Print::printf_P(PGM_P format, ...) {
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;
}
@@ -138,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) {
@@ -177,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 e620f14ade..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;
@@ -69,10 +69,16 @@ class Print {
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 *);
@@ -84,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&);
@@ -96,11 +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);
- virtual void flush() { /* Empty implementation for backward compatibility */ }
+ // 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
index ed39736e55..f6c650fcf9 100644
--- a/cores/esp8266/Schedule.cpp
+++ b/cores/esp8266/Schedule.cpp
@@ -1,5 +1,23 @@
+/*
+ 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"
@@ -17,6 +35,7 @@ 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
@@ -24,16 +43,18 @@ struct recurrent_fn_t
recurrent_fn_t* mNext = nullptr;
mRecFuncT mFunc;
esp8266::polledTimeout::periodicFastUs callNow;
- recurrent_fn_t (esp8266::polledTimeout::periodicFastUs interval): callNow(interval) { }
+ std::function alarm = nullptr;
+ recurrent_fn_t(esp8266::polledTimeout::periodicFastUs interval) : callNow(interval) { }
};
-static recurrent_fn_t* rFirst = nullptr; // fifo not needed
+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 ()
+static scheduled_fn_t* get_fn_unsafe()
{
scheduled_fn_t* result = nullptr;
// try to get an item from unused items list
@@ -52,7 +73,7 @@ static scheduled_fn_t* get_fn_unsafe ()
return result;
}
-static void recycle_fn_unsafe (scheduled_fn_t* fn)
+static void recycle_fn_unsafe(scheduled_fn_t* fn)
{
fn->mFunc = nullptr; // special overload in c++ std lib
fn->mNext = sUnused;
@@ -60,8 +81,11 @@ static void recycle_fn_unsafe (scheduled_fn_t* fn)
}
IRAM_ATTR // (not only) called from ISR
-bool schedule_function (const std::function& fn)
+bool schedule_function(const std::function& fn)
{
+ if (!fn)
+ return false;
+
esp8266::InterruptLock lockAllInterruptsInThisScope;
scheduled_fn_t* item = get_fn_unsafe();
@@ -80,63 +104,112 @@ bool schedule_function (const std::function& fn)
return true;
}
-bool schedule_recurrent_function_us (const std::function& fn, uint32_t repeat_us)
+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)
- esp8266::InterruptLock lockAllInterruptsInThisScope;
+ 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 (rFirst)
- item->mNext = rFirst;
+ if (rLast)
+ {
+ rLast->mNext = item;
+ }
+ else
+ {
+ rFirst = item;
+ }
+ rLast = item;
- rFirst = item;
+ // grain needs to be recomputed
+ recurrent_max_grain_mS = 0;
return true;
}
-void run_scheduled_functions ()
+uint32_t compute_scheduled_recurrent_grain ()
{
- esp8266::polledTimeout::periodicFastMs yieldNow(100); // yield every 100ms
+ 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;
+ }
- while (sFirst)
+#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;
- sFirst = sFirst->mNext;
- if (!sFirst)
+
+ // removing rLast
+ if (sLast == sFirst)
sLast = nullptr;
+
+ sFirst = sFirst->mNext;
+
recycle_fn_unsafe(to_recycle);
}
- if (yieldNow)
- {
- // because scheduled function are allowed to last:
- // this is yield() in cont stack:
- esp_schedule();
- cont_yield(g_pcont);
- }
+ // 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 ()
+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).
- if (!rFirst)
+ auto current = rFirst;
+ if (!current)
return;
static bool fence = false;
@@ -153,36 +226,57 @@ void run_scheduled_recurrent_functions ()
}
recurrent_fn_t* prev = nullptr;
- recurrent_fn_t* current = rFirst;
+ // prevent scheduling of new functions during this run
+ auto stop = rLast;
- while (current)
+ bool done;
+ do
{
- if (current->callNow && !current->mFunc())
+ 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)
{
- current = current->mNext;
prev->mNext = current;
}
else
{
- rFirst = rFirst->mNext;
- current = rFirst;
+ 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
index 50fc88fc8b..362d15b5f3 100644
--- a/cores/esp8266/Schedule.h
+++ b/cores/esp8266/Schedule.h
@@ -1,7 +1,26 @@
+/*
+ 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
@@ -10,7 +29,7 @@
// in user stack (called CONT stack) without the common restrictions from
// system context. Details are below.
-// The purpose of recurrent scheduled function is to independantly execute
+// 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()`.
@@ -20,6 +39,11 @@
// 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.
@@ -46,7 +70,7 @@ void run_scheduled_functions();
// recurrent scheduled function:
//
-// * Internal queue may not be a FIFO.
+// * 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
@@ -58,14 +82,15 @@ void run_scheduled_functions();
// functions. However a user function returning false will cancel itself.
// * Long running operations or yield() or delay() are not allowed in the
// recurrent function.
-// * A recurrent function currently must not schedule another recurrent
-// functions.
+// * 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);
+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 ();
+void run_scheduled_recurrent_functions();
#endif // ESP_SCHEDULE_H
diff --git a/cores/esp8266/StackThunk.cpp b/cores/esp8266/StackThunk.cpp
index 68e80278dc..baa793bdc5 100644
--- a/cores/esp8266/StackThunk.cpp
+++ b/cores/esp8266/StackThunk.cpp
@@ -26,17 +26,31 @@
#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;
-#define _stackSize (5748/4)
+/* 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 */
@@ -44,7 +58,19 @@ 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();
@@ -110,25 +136,59 @@ uint32_t stack_thunk_get_max_usage()
/* 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_top;
- while (pos < stack_thunk_ptr) {
+ 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_ptr) {
+ 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
index 874081a747..350775ec24 100644
--- a/cores/esp8266/StackThunk.h
+++ b/cores/esp8266/StackThunk.h
@@ -31,6 +31,8 @@
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();
@@ -41,7 +43,7 @@ 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_overflow();
+extern void stack_thunk_fatal_smashing();
// Globals required for thunking operation
extern uint32_t *stack_thunk_ptr;
@@ -51,7 +53,7 @@ extern uint32_t stack_thunk_refcnt;
// Thunking macro
#define make_stack_thunk(fcnToThunk) \
-__asm("\n\
+__asm__ ("\n\
.text\n\
.literal_position\n\
.literal .LC_STACK_VALUE"#fcnToThunk", 0xdeadbeef\n\
@@ -75,7 +77,7 @@ thunk_"#fcnToThunk":\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_overflow\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\
diff --git a/cores/esp8266/Stream.cpp b/cores/esp8266/Stream.cpp
index 3d7f5bc23f..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
@@ -57,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
}
}
@@ -140,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?
@@ -173,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
@@ -190,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();
@@ -210,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();
@@ -258,3 +261,46 @@ 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 fa786dddc3..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,26 +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;
- 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) {
@@ -103,13 +115,150 @@ class Stream: public Print {
// Arduino String functions to be added here
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
+
+size_t Stream::sendGeneric(Stream* to, const ssize_t len, const int readUntilChar,
+ const esp8266::polledTimeout::oneShotFastMs::timeType timeoutMs)
+{
+ // "neverExpires (default, impossible)" is translated to default timeout
+ esp8266::polledTimeout::oneShotFastMs::timeType inputTimeoutMs
+ = timeoutMs >= esp8266::polledTimeout::oneShotFastMs::neverExpires ? getTimeout()
+ : timeoutMs;
+
+ esp8266::polledTimeout::oneShotFastMs::timeType mainTimeoutMs = std::max(
+ inputTimeoutMs, (esp8266::polledTimeout::oneShotFastMs::timeType)to->getTimeout());
+
+ setReport(Report::Success);
+
+ if (len == 0)
+ {
+ return 0; // conveniently avoids timeout for no requested data
+ }
+
+ // There are two timeouts:
+ // - read (network, serial, ...)
+ // - write (network, serial, ...)
+ // However
+ // - getTimeout() is for reading only
+ // - there is no getOutputTimeout() api
+ // So we use getTimeout() for both,
+ // (also when inputCanTimeout() is false)
+
+ if (hasPeekBufferAPI())
+ {
+ return SendGenericPeekBuffer(to, len, readUntilChar, mainTimeoutMs);
+ }
+
+ if (readUntilChar >= 0)
+ {
+ return SendGenericRegularUntil(to, len, readUntilChar, mainTimeoutMs);
+ }
+
+ return SendGenericRegular(to, len, mainTimeoutMs);
+}
+
+size_t Stream::sendGeneric(Print* to, const ssize_t len, const int readUntilChar,
+ const esp8266::polledTimeout::oneShotFastMs::timeType timeoutMs)
+{
+ // "neverExpires (default, impossible)" is translated to default timeout
+ esp8266::polledTimeout::oneShotFastMs::timeType inputTimeoutMs
+ = timeoutMs >= esp8266::polledTimeout::oneShotFastMs::neverExpires ? getTimeout()
+ : timeoutMs;
+
+ setReport(Report::Success);
+
+ if (len == 0)
+ {
+ return 0; // conveniently avoids timeout for no requested data
+ }
+
+ // There are two timeouts:
+ // - read (network, serial, ...)
+ // - write (network, serial, ...)
+ // However
+ // - getTimeout() is for reading only
+ // - there is no getOutputTimeout() api
+ // So we use getTimeout() for both,
+ // (also when inputCanTimeout() is false)
+
+ if (hasPeekBufferAPI())
+ {
+ return SendGenericPeekBuffer(to, len, readUntilChar, inputTimeoutMs);
+ }
+
+ if (readUntilChar >= 0)
+ {
+ return SendGenericRegularUntil(to, len, readUntilChar, inputTimeoutMs);
+ }
+
+ return SendGenericRegular(to, len, inputTimeoutMs);
+}
+
+size_t
+Stream::SendGenericPeekBuffer(Print* to, const ssize_t len, const int readUntilChar,
+ const esp8266::polledTimeout::oneShotFastMs::timeType timeoutMs)
+{
+ esp8266::polledTimeout::oneShotFastMs timedOut(timeoutMs);
+
+ // len==-1 => maxLen=0 <=> until starvation
+ const size_t maxLen = std::max((ssize_t)0, len);
+ size_t written = 0;
+
+ while (!maxLen || written < maxLen)
+ {
+ size_t avpk = peekAvailable();
+ if (avpk == 0 && !inputCanTimeout())
+ {
+ // no more data to read, ever
+ break;
+ }
+
+ size_t w = to->availableForWrite();
+ if (w == 0 && !to->outputCanTimeout())
+ {
+ // no more data can be written, ever
+ break;
+ }
+
+ w = std::min(w, avpk);
+ if (maxLen)
+ {
+ w = std::min(w, maxLen - written);
+ }
+ if (w)
+ {
+ const char* directbuf = peekBuffer();
+ bool foundChar = false;
+ if (readUntilChar >= 0)
+ {
+ const char* last = (const char*)memchr(directbuf, readUntilChar, w);
+ if (last)
+ {
+ w = std::min((size_t)(last - directbuf), w);
+ foundChar = true;
+ }
+ }
+ if (w && ((w = to->write(directbuf, w))))
+ {
+ peekConsume(w);
+ written += w;
+ timedOut.reset(); // something has been written
+ }
+ if (foundChar)
+ {
+ peekConsume(1);
+ break;
+ }
+ }
+
+ if (timedOut)
+ {
+ // either (maxLen>0) nothing has been transferred for too long
+ // or readUntilChar >= 0 but char is not encountered for too long
+ // or (maxLen=0) too much time has been spent here
+ break;
+ }
+
+ optimistic_yield(1000);
+ }
+
+ if (getLastSendReport() == Report::Success && maxLen > 0)
+ {
+ if (timeoutMs && timedOut)
+ {
+ setReport(Report::TimedOut);
+ }
+ else if ((ssize_t)written != len)
+ {
+ // This is happening when source cannot timeout (ex: a String)
+ // but has not enough data, or a dest has closed or cannot
+ // timeout but is too small (String, buffer...)
+ //
+ // Mark it as an error because user usually wants to get what is
+ // asked for.
+ setReport(Report::ShortOperation);
+ }
+ }
+
+ return written;
+}
+
+size_t
+Stream::SendGenericRegularUntil(Print* to, const ssize_t len, const int readUntilChar,
+ const esp8266::polledTimeout::oneShotFastMs::timeType timeoutMs)
+{
+ // regular Stream API
+ // no other choice than reading byte by byte
+
+ esp8266::polledTimeout::oneShotFastMs timedOut(timeoutMs);
+
+ // len==-1 => maxLen=0 <=> until starvation
+ const size_t maxLen = std::max((ssize_t)0, len);
+ size_t written = 0;
+
+ while (!maxLen || written < maxLen)
+ {
+ size_t avr = available();
+ if (avr == 0 && !inputCanTimeout())
+ {
+ // no more data to read, ever
+ break;
+ }
+
+ size_t w = to->availableForWrite();
+ if (w == 0 && !to->outputCanTimeout())
+ {
+ // no more data can be written, ever
+ break;
+ }
+
+ int c = read();
+ if (c != -1)
+ {
+ if (c == readUntilChar)
+ {
+ break;
+ }
+ w = to->write(c);
+ if (w != 1)
+ {
+ setReport(Report::WriteError);
+ break;
+ }
+ written += 1;
+ timedOut.reset(); // something has been written
+ }
+
+ if (timedOut)
+ {
+ // either (maxLen>0) nothing has been transferred for too long
+ // or readUntilChar >= 0 but char is not encountered for too long
+ // or (maxLen=0) too much time has been spent here
+ break;
+ }
+
+ optimistic_yield(1000);
+ }
+
+ if (getLastSendReport() == Report::Success && maxLen > 0)
+ {
+ if (timeoutMs && timedOut)
+ {
+ setReport(Report::TimedOut);
+ }
+ else if ((ssize_t)written != len)
+ {
+ // This is happening when source cannot timeout (ex: a String)
+ // but has not enough data, or a dest has closed or cannot
+ // timeout but is too small (String, buffer...)
+ //
+ // Mark it as an error because user usually wants to get what is
+ // asked for.
+ setReport(Report::ShortOperation);
+ }
+ }
+
+ return written;
+}
+
+size_t Stream::SendGenericRegular(Print* to, const ssize_t len,
+ const esp8266::polledTimeout::oneShotFastMs::timeType timeoutMs)
+{
+ // regular Stream API
+ // use an intermediary buffer
+
+ esp8266::polledTimeout::oneShotFastMs timedOut(timeoutMs);
+
+ // len==-1 => maxLen=0 <=> until starvation
+ const size_t maxLen = std::max((ssize_t)0, len);
+ size_t written = 0;
+
+ while (!maxLen || written < maxLen)
+ {
+ size_t avr = available();
+ if (avr == 0 && !inputCanTimeout())
+ {
+ // no more data to read, ever
+ break;
+ }
+
+ size_t w = to->availableForWrite();
+ if (w == 0 && !to->outputCanTimeout())
+ // no more data can be written, ever
+ {
+ break;
+ }
+
+ w = std::min(w, avr);
+ if (maxLen)
+ {
+ w = std::min(w, maxLen - written);
+ }
+ w = std::min(w, (decltype(w))temporaryStackBufferSize);
+ if (w)
+ {
+ char temp[w];
+ ssize_t r = read(temp, w);
+ if (r < 0)
+ {
+ setReport(Report::ReadError);
+ break;
+ }
+ w = to->write(temp, r);
+ written += w;
+ if ((size_t)r != w)
+ {
+ setReport(Report::WriteError);
+ break;
+ }
+ timedOut.reset(); // something has been written
+ }
+
+ if (timedOut)
+ {
+ // either (maxLen>0) nothing has been transferred for too long
+ // or readUntilChar >= 0 but char is not encountered for too long
+ // or (maxLen=0) too much time has been spent here
+ break;
+ }
+
+ optimistic_yield(1000);
+ }
+
+ if (getLastSendReport() == Report::Success && maxLen > 0)
+ {
+ if (timeoutMs && timedOut)
+ {
+ setReport(Report::TimedOut);
+ }
+ else if ((ssize_t)written != len)
+ {
+ // This is happening when source cannot timeout (ex: a String)
+ // but has not enough data, or a dest has closed or cannot
+ // timeout but is too small (String, buffer...)
+ //
+ // Mark it as an error because user usually wants to get what is
+ // asked for.
+ setReport(Report::ShortOperation);
+ }
+ }
+
+ return written;
+}
+
+Stream& operator<<(Stream& out, String& string)
+{
+ StreamConstPtr(string).sendAll(out);
+ return out;
+}
+
+Stream& operator<<(Stream& out, StreamString& stream)
+{
+ stream.sendAll(out);
+ return out;
+}
+
+Stream& operator<<(Stream& out, Stream& stream)
+{
+ if (stream.streamRemaining() < 0)
+ {
+ if (stream.inputCanTimeout())
+ {
+ // restrict with only what's buffered on input
+ stream.sendAvailable(out);
+ }
+ else
+ {
+ // take all what is in input
+ stream.sendAll(out);
+ }
+ }
+ else
+ {
+ stream.sendSize(out, stream.streamRemaining());
+ }
+ return out;
+}
+
+Stream& operator<<(Stream& out, const char* text)
+{
+ StreamConstPtr(text, strlen_P(text)).sendAll(out);
+ return out;
+}
+
+Stream& operator<<(Stream& out, const __FlashStringHelper* text)
+{
+ StreamConstPtr(text).sendAll(out);
+ return out;
+}
+
+#if !defined(NO_GLOBAL_INSTANCES) && !defined(NO_GLOBAL_STREAMDEV)
+StreamNull devnull;
+#endif
diff --git a/cores/esp8266/StreamString.cpp b/cores/esp8266/StreamString.cpp
deleted file mode 100644
index 24cfe0dd1a..0000000000
--- a/cores/esp8266/StreamString.cpp
+++ /dev/null
@@ -1,68 +0,0 @@
-/**
- StreamString.cpp
-
- Copyright (c) 2015 Markus Sattler. 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 "StreamString.h"
-
-size_t StreamString::write(const uint8_t *data, size_t size) {
- if(size && data) {
- const unsigned int newlen = length() + size;
- if(reserve(newlen + 1)) {
- memcpy((void *) (wbuffer() + len()), (const void *) data, size);
- setLen(newlen);
- *(wbuffer() + newlen) = 0x00; // add null for string end
- return size;
- }
- DEBUGV(":stream2string: OOM (%d->%d)\n", length(), newlen+1);
- }
- return 0;
-}
-
-size_t StreamString::write(uint8_t data) {
- return concat((char) data);
-}
-
-int StreamString::available() {
- return length();
-}
-
-int StreamString::read() {
- if(length()) {
- char c = charAt(0);
- remove(0, 1);
- return c;
-
- }
- return -1;
-}
-
-int StreamString::peek() {
- if(length()) {
- char c = charAt(0);
- return c;
- }
- return -1;
-}
-
-void StreamString::flush() {
-}
-
diff --git a/cores/esp8266/StreamString.h b/cores/esp8266/StreamString.h
index 2e81fa14a0..dced5aee80 100644
--- a/cores/esp8266/StreamString.h
+++ b/cores/esp8266/StreamString.h
@@ -1,39 +1,290 @@
/**
- StreamString.h
+ StreamString.h
- Copyright (c) 2015 Markus Sattler. All rights reserved.
- This file is part of the esp8266 core for Arduino environment.
+ Copyright (c) 2020 D. Gauchard. 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 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.
+ 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
+ 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 STREAMSTRING_H_
-#define STREAMSTRING_H_
+#ifndef __STREAMSTRING_H
+#define __STREAMSTRING_H
+#include
+#include
+#include "Stream.h"
+#include "WString.h"
-class StreamString: public Stream, public String {
+///////////////////////////////////////////////////////////////
+// S2Stream ("String to Stream") points to a String and makes it a Stream
+// (it is also the helper for StreamString)
+
+class S2Stream: public Stream
+{
public:
- size_t write(const uint8_t *buffer, size_t size) override;
- size_t write(uint8_t data) override;
+ S2Stream(String& string, int peekPointer = -1) : string(&string), peekPointer(peekPointer) { }
+
+ S2Stream(String* string, int peekPointer = -1) : string(string), peekPointer(peekPointer) { }
+
+ virtual int available() override
+ {
+ return string->length();
+ }
+
+ virtual int availableForWrite() override
+ {
+ return std::numeric_limits::max();
+ }
+
+ virtual int read() override
+ {
+ if (peekPointer < 0)
+ {
+ // consume chars
+ if (string->length())
+ {
+ char c = string->charAt(0);
+ string->remove(0, 1);
+ return c;
+ }
+ }
+ else if (peekPointer < (int)string->length())
+ {
+ // return pointed and move pointer
+ return string->charAt(peekPointer++);
+ }
+
+ // everything is read
+ return -1;
+ }
+
+ virtual size_t write(uint8_t data) override
+ {
+ return string->concat((char)data);
+ }
+
+ virtual int read(uint8_t* buffer, size_t len) override
+ {
+ if (peekPointer < 0)
+ {
+ // string will be consumed
+ size_t l = std::min(len, (size_t)string->length());
+ memcpy(buffer, string->c_str(), l);
+ string->remove(0, l);
+ return l;
+ }
+
+ if (peekPointer >= (int)string->length())
+ {
+ return 0;
+ }
+
+ // only the pointer is moved
+ size_t l = std::min(len, (size_t)(string->length() - peekPointer));
+ memcpy(buffer, string->c_str() + peekPointer, l);
+ peekPointer += l;
+ return l;
+ }
+
+ virtual size_t write(const uint8_t* buffer, size_t len) override
+ {
+ return string->concat((const char*)buffer, len) ? len : 0;
+ }
+
+ virtual int peek() override
+ {
+ if (peekPointer < 0)
+ {
+ if (string->length())
+ {
+ return string->charAt(0);
+ }
+ }
+ else if (peekPointer < (int)string->length())
+ {
+ return string->charAt(peekPointer);
+ }
+
+ return -1;
+ }
+
+ virtual void flush() override
+ {
+ // nothing to do
+ }
+
+ virtual bool inputCanTimeout() override
+ {
+ return false;
+ }
+
+ virtual bool outputCanTimeout() override
+ {
+ return false;
+ }
+
+ //// Stream's peekBufferAPI
+
+ virtual bool hasPeekBufferAPI() const override
+ {
+ return true;
+ }
- int available() override;
- int read() override;
- int peek() override;
- void flush() override;
+ virtual size_t peekAvailable()
+ {
+ if (peekPointer < 0)
+ {
+ return string->length();
+ }
+ return string->length() - peekPointer;
+ }
+
+ virtual const char* peekBuffer() override
+ {
+ if (peekPointer < 0)
+ {
+ return string->c_str();
+ }
+ if (peekPointer < (int)string->length())
+ {
+ return string->c_str() + peekPointer;
+ }
+ return nullptr;
+ }
+
+ virtual void peekConsume(size_t consume) override
+ {
+ if (peekPointer < 0)
+ {
+ // string is really consumed
+ string->remove(0, consume);
+ }
+ else
+ {
+ // only the pointer is moved
+ peekPointer = std::min((size_t)string->length(), peekPointer + consume);
+ }
+ }
+
+ virtual ssize_t streamRemaining() override
+ {
+ return peekPointer < 0 ? string->length() : string->length() - peekPointer;
+ }
+
+ // calling setConsume() will make the string consumed as the stream is read.
+ // (default behaviour)
+ void setConsume()
+ {
+ peekPointer = -1;
+ }
+
+ // Calling resetPointer() resets the read cursor and allows rereading.
+ // (this is the opposite of default mode set by setConsume())
+ void resetPointer(size_t pointer = 0)
+ {
+ peekPointer = std::min(pointer, (size_t)string->length());
+ }
+
+protected:
+ String* string;
+ int peekPointer; // -1:String is consumed / >=0:resettable pointer
};
+///////////////////////////////////////////////////////////////
+// StreamString is a S2Stream holding the String
+
+class StreamString: public String, public S2Stream
+{
+protected:
+ void resetpp()
+ {
+ if (peekPointer > 0)
+ {
+ peekPointer = 0;
+ }
+ }
+
+public:
+ StreamString(StreamString&& bro) : String(bro), S2Stream(this) { }
+ StreamString(const StreamString& bro) : String(bro), S2Stream(this) { }
+
+ // duplicate String constructors and operator=:
+
+ StreamString(const char* text = nullptr) : String(text), S2Stream(this) { }
+ StreamString(const String& string) : String(string), S2Stream(this) { }
+ StreamString(const __FlashStringHelper* str) : String(str), S2Stream(this) { }
+ StreamString(String&& string) : String(string), S2Stream(this) { }
+
+ explicit StreamString(char c) : String(c), S2Stream(this) { }
+ explicit StreamString(unsigned char c, unsigned char base = 10) :
+ String(c, base), S2Stream(this)
+ {
+ }
+ explicit StreamString(int i, unsigned char base = 10) : String(i, base), S2Stream(this) { }
+ explicit StreamString(unsigned int i, unsigned char base = 10) : String(i, base), S2Stream(this)
+ {
+ }
+ explicit StreamString(long l, unsigned char base = 10) : String(l, base), S2Stream(this) { }
+ explicit StreamString(unsigned long l, unsigned char base = 10) :
+ String(l, base), S2Stream(this)
+ {
+ }
+ explicit StreamString(float f, unsigned char decimalPlaces = 2) :
+ String(f, decimalPlaces), S2Stream(this)
+ {
+ }
+ explicit StreamString(double d, unsigned char decimalPlaces = 2) :
+ String(d, decimalPlaces), S2Stream(this)
+ {
+ }
+
+ StreamString& operator=(const StreamString& rhs)
+ {
+ String::operator=(rhs);
+ resetpp();
+ return *this;
+ }
+
+ StreamString& operator=(const String& rhs)
+ {
+ String::operator=(rhs);
+ resetpp();
+ return *this;
+ }
+
+ StreamString& operator=(const char* cstr)
+ {
+ String::operator=(cstr);
+ resetpp();
+ return *this;
+ }
+
+ StreamString& operator=(const __FlashStringHelper* str)
+ {
+ String::operator=(str);
+ resetpp();
+ return *this;
+ }
+
+ StreamString& operator=(String&& rval)
+ {
+ String::operator=(rval);
+ resetpp();
+ return *this;
+ }
+};
-#endif /* STREAMSTRING_H_ */
+#endif // __STREAMSTRING_H
diff --git a/cores/esp8266/TZ.h b/cores/esp8266/TZ.h
index 95b609e614..478abb16c0 100644
--- a/cores/esp8266/TZ.h
+++ b/cores/esp8266/TZ.h
@@ -1,21 +1,16 @@
+// ! ! ! DO NOT EDIT, AUTOMATICALLY GENERATED ! ! !
+// File created 2024-02-05 00:00:00.000000+00:00
+// Based on IANA database 2023d
+// Re-run /tools/tools/format_tzdata.py to update
-// autogenerated from https://raw.githubusercontent.com/nayarsystems/posix_tz_db/master/zones.csv
-// by script /tools/TZupdate.sh
-// Mon Sep 9 20:58:30 UTC 2019
-//
-// This database is autogenerated from IANA timezone database
-// https://www.iana.org/time-zones
-// and can be updated on demand in this repository
-// or by yourself using the above script
-
-#ifndef TZDB_H
-#define TZDB_H
+#pragma once
#define TZ_Africa_Abidjan PSTR("GMT0")
#define TZ_Africa_Accra PSTR("GMT0")
#define TZ_Africa_Addis_Ababa PSTR("EAT-3")
#define TZ_Africa_Algiers PSTR("CET-1")
#define TZ_Africa_Asmara PSTR("EAT-3")
+#define TZ_Africa_Asmera PSTR("EAT-3")
#define TZ_Africa_Bamako PSTR("GMT0")
#define TZ_Africa_Bangui PSTR("WAT-1")
#define TZ_Africa_Banjul PSTR("GMT0")
@@ -23,7 +18,7 @@
#define TZ_Africa_Blantyre PSTR("CAT-2")
#define TZ_Africa_Brazzaville PSTR("WAT-1")
#define TZ_Africa_Bujumbura PSTR("CAT-2")
-#define TZ_Africa_Cairo PSTR("EET-2")
+#define TZ_Africa_Cairo PSTR("EET-2EEST,M4.5.5/0,M10.5.4/24")
#define TZ_Africa_Casablanca PSTR("<+01>-1")
#define TZ_Africa_Ceuta PSTR("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Africa_Conakry PSTR("GMT0")
@@ -36,7 +31,7 @@
#define TZ_Africa_Gaborone PSTR("CAT-2")
#define TZ_Africa_Harare PSTR("CAT-2")
#define TZ_Africa_Johannesburg PSTR("SAST-2")
-#define TZ_Africa_Juba PSTR("EAT-3")
+#define TZ_Africa_Juba PSTR("CAT-2")
#define TZ_Africa_Kampala PSTR("EAT-3")
#define TZ_Africa_Khartoum PSTR("CAT-2")
#define TZ_Africa_Kigali PSTR("CAT-2")
@@ -60,6 +55,7 @@
#define TZ_Africa_Ouagadougou PSTR("GMT0")
#define TZ_Africa_PortomNovo PSTR("WAT-1")
#define TZ_Africa_Sao_Tome PSTR("GMT0")
+#define TZ_Africa_Timbuktu PSTR("GMT0")
#define TZ_Africa_Tripoli PSTR("EET-2")
#define TZ_Africa_Tunis PSTR("CET-1")
#define TZ_Africa_Windhoek PSTR("CAT-2")
@@ -70,6 +66,7 @@
#define TZ_America_Araguaina PSTR("<-03>3")
#define TZ_America_Argentina_Buenos_Aires PSTR("<-03>3")
#define TZ_America_Argentina_Catamarca PSTR("<-03>3")
+#define TZ_America_Argentina_ComodRivadavia PSTR("<-03>3")
#define TZ_America_Argentina_Cordoba PSTR("<-03>3")
#define TZ_America_Argentina_Jujuy PSTR("<-03>3")
#define TZ_America_Argentina_La_Rioja PSTR("<-03>3")
@@ -83,8 +80,9 @@
#define TZ_America_Aruba PSTR("AST4")
#define TZ_America_Asuncion PSTR("<-04>4<-03>,M10.1.0/0,M3.4.0/0")
#define TZ_America_Atikokan PSTR("EST5")
+#define TZ_America_Atka PSTR("HST10HDT,M3.2.0,M11.1.0")
#define TZ_America_Bahia PSTR("<-03>3")
-#define TZ_America_Bahia_Banderas PSTR("CST6CDT,M4.1.0,M10.5.0")
+#define TZ_America_Bahia_Banderas PSTR("CST6")
#define TZ_America_Barbados PSTR("AST4")
#define TZ_America_Belem PSTR("<-03>3")
#define TZ_America_Belize PSTR("CST6")
@@ -92,20 +90,25 @@
#define TZ_America_Boa_Vista PSTR("<-04>4")
#define TZ_America_Bogota PSTR("<-05>5")
#define TZ_America_Boise PSTR("MST7MDT,M3.2.0,M11.1.0")
+#define TZ_America_Buenos_Aires PSTR("<-03>3")
#define TZ_America_Cambridge_Bay PSTR("MST7MDT,M3.2.0,M11.1.0")
#define TZ_America_Campo_Grande PSTR("<-04>4")
#define TZ_America_Cancun PSTR("EST5")
#define TZ_America_Caracas PSTR("<-04>4")
+#define TZ_America_Catamarca PSTR("<-03>3")
#define TZ_America_Cayenne PSTR("<-03>3")
#define TZ_America_Cayman PSTR("EST5")
#define TZ_America_Chicago PSTR("CST6CDT,M3.2.0,M11.1.0")
-#define TZ_America_Chihuahua PSTR("MST7MDT,M4.1.0,M10.5.0")
+#define TZ_America_Chihuahua PSTR("CST6")
+#define TZ_America_Ciudad_Juarez PSTR("MST7MDT,M3.2.0,M11.1.0")
+#define TZ_America_Coral_Harbour PSTR("EST5")
+#define TZ_America_Cordoba PSTR("<-03>3")
#define TZ_America_Costa_Rica PSTR("CST6")
#define TZ_America_Creston PSTR("MST7")
#define TZ_America_Cuiaba PSTR("<-04>4")
#define TZ_America_Curacao PSTR("AST4")
#define TZ_America_Danmarkshavn PSTR("GMT0")
-#define TZ_America_Dawson PSTR("PST8PDT,M3.2.0,M11.1.0")
+#define TZ_America_Dawson PSTR("MST7")
#define TZ_America_Dawson_Creek PSTR("MST7")
#define TZ_America_Denver PSTR("MST7MDT,M3.2.0,M11.1.0")
#define TZ_America_Detroit PSTR("EST5EDT,M3.2.0,M11.1.0")
@@ -113,10 +116,12 @@
#define TZ_America_Edmonton PSTR("MST7MDT,M3.2.0,M11.1.0")
#define TZ_America_Eirunepe PSTR("<-05>5")
#define TZ_America_El_Salvador PSTR("CST6")
-#define TZ_America_Fortaleza PSTR("<-03>3")
+#define TZ_America_Ensenada PSTR("PST8PDT,M3.2.0,M11.1.0")
#define TZ_America_Fort_Nelson PSTR("MST7")
+#define TZ_America_Fort_Wayne PSTR("EST5EDT,M3.2.0,M11.1.0")
+#define TZ_America_Fortaleza PSTR("<-03>3")
#define TZ_America_Glace_Bay PSTR("AST4ADT,M3.2.0,M11.1.0")
-#define TZ_America_Godthab PSTR("<-03>3<-02>,M3.5.0/-2,M10.5.0/-1")
+#define TZ_America_Godthab PSTR("<-02>2<-01>,M3.5.0/-1,M10.5.0/0")
#define TZ_America_Goose_Bay PSTR("AST4ADT,M3.2.0,M11.1.0")
#define TZ_America_Grand_Turk PSTR("EST5EDT,M3.2.0,M11.1.0")
#define TZ_America_Grenada PSTR("AST4")
@@ -135,16 +140,20 @@
#define TZ_America_Indiana_Vevay PSTR("EST5EDT,M3.2.0,M11.1.0")
#define TZ_America_Indiana_Vincennes PSTR("EST5EDT,M3.2.0,M11.1.0")
#define TZ_America_Indiana_Winamac PSTR("EST5EDT,M3.2.0,M11.1.0")
+#define TZ_America_Indianapolis PSTR("EST5EDT,M3.2.0,M11.1.0")
#define TZ_America_Inuvik PSTR("MST7MDT,M3.2.0,M11.1.0")
#define TZ_America_Iqaluit PSTR("EST5EDT,M3.2.0,M11.1.0")
#define TZ_America_Jamaica PSTR("EST5")
+#define TZ_America_Jujuy PSTR("<-03>3")
#define TZ_America_Juneau PSTR("AKST9AKDT,M3.2.0,M11.1.0")
#define TZ_America_Kentucky_Louisville PSTR("EST5EDT,M3.2.0,M11.1.0")
#define TZ_America_Kentucky_Monticello PSTR("EST5EDT,M3.2.0,M11.1.0")
+#define TZ_America_Knox_IN PSTR("CST6CDT,M3.2.0,M11.1.0")
#define TZ_America_Kralendijk PSTR("AST4")
#define TZ_America_La_Paz PSTR("<-04>4")
#define TZ_America_Lima PSTR("<-05>5")
#define TZ_America_Los_Angeles PSTR("PST8PDT,M3.2.0,M11.1.0")
+#define TZ_America_Louisville PSTR("EST5EDT,M3.2.0,M11.1.0")
#define TZ_America_Lower_Princes PSTR("AST4")
#define TZ_America_Maceio PSTR("<-03>3")
#define TZ_America_Managua PSTR("CST6")
@@ -152,14 +161,15 @@
#define TZ_America_Marigot PSTR("AST4")
#define TZ_America_Martinique PSTR("AST4")
#define TZ_America_Matamoros PSTR("CST6CDT,M3.2.0,M11.1.0")
-#define TZ_America_Mazatlan PSTR("MST7MDT,M4.1.0,M10.5.0")
+#define TZ_America_Mazatlan PSTR("MST7")
+#define TZ_America_Mendoza PSTR("<-03>3")
#define TZ_America_Menominee PSTR("CST6CDT,M3.2.0,M11.1.0")
-#define TZ_America_Merida PSTR("CST6CDT,M4.1.0,M10.5.0")
+#define TZ_America_Merida PSTR("CST6")
#define TZ_America_Metlakatla PSTR("AKST9AKDT,M3.2.0,M11.1.0")
-#define TZ_America_Mexico_City PSTR("CST6CDT,M4.1.0,M10.5.0")
+#define TZ_America_Mexico_City PSTR("CST6")
#define TZ_America_Miquelon PSTR("<-03>3<-02>,M3.2.0,M11.1.0")
#define TZ_America_Moncton PSTR("AST4ADT,M3.2.0,M11.1.0")
-#define TZ_America_Monterrey PSTR("CST6CDT,M4.1.0,M10.5.0")
+#define TZ_America_Monterrey PSTR("CST6")
#define TZ_America_Montevideo PSTR("<-03>3")
#define TZ_America_Montreal PSTR("EST5EDT,M3.2.0,M11.1.0")
#define TZ_America_Montserrat PSTR("AST4")
@@ -171,13 +181,15 @@
#define TZ_America_North_Dakota_Beulah PSTR("CST6CDT,M3.2.0,M11.1.0")
#define TZ_America_North_Dakota_Center PSTR("CST6CDT,M3.2.0,M11.1.0")
#define TZ_America_North_Dakota_New_Salem PSTR("CST6CDT,M3.2.0,M11.1.0")
-#define TZ_America_Ojinaga PSTR("MST7MDT,M3.2.0,M11.1.0")
+#define TZ_America_Nuuk PSTR("<-02>2<-01>,M3.5.0/-1,M10.5.0/0")
+#define TZ_America_Ojinaga PSTR("CST6CDT,M3.2.0,M11.1.0")
#define TZ_America_Panama PSTR("EST5")
#define TZ_America_Pangnirtung PSTR("EST5EDT,M3.2.0,M11.1.0")
#define TZ_America_Paramaribo PSTR("<-03>3")
#define TZ_America_Phoenix PSTR("MST7")
#define TZ_America_PortmaumPrince PSTR("EST5EDT,M3.2.0,M11.1.0")
#define TZ_America_Port_of_Spain PSTR("AST4")
+#define TZ_America_Porto_Acre PSTR("<-05>5")
#define TZ_America_Porto_Velho PSTR("<-04>4")
#define TZ_America_Puerto_Rico PSTR("AST4")
#define TZ_America_Punta_Arenas PSTR("<-03>3")
@@ -187,11 +199,14 @@
#define TZ_America_Regina PSTR("CST6")
#define TZ_America_Resolute PSTR("CST6CDT,M3.2.0,M11.1.0")
#define TZ_America_Rio_Branco PSTR("<-05>5")
+#define TZ_America_Rosario PSTR("<-03>3")
+#define TZ_America_Santa_Isabel PSTR("PST8PDT,M3.2.0,M11.1.0")
#define TZ_America_Santarem PSTR("<-03>3")
#define TZ_America_Santiago PSTR("<-04>4<-03>,M9.1.6/24,M4.1.6/24")
#define TZ_America_Santo_Domingo PSTR("AST4")
#define TZ_America_Sao_Paulo PSTR("<-03>3")
-#define TZ_America_Scoresbysund PSTR("<-01>1<+00>,M3.5.0/0,M10.5.0/1")
+#define TZ_America_Scoresbysund PSTR("<-02>2<-01>,M3.5.0/-1,M10.5.0/0")
+#define TZ_America_Shiprock PSTR("MST7MDT,M3.2.0,M11.1.0")
#define TZ_America_Sitka PSTR("AKST9AKDT,M3.2.0,M11.1.0")
#define TZ_America_St_Barthelemy PSTR("AST4")
#define TZ_America_St_Johns PSTR("NST3:30NDT,M3.2.0,M11.1.0")
@@ -207,29 +222,32 @@
#define TZ_America_Toronto PSTR("EST5EDT,M3.2.0,M11.1.0")
#define TZ_America_Tortola PSTR("AST4")
#define TZ_America_Vancouver PSTR("PST8PDT,M3.2.0,M11.1.0")
-#define TZ_America_Whitehorse PSTR("PST8PDT,M3.2.0,M11.1.0")
+#define TZ_America_Virgin PSTR("AST4")
+#define TZ_America_Whitehorse PSTR("MST7")
#define TZ_America_Winnipeg PSTR("CST6CDT,M3.2.0,M11.1.0")
#define TZ_America_Yakutat PSTR("AKST9AKDT,M3.2.0,M11.1.0")
#define TZ_America_Yellowknife PSTR("MST7MDT,M3.2.0,M11.1.0")
#define TZ_Antarctica_Casey PSTR("<+08>-8")
#define TZ_Antarctica_Davis PSTR("<+07>-7")
#define TZ_Antarctica_DumontDUrville PSTR("<+10>-10")
-#define TZ_Antarctica_Macquarie PSTR("<+11>-11")
+#define TZ_Antarctica_Macquarie PSTR("AEST-10AEDT,M10.1.0,M4.1.0/3")
#define TZ_Antarctica_Mawson PSTR("<+05>-5")
#define TZ_Antarctica_McMurdo PSTR("NZST-12NZDT,M9.5.0,M4.1.0/3")
#define TZ_Antarctica_Palmer PSTR("<-03>3")
#define TZ_Antarctica_Rothera PSTR("<-03>3")
+#define TZ_Antarctica_South_Pole PSTR("NZST-12NZDT,M9.5.0,M4.1.0/3")
#define TZ_Antarctica_Syowa PSTR("<+03>-3")
#define TZ_Antarctica_Troll PSTR("<+00>0<+02>-2,M3.5.0/1,M10.5.0/3")
-#define TZ_Antarctica_Vostok PSTR("<+06>-6")
+#define TZ_Antarctica_Vostok PSTR("<+05>-5")
#define TZ_Arctic_Longyearbyen PSTR("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Asia_Aden PSTR("<+03>-3")
#define TZ_Asia_Almaty PSTR("<+06>-6")
-#define TZ_Asia_Amman PSTR("EET-2EEST,M3.5.4/24,M10.5.5/1")
+#define TZ_Asia_Amman PSTR("<+03>-3")
#define TZ_Asia_Anadyr PSTR("<+12>-12")
#define TZ_Asia_Aqtau PSTR("<+05>-5")
#define TZ_Asia_Aqtobe PSTR("<+05>-5")
#define TZ_Asia_Ashgabat PSTR("<+05>-5")
+#define TZ_Asia_Ashkhabad PSTR("<+05>-5")
#define TZ_Asia_Atyrau PSTR("<+05>-5")
#define TZ_Asia_Baghdad PSTR("<+03>-3")
#define TZ_Asia_Bahrain PSTR("<+03>-3")
@@ -239,34 +257,43 @@
#define TZ_Asia_Beirut PSTR("EET-2EEST,M3.5.0/0,M10.5.0/0")
#define TZ_Asia_Bishkek PSTR("<+06>-6")
#define TZ_Asia_Brunei PSTR("<+08>-8")
+#define TZ_Asia_Calcutta PSTR("IST-5:30")
#define TZ_Asia_Chita PSTR("<+09>-9")
#define TZ_Asia_Choibalsan PSTR("<+08>-8")
+#define TZ_Asia_Chongqing PSTR("CST-8")
+#define TZ_Asia_Chungking PSTR("CST-8")
#define TZ_Asia_Colombo PSTR("<+0530>-5:30")
-#define TZ_Asia_Damascus PSTR("EET-2EEST,M3.5.5/0,M10.5.5/0")
+#define TZ_Asia_Dacca PSTR("<+06>-6")
+#define TZ_Asia_Damascus PSTR("<+03>-3")
#define TZ_Asia_Dhaka PSTR("<+06>-6")
#define TZ_Asia_Dili PSTR("<+09>-9")
#define TZ_Asia_Dubai PSTR("<+04>-4")
#define TZ_Asia_Dushanbe PSTR("<+05>-5")
#define TZ_Asia_Famagusta PSTR("EET-2EEST,M3.5.0/3,M10.5.0/4")
-#define TZ_Asia_Gaza PSTR("EET-2EEST,M3.5.5/0,M10.5.6/1")
-#define TZ_Asia_Hebron PSTR("EET-2EEST,M3.5.5/0,M10.5.6/1")
+#define TZ_Asia_Gaza PSTR("EET-2EEST,M3.4.4/50,M10.4.4/50")
+#define TZ_Asia_Harbin PSTR("CST-8")
+#define TZ_Asia_Hebron PSTR("EET-2EEST,M3.4.4/50,M10.4.4/50")
#define TZ_Asia_Ho_Chi_Minh PSTR("<+07>-7")
#define TZ_Asia_Hong_Kong PSTR("HKT-8")
#define TZ_Asia_Hovd PSTR("<+07>-7")
#define TZ_Asia_Irkutsk PSTR("<+08>-8")
+#define TZ_Asia_Istanbul PSTR("<+03>-3")
#define TZ_Asia_Jakarta PSTR("WIB-7")
#define TZ_Asia_Jayapura PSTR("WIT-9")
#define TZ_Asia_Jerusalem PSTR("IST-2IDT,M3.4.4/26,M10.5.0")
#define TZ_Asia_Kabul PSTR("<+0430>-4:30")
#define TZ_Asia_Kamchatka PSTR("<+12>-12")
#define TZ_Asia_Karachi PSTR("PKT-5")
+#define TZ_Asia_Kashgar PSTR("<+06>-6")
#define TZ_Asia_Kathmandu PSTR("<+0545>-5:45")
+#define TZ_Asia_Katmandu PSTR("<+0545>-5:45")
#define TZ_Asia_Khandyga PSTR("<+09>-9")
#define TZ_Asia_Kolkata PSTR("IST-5:30")
#define TZ_Asia_Krasnoyarsk PSTR("<+07>-7")
#define TZ_Asia_Kuala_Lumpur PSTR("<+08>-8")
#define TZ_Asia_Kuching PSTR("<+08>-8")
#define TZ_Asia_Kuwait PSTR("<+03>-3")
+#define TZ_Asia_Macao PSTR("CST-8")
#define TZ_Asia_Macau PSTR("CST-8")
#define TZ_Asia_Magadan PSTR("<+11>-11")
#define TZ_Asia_Makassar PSTR("WITA-8")
@@ -281,8 +308,11 @@
#define TZ_Asia_Pontianak PSTR("WIB-7")
#define TZ_Asia_Pyongyang PSTR("KST-9")
#define TZ_Asia_Qatar PSTR("<+03>-3")
+#define TZ_Asia_Qostanay PSTR("<+06>-6")
#define TZ_Asia_Qyzylorda PSTR("<+05>-5")
+#define TZ_Asia_Rangoon PSTR("<+0630>-6:30")
#define TZ_Asia_Riyadh PSTR("<+03>-3")
+#define TZ_Asia_Saigon PSTR("<+07>-7")
#define TZ_Asia_Sakhalin PSTR("<+11>-11")
#define TZ_Asia_Samarkand PSTR("<+05>-5")
#define TZ_Asia_Seoul PSTR("KST-9")
@@ -292,11 +322,15 @@
#define TZ_Asia_Taipei PSTR("CST-8")
#define TZ_Asia_Tashkent PSTR("<+05>-5")
#define TZ_Asia_Tbilisi PSTR("<+04>-4")
-#define TZ_Asia_Tehran PSTR("<+0330>-3:30<+0430>,J79/24,J263/24")
+#define TZ_Asia_Tehran PSTR("<+0330>-3:30")
+#define TZ_Asia_Tel_Aviv PSTR("IST-2IDT,M3.4.4/26,M10.5.0")
+#define TZ_Asia_Thimbu PSTR("<+06>-6")
#define TZ_Asia_Thimphu PSTR("<+06>-6")
#define TZ_Asia_Tokyo PSTR("JST-9")
#define TZ_Asia_Tomsk PSTR("<+07>-7")
+#define TZ_Asia_Ujung_Pandang PSTR("WITA-8")
#define TZ_Asia_Ulaanbaatar PSTR("<+08>-8")
+#define TZ_Asia_Ulan_Bator PSTR("<+08>-8")
#define TZ_Asia_Urumqi PSTR("<+06>-6")
#define TZ_Asia_UstmNera PSTR("<+10>-10")
#define TZ_Asia_Vientiane PSTR("<+07>-7")
@@ -309,28 +343,99 @@
#define TZ_Atlantic_Bermuda PSTR("AST4ADT,M3.2.0,M11.1.0")
#define TZ_Atlantic_Canary PSTR("WET0WEST,M3.5.0/1,M10.5.0")
#define TZ_Atlantic_Cape_Verde PSTR("<-01>1")
+#define TZ_Atlantic_Faeroe PSTR("WET0WEST,M3.5.0/1,M10.5.0")
#define TZ_Atlantic_Faroe PSTR("WET0WEST,M3.5.0/1,M10.5.0")
+#define TZ_Atlantic_Jan_Mayen PSTR("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Atlantic_Madeira PSTR("WET0WEST,M3.5.0/1,M10.5.0")
#define TZ_Atlantic_Reykjavik PSTR("GMT0")
#define TZ_Atlantic_South_Georgia PSTR("<-02>2")
-#define TZ_Atlantic_Stanley PSTR("<-03>3")
#define TZ_Atlantic_St_Helena PSTR("GMT0")
+#define TZ_Atlantic_Stanley PSTR("<-03>3")
+#define TZ_Australia_ACT PSTR("AEST-10AEDT,M10.1.0,M4.1.0/3")
#define TZ_Australia_Adelaide PSTR("ACST-9:30ACDT,M10.1.0,M4.1.0/3")
#define TZ_Australia_Brisbane PSTR("AEST-10")
#define TZ_Australia_Broken_Hill PSTR("ACST-9:30ACDT,M10.1.0,M4.1.0/3")
+#define TZ_Australia_Canberra PSTR("AEST-10AEDT,M10.1.0,M4.1.0/3")
#define TZ_Australia_Currie PSTR("AEST-10AEDT,M10.1.0,M4.1.0/3")
#define TZ_Australia_Darwin PSTR("ACST-9:30")
#define TZ_Australia_Eucla PSTR("<+0845>-8:45")
#define TZ_Australia_Hobart PSTR("AEST-10AEDT,M10.1.0,M4.1.0/3")
+#define TZ_Australia_LHI PSTR("<+1030>-10:30<+11>-11,M10.1.0,M4.1.0")
#define TZ_Australia_Lindeman PSTR("AEST-10")
#define TZ_Australia_Lord_Howe PSTR("<+1030>-10:30<+11>-11,M10.1.0,M4.1.0")
#define TZ_Australia_Melbourne PSTR("AEST-10AEDT,M10.1.0,M4.1.0/3")
+#define TZ_Australia_NSW PSTR("AEST-10AEDT,M10.1.0,M4.1.0/3")
+#define TZ_Australia_North PSTR("ACST-9:30")
#define TZ_Australia_Perth PSTR("AWST-8")
+#define TZ_Australia_Queensland PSTR("AEST-10")
+#define TZ_Australia_South PSTR("ACST-9:30ACDT,M10.1.0,M4.1.0/3")
#define TZ_Australia_Sydney PSTR("AEST-10AEDT,M10.1.0,M4.1.0/3")
+#define TZ_Australia_Tasmania PSTR("AEST-10AEDT,M10.1.0,M4.1.0/3")
+#define TZ_Australia_Victoria PSTR("AEST-10AEDT,M10.1.0,M4.1.0/3")
+#define TZ_Australia_West PSTR("AWST-8")
+#define TZ_Australia_Yancowinna PSTR("ACST-9:30ACDT,M10.1.0,M4.1.0/3")
+#define TZ_Brazil_Acre PSTR("<-05>5")
+#define TZ_Brazil_DeNoronha PSTR("<-02>2")
+#define TZ_Brazil_East PSTR("<-03>3")
+#define TZ_Brazil_West PSTR("<-04>4")
+#define TZ_CET PSTR("CET-1CEST,M3.5.0,M10.5.0/3")
+#define TZ_CST6CDT PSTR("CST6CDT,M3.2.0,M11.1.0")
+#define TZ_Canada_Atlantic PSTR("AST4ADT,M3.2.0,M11.1.0")
+#define TZ_Canada_Central PSTR("CST6CDT,M3.2.0,M11.1.0")
+#define TZ_Canada_Eastern PSTR("EST5EDT,M3.2.0,M11.1.0")
+#define TZ_Canada_Mountain PSTR("MST7MDT,M3.2.0,M11.1.0")
+#define TZ_Canada_Newfoundland PSTR("NST3:30NDT,M3.2.0,M11.1.0")
+#define TZ_Canada_Pacific PSTR("PST8PDT,M3.2.0,M11.1.0")
+#define TZ_Canada_Saskatchewan PSTR("CST6")
+#define TZ_Canada_Yukon PSTR("MST7")
+#define TZ_Chile_Continental PSTR("<-04>4<-03>,M9.1.6/24,M4.1.6/24")
+#define TZ_Chile_EasterIsland PSTR("<-06>6<-05>,M9.1.6/22,M4.1.6/22")
+#define TZ_Cuba PSTR("CST5CDT,M3.2.0/0,M11.1.0/1")
+#define TZ_EET PSTR("EET-2EEST,M3.5.0/3,M10.5.0/4")
+#define TZ_EST PSTR("EST5")
+#define TZ_EST5EDT PSTR("EST5EDT,M3.2.0,M11.1.0")
+#define TZ_Egypt PSTR("EET-2EEST,M4.5.5/0,M10.5.4/24")
+#define TZ_Eire PSTR("IST-1GMT0,M10.5.0,M3.5.0/1")
+#define TZ_Etc_GMT PSTR("GMT0")
+#define TZ_Etc_GMTp0 PSTR("GMT0")
+#define TZ_Etc_GMTp1 PSTR("<-01>1")
+#define TZ_Etc_GMTp10 PSTR("<-10>10")
+#define TZ_Etc_GMTp11 PSTR("<-11>11")
+#define TZ_Etc_GMTp12 PSTR("<-12>12")
+#define TZ_Etc_GMTp2 PSTR("<-02>2")
+#define TZ_Etc_GMTp3 PSTR("<-03>3")
+#define TZ_Etc_GMTp4 PSTR("<-04>4")
+#define TZ_Etc_GMTp5 PSTR("<-05>5")
+#define TZ_Etc_GMTp6 PSTR("<-06>6")
+#define TZ_Etc_GMTp7 PSTR("<-07>7")
+#define TZ_Etc_GMTp8 PSTR("<-08>8")
+#define TZ_Etc_GMTp9 PSTR("<-09>9")
+#define TZ_Etc_GMTm0 PSTR("GMT0")
+#define TZ_Etc_GMTm1 PSTR("<+01>-1")
+#define TZ_Etc_GMTm10 PSTR("<+10>-10")
+#define TZ_Etc_GMTm11 PSTR("<+11>-11")
+#define TZ_Etc_GMTm12 PSTR("<+12>-12")
+#define TZ_Etc_GMTm13 PSTR("<+13>-13")
+#define TZ_Etc_GMTm14 PSTR("<+14>-14")
+#define TZ_Etc_GMTm2 PSTR("<+02>-2")
+#define TZ_Etc_GMTm3 PSTR("<+03>-3")
+#define TZ_Etc_GMTm4 PSTR("<+04>-4")
+#define TZ_Etc_GMTm5 PSTR("<+05>-5")
+#define TZ_Etc_GMTm6 PSTR("<+06>-6")
+#define TZ_Etc_GMTm7 PSTR("<+07>-7")
+#define TZ_Etc_GMTm8 PSTR("<+08>-8")
+#define TZ_Etc_GMTm9 PSTR("<+09>-9")
+#define TZ_Etc_GMT0 PSTR("GMT0")
+#define TZ_Etc_Greenwich PSTR("GMT0")
+#define TZ_Etc_UCT PSTR("UTC0")
+#define TZ_Etc_UTC PSTR("UTC0")
+#define TZ_Etc_Universal PSTR("UTC0")
+#define TZ_Etc_Zulu PSTR("UTC0")
#define TZ_Europe_Amsterdam PSTR("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Andorra PSTR("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Astrakhan PSTR("<+04>-4")
#define TZ_Europe_Athens PSTR("EET-2EEST,M3.5.0/3,M10.5.0/4")
+#define TZ_Europe_Belfast PSTR("GMT0BST,M3.5.0/1,M10.5.0")
#define TZ_Europe_Belgrade PSTR("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Berlin PSTR("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Bratislava PSTR("CET-1CEST,M3.5.0,M10.5.0/3")
@@ -349,7 +454,8 @@
#define TZ_Europe_Jersey PSTR("GMT0BST,M3.5.0/1,M10.5.0")
#define TZ_Europe_Kaliningrad PSTR("EET-2")
#define TZ_Europe_Kiev PSTR("EET-2EEST,M3.5.0/3,M10.5.0/4")
-#define TZ_Europe_Kirov PSTR("<+03>-3")
+#define TZ_Europe_Kirov PSTR("MSK-3")
+#define TZ_Europe_Kyiv PSTR("EET-2EEST,M3.5.0/3,M10.5.0/4")
#define TZ_Europe_Lisbon PSTR("WET0WEST,M3.5.0/1,M10.5.0")
#define TZ_Europe_Ljubljana PSTR("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_London PSTR("GMT0BST,M3.5.0/1,M10.5.0")
@@ -360,6 +466,7 @@
#define TZ_Europe_Minsk PSTR("<+03>-3")
#define TZ_Europe_Monaco PSTR("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Moscow PSTR("MSK-3")
+#define TZ_Europe_Nicosia PSTR("EET-2EEST,M3.5.0/3,M10.5.0/4")
#define TZ_Europe_Oslo PSTR("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Paris PSTR("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Podgorica PSTR("CET-1CEST,M3.5.0,M10.5.0/3")
@@ -376,17 +483,31 @@
#define TZ_Europe_Stockholm PSTR("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Tallinn PSTR("EET-2EEST,M3.5.0/3,M10.5.0/4")
#define TZ_Europe_Tirane PSTR("CET-1CEST,M3.5.0,M10.5.0/3")
+#define TZ_Europe_Tiraspol PSTR("EET-2EEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Ulyanovsk PSTR("<+04>-4")
#define TZ_Europe_Uzhgorod PSTR("EET-2EEST,M3.5.0/3,M10.5.0/4")
+#define TZ_Europe_Uzhhorod PSTR("EET-2EEST,M3.5.0/3,M10.5.0/4")
#define TZ_Europe_Vaduz PSTR("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Vatican PSTR("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Vienna PSTR("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Vilnius PSTR("EET-2EEST,M3.5.0/3,M10.5.0/4")
-#define TZ_Europe_Volgograd PSTR("<+04>-4")
+#define TZ_Europe_Volgograd PSTR("MSK-3")
#define TZ_Europe_Warsaw PSTR("CET-1CEST,M3.5.0,M10.5.0/3")
#define TZ_Europe_Zagreb PSTR("CET-1CEST,M3.5.0,M10.5.0/3")
+#define TZ_Europe_Zaporizhzhia PSTR("EET-2EEST,M3.5.0/3,M10.5.0/4")
#define TZ_Europe_Zaporozhye PSTR("EET-2EEST,M3.5.0/3,M10.5.0/4")
#define TZ_Europe_Zurich PSTR("CET-1CEST,M3.5.0,M10.5.0/3")
+#define TZ_Factory PSTR("<-00>0")
+#define TZ_GB PSTR("GMT0BST,M3.5.0/1,M10.5.0")
+#define TZ_GBmEire PSTR("GMT0BST,M3.5.0/1,M10.5.0")
+#define TZ_GMT PSTR("GMT0")
+#define TZ_GMTp0 PSTR("GMT0")
+#define TZ_GMTm0 PSTR("GMT0")
+#define TZ_GMT0 PSTR("GMT0")
+#define TZ_Greenwich PSTR("GMT0")
+#define TZ_HST PSTR("HST10")
+#define TZ_Hongkong PSTR("HKT-8")
+#define TZ_Iceland PSTR("GMT0")
#define TZ_Indian_Antananarivo PSTR("EAT-3")
#define TZ_Indian_Chagos PSTR("<+06>-6")
#define TZ_Indian_Christmas PSTR("<+07>-7")
@@ -398,7 +519,24 @@
#define TZ_Indian_Mauritius PSTR("<+04>-4")
#define TZ_Indian_Mayotte PSTR("EAT-3")
#define TZ_Indian_Reunion PSTR("<+04>-4")
-#define TZ_Pacific_Apia PSTR("<+13>-13<+14>,M9.5.0/3,M4.1.0/4")
+#define TZ_Iran PSTR("<+0330>-3:30")
+#define TZ_Israel PSTR("IST-2IDT,M3.4.4/26,M10.5.0")
+#define TZ_Jamaica PSTR("EST5")
+#define TZ_Japan PSTR("JST-9")
+#define TZ_Kwajalein PSTR("<+12>-12")
+#define TZ_Libya PSTR("EET-2")
+#define TZ_MET PSTR("MET-1MEST,M3.5.0,M10.5.0/3")
+#define TZ_MST PSTR("MST7")
+#define TZ_MST7MDT PSTR("MST7MDT,M3.2.0,M11.1.0")
+#define TZ_Mexico_BajaNorte PSTR("PST8PDT,M3.2.0,M11.1.0")
+#define TZ_Mexico_BajaSur PSTR("MST7")
+#define TZ_Mexico_General PSTR("CST6")
+#define TZ_NZ PSTR("NZST-12NZDT,M9.5.0,M4.1.0/3")
+#define TZ_NZmCHAT PSTR("<+1245>-12:45<+1345>,M9.5.0/2:45,M4.1.0/3:45")
+#define TZ_Navajo PSTR("MST7MDT,M3.2.0,M11.1.0")
+#define TZ_PRC PSTR("CST-8")
+#define TZ_PST8PDT PSTR("PST8PDT,M3.2.0,M11.1.0")
+#define TZ_Pacific_Apia PSTR("<+13>-13")
#define TZ_Pacific_Auckland PSTR("NZST-12NZDT,M9.5.0,M4.1.0/3")
#define TZ_Pacific_Bougainville PSTR("<+11>-11")
#define TZ_Pacific_Chatham PSTR("<+1245>-12:45<+1345>,M9.5.0/2:45,M4.1.0/3:45")
@@ -407,13 +545,15 @@
#define TZ_Pacific_Efate PSTR("<+11>-11")
#define TZ_Pacific_Enderbury PSTR("<+13>-13")
#define TZ_Pacific_Fakaofo PSTR("<+13>-13")
-#define TZ_Pacific_Fiji PSTR("<+12>-12<+13>,M11.1.0,M1.2.2/123")
+#define TZ_Pacific_Fiji PSTR("<+12>-12")
#define TZ_Pacific_Funafuti PSTR("<+12>-12")
#define TZ_Pacific_Galapagos PSTR("<-06>6")
#define TZ_Pacific_Gambier PSTR("<-09>9")
#define TZ_Pacific_Guadalcanal PSTR("<+11>-11")
#define TZ_Pacific_Guam PSTR("ChST-10")
#define TZ_Pacific_Honolulu PSTR("HST10")
+#define TZ_Pacific_Johnston PSTR("HST10")
+#define TZ_Pacific_Kanton PSTR("<+13>-13")
#define TZ_Pacific_Kiritimati PSTR("<+14>-14")
#define TZ_Pacific_Kosrae PSTR("<+11>-11")
#define TZ_Pacific_Kwajalein PSTR("<+12>-12")
@@ -422,54 +562,45 @@
#define TZ_Pacific_Midway PSTR("SST11")
#define TZ_Pacific_Nauru PSTR("<+12>-12")
#define TZ_Pacific_Niue PSTR("<-11>11")
-#define TZ_Pacific_Norfolk PSTR("<+11>-11")
+#define TZ_Pacific_Norfolk PSTR("<+11>-11<+12>,M10.1.0,M4.1.0/3")
#define TZ_Pacific_Noumea PSTR("<+11>-11")
#define TZ_Pacific_Pago_Pago PSTR("SST11")
#define TZ_Pacific_Palau PSTR("<+09>-9")
#define TZ_Pacific_Pitcairn PSTR("<-08>8")
#define TZ_Pacific_Pohnpei PSTR("<+11>-11")
+#define TZ_Pacific_Ponape PSTR("<+11>-11")
#define TZ_Pacific_Port_Moresby PSTR("<+10>-10")
#define TZ_Pacific_Rarotonga PSTR("<-10>10")
#define TZ_Pacific_Saipan PSTR("ChST-10")
+#define TZ_Pacific_Samoa PSTR("SST11")
#define TZ_Pacific_Tahiti PSTR("<-10>10")
#define TZ_Pacific_Tarawa PSTR("<+12>-12")
#define TZ_Pacific_Tongatapu PSTR("<+13>-13")
+#define TZ_Pacific_Truk PSTR("<+10>-10")
#define TZ_Pacific_Wake PSTR("<+12>-12")
#define TZ_Pacific_Wallis PSTR("<+12>-12")
-#define TZ_Etc_GMT PSTR("GMT0")
-#define TZ_Etc_GMTm0 PSTR("GMT0")
-#define TZ_Etc_GMTm1 PSTR("<+01>-1")
-#define TZ_Etc_GMTm2 PSTR("<+02>-2")
-#define TZ_Etc_GMTm3 PSTR("<+03>-3")
-#define TZ_Etc_GMTm4 PSTR("<+04>-4")
-#define TZ_Etc_GMTm5 PSTR("<+05>-5")
-#define TZ_Etc_GMTm6 PSTR("<+06>-6")
-#define TZ_Etc_GMTm7 PSTR("<+07>-7")
-#define TZ_Etc_GMTm8 PSTR("<+08>-8")
-#define TZ_Etc_GMTm9 PSTR("<+09>-9")
-#define TZ_Etc_GMTm10 PSTR("<+10>-10")
-#define TZ_Etc_GMTm11 PSTR("<+11>-11")
-#define TZ_Etc_GMTm12 PSTR("<+12>-12")
-#define TZ_Etc_GMTm13 PSTR("<+13>-13")
-#define TZ_Etc_GMTm14 PSTR("<+14>-14")
-#define TZ_Etc_GMT0 PSTR("GMT0")
-#define TZ_Etc_GMTp0 PSTR("GMT0")
-#define TZ_Etc_GMTp1 PSTR("<-01>1")
-#define TZ_Etc_GMTp2 PSTR("<-02>2")
-#define TZ_Etc_GMTp3 PSTR("<-03>3")
-#define TZ_Etc_GMTp4 PSTR("<-04>4")
-#define TZ_Etc_GMTp5 PSTR("<-05>5")
-#define TZ_Etc_GMTp6 PSTR("<-06>6")
-#define TZ_Etc_GMTp7 PSTR("<-07>7")
-#define TZ_Etc_GMTp8 PSTR("<-08>8")
-#define TZ_Etc_GMTp9 PSTR("<-09>9")
-#define TZ_Etc_GMTp10 PSTR("<-10>10")
-#define TZ_Etc_GMTp11 PSTR("<-11>11")
-#define TZ_Etc_GMTp12 PSTR("<-12>12")
-#define TZ_Etc_UCT PSTR("UTC0")
-#define TZ_Etc_UTC PSTR("UTC0")
-#define TZ_Etc_Greenwich PSTR("GMT0")
-#define TZ_Etc_Universal PSTR("UTC0")
-#define TZ_Etc_Zulu PSTR("UTC0")
-
-#endif // TZDB_H
+#define TZ_Pacific_Yap PSTR("<+10>-10")
+#define TZ_Poland PSTR("CET-1CEST,M3.5.0,M10.5.0/3")
+#define TZ_Portugal PSTR("WET0WEST,M3.5.0/1,M10.5.0")
+#define TZ_ROC PSTR("CST-8")
+#define TZ_ROK PSTR("KST-9")
+#define TZ_Singapore PSTR("<+08>-8")
+#define TZ_Turkey PSTR("<+03>-3")
+#define TZ_UCT PSTR("UTC0")
+#define TZ_US_Alaska PSTR("AKST9AKDT,M3.2.0,M11.1.0")
+#define TZ_US_Aleutian PSTR("HST10HDT,M3.2.0,M11.1.0")
+#define TZ_US_Arizona PSTR("MST7")
+#define TZ_US_Central PSTR("CST6CDT,M3.2.0,M11.1.0")
+#define TZ_US_EastmIndiana PSTR("EST5EDT,M3.2.0,M11.1.0")
+#define TZ_US_Eastern PSTR("EST5EDT,M3.2.0,M11.1.0")
+#define TZ_US_Hawaii PSTR("HST10")
+#define TZ_US_IndianamStarke PSTR("CST6CDT,M3.2.0,M11.1.0")
+#define TZ_US_Michigan PSTR("EST5EDT,M3.2.0,M11.1.0")
+#define TZ_US_Mountain PSTR("MST7MDT,M3.2.0,M11.1.0")
+#define TZ_US_Pacific PSTR("PST8PDT,M3.2.0,M11.1.0")
+#define TZ_US_Samoa PSTR("SST11")
+#define TZ_UTC PSTR("UTC0")
+#define TZ_Universal PSTR("UTC0")
+#define TZ_WmSU PSTR("MSK-3")
+#define TZ_WET PSTR("WET0WEST,M3.5.0/1,M10.5.0")
+#define TZ_Zulu PSTR("UTC0")
diff --git a/cores/esp8266/Tone.cpp b/cores/esp8266/Tone.cpp
index 35a5a41515..b4dc93c642 100644
--- a/cores/esp8266/Tone.cpp
+++ b/cores/esp8266/Tone.cpp
@@ -23,24 +23,27 @@
#include "Arduino.h"
#include "core_esp8266_waveform.h"
+#include "user_interface.h"
-// Which pins have a tone running on them?
-static uint32_t _toneMap = 0;
-
-
-static void _startTone(uint8_t _pin, uint32_t high, uint32_t low, unsigned long duration) {
+static void _startTone(uint8_t _pin, uint32_t high, uint32_t low, uint32_t duration) {
if (_pin > 16) {
return;
}
+ // Stop any analogWrites (PWM) because they are a different generator
+ _stopPWM(_pin);
+ // If there's another Tone or startWaveform on this pin
+ // it will be changed on-the-fly (no need to stop it)
+
pinMode(_pin, OUTPUT);
- high = std::max(high, (uint32_t)100);
- low = std::max(low, (uint32_t)100);
+ high = std::max(high, (uint32_t)microsecondsToClockCycles(25)); // new 20KHz maximum tone frequency,
+ low = std::max(low, (uint32_t)microsecondsToClockCycles(25)); // (25us high + 25us low period = 20KHz)
- if (startWaveform(_pin, high, low, (uint32_t) duration * 1000)) {
- _toneMap |= 1 << _pin;
- }
+ duration = microsecondsToClockCycles(duration * 1000UL);
+ duration += high + low - 1;
+ duration -= duration % (high + low);
+ startWaveformClockCycles(_pin, high, low, duration);
}
@@ -48,7 +51,7 @@ void tone(uint8_t _pin, unsigned int frequency, unsigned long duration) {
if (frequency == 0) {
noTone(_pin);
} else {
- uint32_t period = 1000000L / frequency;
+ uint32_t period = microsecondsToClockCycles(1000000UL) / frequency;
uint32_t high = period / 2;
uint32_t low = period - high;
_startTone(_pin, high, low, duration);
@@ -62,7 +65,7 @@ void tone(uint8_t _pin, double frequency, unsigned long duration) {
if (frequency < 1.0) { // FP means no exact comparisons
noTone(_pin);
} else {
- double period = 1000000.0 / frequency;
+ double period = (double)microsecondsToClockCycles(1000000UL) / frequency;
uint32_t high = (uint32_t)((period / 2.0) + 0.5);
uint32_t low = (uint32_t)(period + 0.5) - high;
_startTone(_pin, high, low, duration);
@@ -82,6 +85,5 @@ void noTone(uint8_t _pin) {
return;
}
stopWaveform(_pin);
- _toneMap &= ~(1 << _pin);
digitalWrite(_pin, 0);
}
diff --git a/cores/esp8266/TypeConversion.cpp b/cores/esp8266/TypeConversion.cpp
new file mode 100644
index 0000000000..371dee8baf
--- /dev/null
+++ b/cores/esp8266/TypeConversion.cpp
@@ -0,0 +1,91 @@
+/*
+ TypeConversion functionality
+ 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
+#include "TypeConversion.h"
+
+namespace experimental
+{
+namespace TypeConversion
+{
+const char base36Chars[36] PROGMEM = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};
+const uint8_t base36CharValues[75] PROGMEM {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, // 0 to 9
+ 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 0, 0, 0, 0, 0, 0, // Upper case letters
+ 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35 // Lower case letters
+};
+
+
+String uint8ArrayToHexString(const uint8_t *uint8Array, const uint32_t arrayLength)
+{
+ String hexString;
+ if (!hexString.reserve(2 * arrayLength)) // Each uint8_t will become two characters (00 to FF)
+ {
+ return emptyString;
+ }
+
+ for (uint32_t i = 0; i < arrayLength; ++i)
+ {
+ hexString += (char)pgm_read_byte(base36Chars + (uint8Array[i] >> 4));
+ hexString += (char)pgm_read_byte(base36Chars + uint8Array[i] % 16);
+ }
+
+ return hexString;
+}
+
+uint8_t *hexStringToUint8Array(const String &hexString, uint8_t *uint8Array, const uint32_t arrayLength)
+{
+ assert(hexString.length() >= arrayLength * 2); // Each array element can hold two hexString characters
+
+ for (uint32_t i = 0; i < arrayLength; ++i)
+ {
+ uint8Array[i] = (pgm_read_byte(base36CharValues + hexString.charAt(i * 2) - '0') << 4) + pgm_read_byte(base36CharValues + hexString.charAt(i * 2 + 1) - '0');
+ }
+
+ return uint8Array;
+}
+
+uint8_t *uint64ToUint8ArrayBE(const uint64_t value, uint8_t *resultArray)
+{
+ resultArray[7] = value;
+ resultArray[6] = value >> 8;
+ resultArray[5] = value >> 16;
+ resultArray[4] = value >> 24;
+ resultArray[3] = value >> 32;
+ resultArray[2] = value >> 40;
+ resultArray[1] = value >> 48;
+ resultArray[0] = value >> 56;
+
+ return resultArray;
+}
+
+uint64_t uint8ArrayToUint64BE(const uint8_t *inputArray)
+{
+ uint64_t result = (uint64_t)inputArray[0] << 56 | (uint64_t)inputArray[1] << 48 | (uint64_t)inputArray[2] << 40 | (uint64_t)inputArray[3] << 32
+ | (uint64_t)inputArray[4] << 24 | (uint64_t)inputArray[5] << 16 | (uint64_t)inputArray[6] << 8 | (uint64_t)inputArray[7];
+
+ return result;
+}
+}
+}
diff --git a/cores/esp8266/TypeConversion.h b/cores/esp8266/TypeConversion.h
new file mode 100644
index 0000000000..522170eff9
--- /dev/null
+++ b/cores/esp8266/TypeConversion.h
@@ -0,0 +1,80 @@
+/*
+ TypeConversion functionality
+ 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_TYPECONVERSION_H__
+#define __ESP8266_TYPECONVERSION_H__
+
+#include
+
+namespace experimental
+{
+namespace TypeConversion
+{
+extern const char base36Chars[36];
+
+// Subtract '0' to normalize the char before lookup.
+extern const uint8_t base36CharValues[75];
+
+/**
+ Convert the contents of a uint8_t array to a String in HEX format. The resulting String starts from index 0 of the array.
+ All array elements will be padded with zeroes to ensure they are converted to 2 String characters each.
+
+ @param uint8Array The array to make into a HEX String.
+ @param arrayLength The size of uint8Array, in bytes.
+ @return Normally a String containing the HEX representation of the uint8Array. An empty String if the memory allocation for the String failed.
+*/
+String uint8ArrayToHexString(const uint8_t *uint8Array, const uint32_t arrayLength);
+
+/**
+ Convert the contents of a String in HEX format to a uint8_t array. Index 0 of the array will represent the start of the String.
+ There must be 2 String characters for each array element. Use padding with zeroes where required.
+
+ @param hexString The HEX String to convert to a uint8_t array. Must contain at least 2*arrayLength characters.
+ @param uint8Array The array to fill with the contents of the hexString.
+ @param arrayLength The number of bytes to fill in uint8Array.
+ @return A pointer to the uint8Array.
+*/
+uint8_t *hexStringToUint8Array(const String &hexString, uint8_t *uint8Array, const uint32_t arrayLength);
+
+/**
+ Takes a uint64_t value and stores the bits in a uint8_t array. Assumes index 0 of the array should contain MSB (big endian).
+
+ @param value The uint64_t value to convert to a uint8_t array.
+ @param resultArray A uint8_t array that will hold the result once the function returns. Should have a size of at least 8 bytes.
+ @return The resultArray.
+*/
+uint8_t *uint64ToUint8ArrayBE(const uint64_t value, uint8_t *resultArray);
+
+/**
+ Takes a uint8_t array and converts the first 8 (lowest index) elements to a uint64_t. Assumes index 0 of the array contains MSB (big endian).
+
+ @param inputArray A uint8_t array containing the data to convert to a uint64_t. Should have a size of at least 8 bytes.
+ @return A uint64_t representation of the first 8 bytes of the array.
+*/
+uint64_t uint8ArrayToUint64BE(const uint8_t *inputArray);
+}
+}
+
+#endif
diff --git a/cores/esp8266/Udp.h b/cores/esp8266/Udp.h
index de5127b18f..37f2fb922b 100644
--- a/cores/esp8266/Udp.h
+++ b/cores/esp8266/Udp.h
@@ -43,6 +43,7 @@ class UDP: public Stream {
public:
virtual ~UDP() {};
virtual uint8_t begin(uint16_t) =0; // initialize, start listening on specified port. Returns 1 if successful, 0 if there are no sockets available to use
+ virtual uint8_t beginMulticast(IPAddress, uint16_t) { return 0; } // initialize, start listening on specified multicast IP address and port. Returns 1 if successful, 0 on failure
virtual void stop() =0; // Finish with the UDP socket
// Sending UDP packets
@@ -83,14 +84,14 @@ class UDP: public Stream {
// Return the port of the host who sent the current incoming packet
virtual uint16_t remotePort() =0;
protected:
+
uint8_t* rawIPAddress(IPAddress& addr) {
return addr.raw_address();
}
-#if LWIP_VERSION_MAJOR != 1
+
const uint8_t* rawIPAddress(const IPAddress& addr) {
return addr.raw_address();
}
-#endif
};
#endif
diff --git a/cores/esp8266/Updater.cpp b/cores/esp8266/Updater.cpp
index b028e19b9d..ef79a5cbf3 100644
--- a/cores/esp8266/Updater.cpp
+++ b/cores/esp8266/Updater.cpp
@@ -1,6 +1,11 @@
+#include
#include "Updater.h"
#include "eboot_command.h"
#include
+#include
+#include "StackThunk.h"
+
+#include
//#define DEBUG_UPDATER Serial
@@ -22,42 +27,39 @@ extern "C" {
#include "user_interface.h"
}
-extern "C" uint32_t _FS_start;
-extern "C" uint32_t _FS_end;
+#include // not "flash_hal.h": can use hijacked MOCK version
UpdaterClass::UpdaterClass()
-: _async(false)
-, _error(0)
-, _buffer(0)
-, _bufferLen(0)
-, _size(0)
-, _startAddress(0)
-, _currentAddress(0)
-, _command(U_FLASH)
-, _hash(nullptr)
-, _verify(nullptr)
-, _progress_callback(nullptr)
{
#if ARDUINO_SIGNING
installSignature(&esp8266::updaterSigningHash, &esp8266::updaterSigningVerifier);
+ stack_thunk_add_ref();
#endif
}
-UpdaterClass& UpdaterClass::onProgress(THandlerFunction_Progress fn) {
- _progress_callback = fn;
- return *this;
+UpdaterClass::~UpdaterClass()
+{
+#if ARDUINO_SIGNING
+ stack_thunk_del_ref();
+#endif
}
-void UpdaterClass::_reset() {
- if (_buffer)
+void UpdaterClass::_reset(bool callback) {
+ if (_buffer) {
delete[] _buffer;
- _buffer = 0;
+ }
+
+ _buffer = nullptr;
_bufferLen = 0;
_startAddress = 0;
_currentAddress = 0;
_size = 0;
_command = U_FLASH;
+ if (callback && _end_callback) {
+ _end_callback();
+ }
+
if(_ledPin != -1) {
digitalWrite(_ledPin, !_ledOn); // off
}
@@ -68,6 +70,7 @@ bool UpdaterClass::begin(size_t size, int command, int ledPin, uint8_t ledOn) {
#ifdef DEBUG_UPDATER
DEBUG_UPDATER.println(F("[begin] already running"));
#endif
+ _setError(UPDATE_ERROR_RUNNING_ALREADY);
return false;
}
@@ -84,7 +87,7 @@ bool UpdaterClass::begin(size_t size, int command, int ledPin, uint8_t ledOn) {
_setError(UPDATE_ERROR_BOOTSTRAP);
return false;
}
-
+
#ifdef DEBUG_UPDATER
if (command == U_FS) {
DEBUG_UPDATER.println(F("[begin] Update Filesystem."));
@@ -103,8 +106,12 @@ bool UpdaterClass::begin(size_t size, int command, int ledPin, uint8_t ledOn) {
_reset();
clearError(); // _error = 0
+ _target_md5 = emptyString;
+ _md5 = MD5Builder();
+#ifndef HOST_MOCK
wifi_set_sleep_type(NONE_SLEEP_T);
+#endif
//address where we will start writing the update
uintptr_t updateStartAddress = 0;
@@ -115,7 +122,7 @@ bool UpdaterClass::begin(size_t size, int command, int ledPin, uint8_t ledOn) {
if (command == U_FLASH) {
//address of the end of the space available for sketch and update
- uintptr_t updateEndAddress = (uintptr_t)&_FS_start - 0x40200000;
+ uintptr_t updateEndAddress = FS_start - 0x40200000;
updateStartAddress = (updateEndAddress > roundedSize)? (updateEndAddress - roundedSize) : 0;
@@ -127,19 +134,19 @@ bool UpdaterClass::begin(size_t size, int command, int ledPin, uint8_t ledOn) {
//make sure that the size of both sketches is less than the total space (updateEndAddress)
if(updateStartAddress < currentSketchSize) {
- _setError(UPDATE_ERROR_SPACE);
+ _setError(UPDATE_ERROR_SPACE);
return false;
}
}
else if (command == U_FS) {
- if((uintptr_t)&_FS_start + roundedSize > (uintptr_t)&_FS_end) {
+ if(FS_start + roundedSize > FS_end) {
_setError(UPDATE_ERROR_SPACE);
return false;
}
#ifdef ATOMIC_FS_UPDATE
//address of the end of the space available for update
- uintptr_t updateEndAddress = (uintptr_t)&_FS_start - 0x40200000;
+ uintptr_t updateEndAddress = FS_start - 0x40200000;
updateStartAddress = (updateEndAddress > roundedSize)? (updateEndAddress - roundedSize) : 0;
@@ -148,7 +155,7 @@ bool UpdaterClass::begin(size_t size, int command, int ledPin, uint8_t ledOn) {
return false;
}
#else
- updateStartAddress = (uintptr_t)&_FS_start - 0x40200000;
+ updateStartAddress = FS_start - 0x40200000;
#endif
}
else {
@@ -156,6 +163,7 @@ bool UpdaterClass::begin(size_t size, int command, int ledPin, uint8_t ledOn) {
#ifdef DEBUG_UPDATER
DEBUG_UPDATER.println(F("[begin] Unknown update command."));
#endif
+ _setError(UPDATE_ERROR_UNKNOWN_COMMAND);
return false;
}
@@ -168,7 +176,13 @@ bool UpdaterClass::begin(size_t size, int command, int ledPin, uint8_t ledOn) {
} else {
_bufferSize = 256;
}
- _buffer = new uint8_t[_bufferSize];
+ _buffer = new (std::nothrow) uint8_t[_bufferSize];
+ if (!_buffer) {
+ _setError(UPDATE_ERROR_OOM);
+ _reset(false);
+ return false;
+ }
+
_command = command;
#ifdef DEBUG_UPDATER
@@ -180,6 +194,11 @@ bool UpdaterClass::begin(size_t size, int command, int ledPin, uint8_t ledOn) {
if (!_verify) {
_md5.begin();
}
+
+ if (_start_callback) {
+ _start_callback();
+ }
+
return true;
}
@@ -197,14 +216,19 @@ bool UpdaterClass::end(bool evenIfRemaining){
#ifdef DEBUG_UPDATER
DEBUG_UPDATER.println(F("no update"));
#endif
+ _reset();
return false;
}
+ // Updating w/o any data is an error we detect here
+ if (!progress()) {
+ _setError(UPDATE_ERROR_NO_DATA);
+ }
+
if(hasError() || (!isFinished() && !evenIfRemaining)){
#ifdef DEBUG_UPDATER
DEBUG_UPDATER.printf_P(PSTR("premature end: res:%u, pos:%zu/%zu\n"), getError(), progress(), _size);
#endif
-
_reset();
return false;
}
@@ -216,53 +240,90 @@ bool UpdaterClass::end(bool evenIfRemaining){
_size = progress();
}
- uint32_t sigLen = 0;
if (_verify) {
- ESP.flashRead(_startAddress + _size - sizeof(uint32_t), &sigLen, sizeof(uint32_t));
+ // If expectedSigLen is non-zero, we expect the last four bytes of the buffer to
+ // contain a matching length field, preceded by the bytes of the signature itself.
+ // But if expectedSigLen is zero, we expect neither a signature nor a length field;
+ static constexpr uint32_t SigSize = sizeof(uint32_t);
+ const uint32_t expectedSigLen = _verify->length();
+ const uint32_t sigLenAddr = _startAddress + _size - SigSize;
+ uint32_t sigLen = 0;
+
+#ifdef DEBUG_UPDATER
+ DEBUG_UPDATER.printf_P(PSTR("[Updater] expected sigLen: %u\n"), expectedSigLen);
+#endif
+ if (expectedSigLen > 0) {
+ ESP.flashRead(sigLenAddr, &sigLen, SigSize);
#ifdef DEBUG_UPDATER
- DEBUG_UPDATER.printf_P(PSTR("[Updater] sigLen: %d\n"), sigLen);
+ DEBUG_UPDATER.printf_P(PSTR("[Updater] sigLen from flash: %u\n"), sigLen);
#endif
- if (sigLen != _verify->length()) {
+ }
+
+ if (sigLen != expectedSigLen) {
_setError(UPDATE_ERROR_SIGN);
+ _reset();
return false;
}
- int binSize = _size - sigLen - sizeof(uint32_t) /* The siglen word */;
- _hash->begin();
+ auto binSize = _size;
+ if (expectedSigLen > 0) {
+ if (binSize < (sigLen + SigSize)) {
+ _setError(UPDATE_ERROR_SIGN);
+ _reset();
+ return false;
+ }
+ binSize -= (sigLen + SigSize);
#ifdef DEBUG_UPDATER
- DEBUG_UPDATER.printf_P(PSTR("[Updater] Adjusted binsize: %d\n"), binSize);
+ DEBUG_UPDATER.printf_P(PSTR("[Updater] Adjusted size (without the signature and sigLen): %zu\n"), binSize);
#endif
- // Calculate the MD5 and hash using proper size
- uint8_t buff[128];
- for(int i = 0; i < binSize; i += sizeof(buff)) {
- ESP.flashRead(_startAddress + i, (uint32_t *)buff, sizeof(buff));
- size_t read = std::min((int)sizeof(buff), binSize - i);
- _hash->add(buff, read);
+ }
+
+ // Calculate hash of the payload, 128 bytes at a time
+ alignas(alignof(uint32_t)) uint8_t buff[128];
+
+ _hash->begin();
+ for (uint32_t offset = 0; offset < binSize; offset += sizeof(buff)) {
+ auto len = std::min(sizeof(buff), binSize - offset);
+ ESP.flashRead(_startAddress + offset, buff, len);
+ _hash->add(buff, len);
}
_hash->end();
+
#ifdef DEBUG_UPDATER
- unsigned char *ret = (unsigned char *)_hash->hash();
- DEBUG_UPDATER.printf_P(PSTR("[Updater] Computed Hash:"));
- for (int i=0; i<_hash->len(); i++) DEBUG_UPDATER.printf(" %02x", ret[i]);
- DEBUG_UPDATER.printf("\n");
+ auto debugByteArray = [](const char *name, const unsigned char *hash, int len) {
+ DEBUG_UPDATER.printf_P("[Updater] %s:", name);
+ for (int i = 0; i < len; ++i) {
+ DEBUG_UPDATER.printf(" %02x", hash[i]);
+ }
+ DEBUG_UPDATER.printf("\n");
+ };
+ debugByteArray(PSTR("Computed Hash"),
+ reinterpret_cast(_hash->hash()),
+ _hash->len());
#endif
- uint8_t *sig = (uint8_t*)malloc(sigLen);
- if (!sig) {
- _setError(UPDATE_ERROR_SIGN);
- return false;
- }
- ESP.flashRead(_startAddress + binSize, (uint32_t *)sig, sigLen);
+
+ std::unique_ptr sig;
+ if (expectedSigLen > 0) {
+ const uint32_t sigAddr = _startAddress + binSize;
+ sig.reset(new (std::nothrow) uint8_t[sigLen]);
+ if (!sig) {
+ _setError(UPDATE_ERROR_OOM);
+ _reset();
+ return false;
+ }
+ ESP.flashRead(sigAddr, sig.get(), sigLen);
#ifdef DEBUG_UPDATER
- DEBUG_UPDATER.printf_P(PSTR("[Updater] Received Signature:"));
- for (size_t i=0; iverify(_hash, (void *)sig, sigLen)) {
+ }
+ if (!_verify->verify(_hash, sig.get(), sigLen)) {
_setError(UPDATE_ERROR_SIGN);
+ _reset();
return false;
}
+
+ _size = binSize; // Adjust size to remove signature, not part of bin payload
+
#ifdef DEBUG_UPDATER
DEBUG_UPDATER.printf_P(PSTR("[Updater] Signature matches\n"));
#endif
@@ -273,7 +334,7 @@ bool UpdaterClass::end(bool evenIfRemaining){
return false;
}
#ifdef DEBUG_UPDATER
- else DEBUG_UPDATER.printf_P(PSTR("MD5 Success: %s\n"), _target_md5.c_str());
+ else DEBUG_UPDATER.printf_P(PSTR("[Updater] MD5 Success: %s\n"), _target_md5.c_str());
#endif
}
@@ -299,7 +360,7 @@ bool UpdaterClass::end(bool evenIfRemaining){
eboot_command ebcmd;
ebcmd.action = ACTION_COPY_RAW;
ebcmd.args[0] = _startAddress;
- ebcmd.args[1] = (uintptr_t)&_FS_start - 0x40200000;
+ ebcmd.args[1] = FS_start - 0x40200000;
ebcmd.args[2] = _size;
eboot_command_write(&ebcmd);
#endif
@@ -329,7 +390,8 @@ bool UpdaterClass::_writeBuffer(){
bool modifyFlashMode = false;
FlashMode_t flashMode = FM_QIO;
FlashMode_t bufferFlashMode = FM_QIO;
- if (_currentAddress == _startAddress + FLASH_MODE_PAGE) {
+ //TODO - GZIP can't do this
+ if ((_currentAddress == _startAddress + FLASH_MODE_PAGE) && (_buffer[0] != 0x1f) && (_command == U_FLASH)) {
flashMode = ESP.getFlashChipMode();
#ifdef DEBUG_UPDATER
DEBUG_UPDATER.printf_P(PSTR("Header: 0x%1X %1X %1X %1X\n"), _buffer[0], _buffer[1], _buffer[2], _buffer[3]);
@@ -344,10 +406,10 @@ bool UpdaterClass::_writeBuffer(){
modifyFlashMode = true;
}
}
-
+
if (eraseResult) {
if(!_async) yield();
- writeResult = ESP.flashWrite(_currentAddress, (uint32_t*) _buffer, _bufferLen);
+ writeResult = ESP.flashWrite(_currentAddress, _buffer, _bufferLen);
} else { // if erase was unsuccessful
_currentAddress = (_startAddress + _size);
_setError(UPDATE_ERROR_ERASE);
@@ -377,9 +439,7 @@ size_t UpdaterClass::write(uint8_t *data, size_t len) {
if(hasError() || !isRunning())
return 0;
- if(len > remaining()){
- //len = remaining();
- //fail instead
+ if(progress() + _bufferLen + len > _size) {
_setError(UPDATE_ERROR_SPACE);
return 0;
}
@@ -396,7 +456,7 @@ size_t UpdaterClass::write(uint8_t *data, size_t len) {
left -= toBuff;
if(!_async) yield();
}
- //lets see whats left
+ //lets see what's left
memcpy(_buffer + _bufferLen, data + (len - left), left);
_bufferLen += left;
if(_bufferLen == remaining()){
@@ -411,7 +471,7 @@ size_t UpdaterClass::write(uint8_t *data, size_t len) {
bool UpdaterClass::_verifyHeader(uint8_t data) {
if(_command == U_FLASH) {
// check for valid first magic byte (is always 0xE9)
- if(data != 0xE9) {
+ if ((data != 0xE9) && (data != 0x1f)) {
_currentAddress = (_startAddress + _size);
_setError(UPDATE_ERROR_MAGIC_BYTE);
return false;
@@ -427,28 +487,37 @@ bool UpdaterClass::_verifyHeader(uint8_t data) {
bool UpdaterClass::_verifyEnd() {
if(_command == U_FLASH) {
- uint8_t buf[4];
+ uint8_t buf[4] __attribute__((aligned(4)));
if(!ESP.flashRead(_startAddress, (uint32_t *) &buf[0], 4)) {
_currentAddress = (_startAddress);
- _setError(UPDATE_ERROR_READ);
+ _setError(UPDATE_ERROR_READ);
return false;
}
// check for valid first magic byte
- if(buf[0] != 0xE9) {
+ //
+ // TODO: GZIP compresses the chipsize flags, so can't do check here
+ if ((buf[0] == 0x1f) && (buf[1] == 0x8b)) {
+ // GZIP, just assume OK
+ return true;
+ } else if (buf[0] != 0xE9) {
_currentAddress = (_startAddress);
- _setError(UPDATE_ERROR_MAGIC_BYTE);
+ _setError(UPDATE_ERROR_MAGIC_BYTE);
return false;
}
+// it makes no sense to check flash size in auto flash mode
+// (sketch size would have to be set in bin header, instead of flash size)
+#if !FLASH_MAP_SUPPORT
uint32_t bin_flash_size = ESP.magicFlashChipSize((buf[3] & 0xf0) >> 4);
// check if new bin fits to SPI flash
if(bin_flash_size > ESP.getFlashChipRealSize()) {
_currentAddress = (_startAddress);
- _setError(UPDATE_ERROR_NEW_FLASH_CONFIG);
+ _setError(UPDATE_ERROR_NEW_FLASH_CONFIG);
return false;
}
+#endif
return true;
} else if(_command == U_FS) {
@@ -458,7 +527,7 @@ bool UpdaterClass::_verifyEnd() {
return false;
}
-size_t UpdaterClass::writeStream(Stream &data) {
+size_t UpdaterClass::writeStream(Stream &data, uint16_t streamTimeout) {
size_t written = 0;
size_t toRead = 0;
if(hasError() || !isRunning())
@@ -471,6 +540,7 @@ size_t UpdaterClass::writeStream(Stream &data) {
_reset();
return 0;
}
+ esp8266::polledTimeout::oneShotMs timeOut(streamTimeout);
if (_progress_callback) {
_progress_callback(0, _size);
}
@@ -488,13 +558,15 @@ size_t UpdaterClass::writeStream(Stream &data) {
}
toRead = data.readBytes(_buffer + _bufferLen, bytesToRead);
if(toRead == 0) { //Timeout
- delay(100);
- toRead = data.readBytes(_buffer + _bufferLen, bytesToRead);
- if(toRead == 0) { //Timeout
- _currentAddress = (_startAddress + _size);
- _setError(UPDATE_ERROR_STREAM);
- return written;
- }
+ if (timeOut) {
+ _currentAddress = (_startAddress + _size);
+ _setError(UPDATE_ERROR_STREAM);
+ _reset();
+ return written;
+ }
+ delay(100);
+ } else {
+ timeOut.reset();
}
if(_ledPin != -1) {
digitalWrite(_ledPin, !_ledOn); // Switch LED off
@@ -516,43 +588,85 @@ size_t UpdaterClass::writeStream(Stream &data) {
void UpdaterClass::_setError(int error){
_error = error;
+ if (_error_callback) {
+ _error_callback(error);
+ }
#ifdef DEBUG_UPDATER
printError(DEBUG_UPDATER);
#endif
_reset(); // Any error condition invalidates the entire update, so clear partial status
}
-void UpdaterClass::printError(Print &out){
- out.printf_P(PSTR("ERROR[%u]: "), _error);
- if(_error == UPDATE_ERROR_OK){
- out.println(F("No Error"));
- } else if(_error == UPDATE_ERROR_WRITE){
- out.println(F("Flash Write Failed"));
- } else if(_error == UPDATE_ERROR_ERASE){
- out.println(F("Flash Erase Failed"));
- } else if(_error == UPDATE_ERROR_READ){
- out.println(F("Flash Read Failed"));
- } else if(_error == UPDATE_ERROR_SPACE){
- out.println(F("Not Enough Space"));
- } else if(_error == UPDATE_ERROR_SIZE){
- out.println(F("Bad Size Given"));
- } else if(_error == UPDATE_ERROR_STREAM){
- out.println(F("Stream Read Timeout"));
- } else if(_error == UPDATE_ERROR_MD5){
- out.printf_P(PSTR("MD5 Failed: expected:%s, calculated:%s\n"), _target_md5.c_str(), _md5.toString().c_str());
- } else if(_error == UPDATE_ERROR_SIGN){
- out.println(F("Signature verification failed"));
- } else if(_error == UPDATE_ERROR_FLASH_CONFIG){
- out.printf_P(PSTR("Flash config wrong real: %d IDE: %d\n"), ESP.getFlashChipRealSize(), ESP.getFlashChipSize());
- } else if(_error == UPDATE_ERROR_NEW_FLASH_CONFIG){
- out.printf_P(PSTR("new Flash config wrong real: %d\n"), ESP.getFlashChipRealSize());
- } else if(_error == UPDATE_ERROR_MAGIC_BYTE){
- out.println(F("Magic byte is wrong, not 0xE9"));
- } else if (_error == UPDATE_ERROR_BOOTSTRAP){
- out.println(F("Invalid bootstrapping state, reset ESP8266 before updating"));
- } else {
- out.println(F("UNKNOWN"));
+String UpdaterClass::getErrorString() const {
+ String out;
+
+ switch (_error) {
+ case UPDATE_ERROR_OK:
+ out = F("No Error");
+ break;
+ case UPDATE_ERROR_WRITE:
+ out = F("Flash Write Failed");
+ break;
+ case UPDATE_ERROR_ERASE:
+ out = F("Flash Erase Failed");
+ break;
+ case UPDATE_ERROR_READ:
+ out = F("Flash Read Failed");
+ break;
+ case UPDATE_ERROR_SPACE:
+ out = F("Not Enough Space");
+ break;
+ case UPDATE_ERROR_SIZE:
+ out = F("Bad Size Given");
+ break;
+ case UPDATE_ERROR_STREAM:
+ out = F("Stream Read Timeout");
+ break;
+ case UPDATE_ERROR_MD5:
+ out += F("MD5 verification failed: ");
+ out += F("expected: ") + _target_md5;
+ out += F(", calculated: ") + _md5.toString();
+ break;
+ case UPDATE_ERROR_FLASH_CONFIG:
+ out += F("Flash config wrong: ");
+ out += F("real: ") + String(ESP.getFlashChipRealSize(), 10);
+ out += F(", SDK: ") + String(ESP.getFlashChipSize(), 10);
+ break;
+ case UPDATE_ERROR_NEW_FLASH_CONFIG:
+ out += F("new Flash config wrong, real size: ");
+ out += String(ESP.getFlashChipRealSize(), 10);
+ break;
+ case UPDATE_ERROR_MAGIC_BYTE:
+ out = F("Magic byte is not 0xE9");
+ break;
+ case UPDATE_ERROR_BOOTSTRAP:
+ out = F("Invalid bootstrapping state, reset ESP8266 before updating");
+ break;
+ case UPDATE_ERROR_SIGN:
+ out = F("Signature verification failed");
+ break;
+ case UPDATE_ERROR_NO_DATA:
+ out = F("No data supplied");
+ break;
+ case UPDATE_ERROR_OOM:
+ out = F("Out of memory");
+ break;
+ case UPDATE_ERROR_RUNNING_ALREADY:
+ out = F("Update already running");
+ break;
+ case UPDATE_ERROR_UNKNOWN_COMMAND:
+ out = F("Unknown update command");
+ break;
+ default:
+ out = F("UNKNOWN");
+ break;
}
+
+ return out;
+}
+
+void UpdaterClass::printError(Print &out){
+ out.printf_P(PSTR("ERROR[%hhu]: %s\n"), _error, getErrorString().c_str());
}
UpdaterClass Update;
diff --git a/cores/esp8266/Updater.h b/cores/esp8266/Updater.h
index d47c613330..7ee1d28311 100644
--- a/cores/esp8266/Updater.h
+++ b/cores/esp8266/Updater.h
@@ -19,6 +19,10 @@
#define UPDATE_ERROR_MAGIC_BYTE (10)
#define UPDATE_ERROR_BOOTSTRAP (11)
#define UPDATE_ERROR_SIGN (12)
+#define UPDATE_ERROR_NO_DATA (13)
+#define UPDATE_ERROR_OOM (14)
+#define UPDATE_ERROR_RUNNING_ALREADY (15)
+#define UPDATE_ERROR_UNKNOWN_COMMAND (16)
#define U_FLASH 0
#define U_FS 100
@@ -50,9 +54,12 @@ class UpdaterVerifyClass {
class UpdaterClass {
public:
- typedef std::function THandlerFunction_Progress;
-
+ using THandlerFunction_Progress = std::function;
+ using THandlerFunction_Error = std::function;
+ using THandlerFunction = std::function;
+
UpdaterClass();
+ ~UpdaterClass();
/* Optionally add a cryptographic signature verification hash and method */
void installSignature(UpdaterHashClass *hash, UpdaterVerifyClass *verify) { _hash = hash; _verify = verify; }
@@ -64,7 +71,7 @@ class UpdaterClass {
bool begin(size_t size, int command = U_FLASH, int ledPin = -1, uint8_t ledOn = LOW);
/*
- Run Updater from asynchronous callbacs
+ Run Updater from asynchronous callbacks
*/
void runAsync(bool async){ _async = async; }
@@ -81,7 +88,7 @@ class UpdaterClass {
Should be equal to the remaining bytes when called
Usable for slow streams like Serial
*/
- size_t writeStream(Stream &data);
+ size_t writeStream(Stream &data, uint16_t streamTimeout = 60000);
/*
If all bytes are written
@@ -95,6 +102,11 @@ class UpdaterClass {
*/
bool end(bool evenIfRemaining = false);
+ /*
+ Gets the last error description as string
+ */
+ String getErrorString() const;
+
/*
Prints the last error to an output stream
*/
@@ -106,19 +118,46 @@ class UpdaterClass {
bool setMD5(const char * expected_md5);
/*
- returns the MD5 String of the sucessfully ended firmware
+ returns the MD5 String of the successfully ended firmware
*/
String md5String(void){ return _md5.toString(); }
/*
- populated the result with the md5 bytes of the sucessfully ended firmware
+ populated the result with the md5 bytes of the successfully ended firmware
*/
void md5(uint8_t * result){ return _md5.getBytes(result); }
/*
This callback will be called when Updater is receiving data
*/
- UpdaterClass& onProgress(THandlerFunction_Progress fn);
+ UpdaterClass& onProgress(THandlerFunction_Progress fn) {
+ _progress_callback = std::move(fn);
+ return *this;
+ }
+
+ /*
+ This callback will be called when Updater ends
+ */
+ UpdaterClass& onError(THandlerFunction_Error fn) {
+ _error_callback = std::move(fn);
+ return *this;
+ }
+
+ /*
+ This callback will be called when Updater begins
+ */
+ UpdaterClass& onStart(THandlerFunction fn) {
+ _start_callback = std::move(fn);
+ return *this;
+ }
+
+ /*
+ This callback will be called when Updater ends
+ */
+ UpdaterClass& onEnd(THandlerFunction fn) {
+ _end_callback = std::move(fn);
+ return *this;
+ }
//Helpers
uint8_t getError(){ return _error; }
@@ -173,35 +212,39 @@ class UpdaterClass {
}
private:
- void _reset();
+ void _reset(bool callback = true);
bool _writeBuffer();
bool _verifyHeader(uint8_t data);
bool _verifyEnd();
- void _setError(int error);
+ void _setError(int error);
- bool _async;
- uint8_t _error;
- uint8_t *_buffer;
- size_t _bufferLen; // amount of data written into _buffer
- size_t _bufferSize; // total size of _buffer
- size_t _size;
- uint32_t _startAddress;
- uint32_t _currentAddress;
- uint32_t _command;
+ bool _async = false;
+ uint8_t _error = 0;
+ uint8_t *_buffer = nullptr;
+ size_t _bufferLen = 0; // amount of data written into _buffer
+ size_t _bufferSize = 0; // total size of _buffer
+ size_t _size = 0;
+ uint32_t _startAddress = 0;
+ uint32_t _currentAddress = 0;
+ uint32_t _command = U_FLASH;
String _target_md5;
MD5Builder _md5;
- int _ledPin;
+ int _ledPin = -1;
uint8_t _ledOn;
// Optional signed binary verification
- UpdaterHashClass *_hash;
- UpdaterVerifyClass *_verify;
- // Optional progress callback function
- THandlerFunction_Progress _progress_callback;
+ UpdaterHashClass *_hash = nullptr;
+ UpdaterVerifyClass *_verify = nullptr;
+
+ // Optional lifetime callback functions
+ THandlerFunction_Progress _progress_callback = nullptr;
+ THandlerFunction_Error _error_callback = nullptr;
+ THandlerFunction _start_callback = nullptr;
+ THandlerFunction _end_callback = nullptr;
};
extern UpdaterClass Update;
diff --git a/cores/esp8266/WMath.cpp b/cores/esp8266/WMath.cpp
index 1f0c8d7dbe..d8dc1f82f2 100644
--- a/cores/esp8266/WMath.cpp
+++ b/cores/esp8266/WMath.cpp
@@ -23,6 +23,8 @@
$Id$
*/
+#include "Arduino.h"
+
extern "C" {
#include
}
@@ -70,17 +72,17 @@ long secureRandom(long howsmall, long howbig) {
}
long map(long x, long in_min, long in_max, long out_min, long out_max) {
- long divisor = (in_max - in_min);
- if(divisor == 0){
- return -1; //AVR returns -1, SAM returns 0
- }
- return (x - in_min) * (out_max - out_min) / divisor + out_min;
+ const long dividend = out_max - out_min;
+ const long divisor = in_max - in_min;
+ const long delta = x - in_min;
+
+ return (delta * dividend + (divisor / 2)) / divisor + out_min;
}
-unsigned int makeWord(unsigned int w) {
+uint16_t makeWord(uint16_t w) {
return w;
}
-unsigned int makeWord(unsigned char h, unsigned char l) {
+uint16_t makeWord(byte h, byte l) {
return (h << 8) | l;
}
diff --git a/cores/esp8266/WString.cpp b/cores/esp8266/WString.cpp
index 5e31b27704..1e608c3c92 100644
--- a/cores/esp8266/WString.cpp
+++ b/cores/esp8266/WString.cpp
@@ -21,541 +21,591 @@
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
-#include
+#include "Arduino.h"
#include "WString.h"
#include "stdlib_noniso.h"
+#include
+
+#define OOM_STRING_BORDER_DISPLAY 10
+#define OOM_STRING_THRESHOLD_REALLOC_WARN 128
+
+#define __STRHELPER(x) #x
+#define STR(x) __STRHELPER(x) // stringifier
+
/*********************************************/
-/* Constructors */
+/* Conversion helpers */
/*********************************************/
-String::String(const char *cstr) {
- init();
- if (cstr)
- copy(cstr, strlen(cstr));
+static String toString(unsigned char value, unsigned char base) {
+ String out;
+
+ char buf[1 + std::numeric_limits::digits];
+ out = utoa(value, buf, base);
+
+ return out;
}
-String::String(const String &value) {
- init();
- *this = value;
+static String toString(int value, unsigned char base) {
+ String out;
+
+ char buf[2 + std::numeric_limits::digits];
+ out = itoa(value, buf, base);
+
+ return out;
}
-String::String(const __FlashStringHelper *pstr) {
- init();
- *this = pstr; // see operator =
+static String toString(unsigned int value, unsigned char base) {
+ String out;
+
+ char buf[1 + std::numeric_limits::digits];
+ out = utoa(value, buf, base);
+
+ return out;
}
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
-String::String(String &&rval) {
- init();
- move(rval);
+static String toString(long value, unsigned char base) {
+ String out;
+
+ char buf[2 + std::numeric_limits::digits];
+ out = ltoa(value, buf, base);
+
+ return out;
}
-String::String(StringSumHelper &&rval) {
- init();
- move(rval);
+static String toString(unsigned long value, unsigned char base) {
+ String out;
+
+ char buf[1 + std::numeric_limits::digits];
+ out = ultoa(value, buf, base);
+
+ return out;
}
-#endif
-String::String(char c) {
- init();
- char buf[2];
- buf[0] = c;
- buf[1] = 0;
- *this = buf;
+// TODO: {u,}lltoa don't guarantee that the buffer is usable directly, one should always use the returned pointer
+
+static String toString(long long value, unsigned char base) {
+ String out;
+
+ char buf[2 + std::numeric_limits::digits];
+ out = lltoa(value, buf, sizeof(buf), base);
+
+ return out;
}
-String::String(unsigned char value, unsigned char base) {
- init();
- char buf[1 + 8 * sizeof(unsigned char)];
- utoa(value, buf, base);
- *this = buf;
+static String toString(unsigned long long value, unsigned char base) {
+ String out;
+
+ char buf[1 + std::numeric_limits::digits];
+ out = ulltoa(value, buf, sizeof(buf), base);
+
+ return out;
}
-String::String(int value, unsigned char base) {
- init();
- char buf[2 + 8 * sizeof(int)];
- if (base == 10) {
- sprintf(buf, "%d", value);
- } else {
- itoa(value, buf, base);
- }
- *this = buf;
+static String toString(double value, unsigned char decimalPlaces) {
+ String out;
+
+ char buf[33];
+ out = dtostrf(value, (decimalPlaces + 2), decimalPlaces, buf);
+
+ return out;
}
-String::String(unsigned int value, unsigned char base) {
- init();
- char buf[1 + 8 * sizeof(unsigned int)];
- utoa(value, buf, base);
- *this = buf;
+static String toString(float value, unsigned char decimalPlaces) {
+ return toString(static_cast(value), decimalPlaces);
}
-String::String(long value, unsigned char base) {
+/*********************************************/
+/* Constructors */
+/*********************************************/
+
+String::String(const char *cstr) {
init();
- char buf[2 + 8 * sizeof(long)];
- if (base==10) {
- sprintf(buf, "%ld", value);
- } else {
- ltoa(value, buf, base);
- }
- *this = buf;
+ if (cstr)
+ copy(cstr, strlen_P(cstr));
}
-String::String(unsigned long value, unsigned char base) {
+String::String(const String &value) {
init();
- char buf[1 + 8 * sizeof(unsigned long)];
- ultoa(value, buf, base);
- *this = buf;
+ *this = value;
}
-String::String(float value, unsigned char decimalPlaces) {
+String::String(const __FlashStringHelper *pstr) {
init();
- char buf[33];
- *this = dtostrf(value, (decimalPlaces + 2), decimalPlaces, buf);
+ *this = pstr; // see operator =
}
-String::String(double value, unsigned char decimalPlaces) {
+String::String(String &&rval) noexcept {
init();
- char buf[33];
- *this = dtostrf(value, (decimalPlaces + 2), decimalPlaces, buf);
+ move(rval);
}
-String::~String() {
- invalidate();
-}
+String::String(unsigned char value, unsigned char base) :
+ String(toString(value, base))
+{}
-// /*********************************************/
-// /* Memory Management */
-// /*********************************************/
+String::String(int value, unsigned char base) :
+ String(toString(value, base))
+{}
-inline void String::init(void) {
- setSSO(true);
- setLen(0);
- wbuffer()[0] = 0;
-}
+String::String(unsigned int value, unsigned char base) :
+ String(toString(value, base))
+{}
+
+String::String(long value, unsigned char base) :
+ String(toString(value, base))
+{}
+
+String::String(unsigned long value, unsigned char base) :
+ String(toString(value, base))
+{}
+
+String::String(long long value, unsigned char base) :
+ String(toString(value, base))
+{}
+
+String::String(unsigned long long value, unsigned char base) :
+ String(toString(value, base))
+{}
+
+String::String(float value, unsigned char decimalPlaces) :
+ String(toString(value, decimalPlaces))
+{}
+
+String::String(double value, unsigned char decimalPlaces) :
+ String(toString(value, decimalPlaces))
+{}
+
+/*********************************************/
+/* Memory Management */
+/*********************************************/
void String::invalidate(void) {
- if(!isSSO() && wbuffer())
+ if (!isSSO() && wbuffer())
free(wbuffer());
init();
}
-unsigned char String::reserve(unsigned int size) {
- if(buffer() && capacity() >= size)
- return 1;
- if(changeBuffer(size)) {
- if(len() == 0)
+bool String::reserve(unsigned int size) {
+ if (buffer() && capacity() >= size)
+ return true;
+ if (changeBuffer(size)) {
+ if (len() == 0)
wbuffer()[0] = 0;
- return 1;
+ return true;
}
- return 0;
+ return false;
+}
+
+#ifdef DEBUG_ESP_PORT
+static void identifyString (const String& badOne)
+{
+ DEBUG_ESP_PORT.printf("[String] '%." STR(OOM_STRING_BORDER_DISPLAY) "s ... %." STR(OOM_STRING_BORDER_DISPLAY) "s': ",
+ badOne.c_str(),
+ badOne.length() > OOM_STRING_BORDER_DISPLAY? badOne.c_str() + std::max((int)badOne.length() - OOM_STRING_BORDER_DISPLAY, OOM_STRING_BORDER_DISPLAY): "");
}
+#endif
-unsigned char String::changeBuffer(unsigned int maxStrLen) {
+bool String::changeBuffer(unsigned int maxStrLen) {
// Can we use SSO here to avoid allocation?
if (maxStrLen < sizeof(sso.buff) - 1) {
if (isSSO() || !buffer()) {
// Already using SSO, nothing to do
- uint16_t oldLen = len();
+ uint16_t oldLen = len();
setSSO(true);
- setLen(oldLen);
- return 1;
+ setLen(oldLen);
} else { // if bufptr && !isSSO()
// Using bufptr, need to shrink into sso.buff
- char temp[sizeof(sso.buff)];
- memcpy(temp, buffer(), maxStrLen);
- free(wbuffer());
+ const char *temp = buffer();
uint16_t oldLen = len();
setSSO(true);
- setLen(oldLen);
+ setLen(oldLen);
memcpy(wbuffer(), temp, maxStrLen);
- return 1;
+ free((void *)temp);
}
+ return true;
}
// Fallthrough to normal allocator
size_t newSize = (maxStrLen + 16) & (~0xf);
+#ifdef DEBUG_ESP_PORT
+ if (!isSSO() && capacity() >= OOM_STRING_THRESHOLD_REALLOC_WARN && maxStrLen > capacity()) {
+ // warn when badly re-allocating
+ identifyString(*this);
+ DEBUG_ESP_PORT.printf("Reallocating large String(%d -> %d bytes)\n", len(), maxStrLen);
+ }
+#endif
// Make sure we can fit newsize in the buffer
if (newSize > CAPACITY_MAX) {
+#ifdef DEBUG_ESP_PORT
+ identifyString(*this);
+ DEBUG_ESP_PORT.printf("Maximum capacity reached (" STR(CAPACITY_MAX) ")\n");
+#endif
return false;
}
uint16_t oldLen = len();
- char *newbuffer = (char *) realloc(isSSO() ? nullptr : wbuffer(), newSize);
+ char *newbuffer = (char *)realloc(isSSO() ? nullptr : wbuffer(), newSize);
if (newbuffer) {
size_t oldSize = capacity() + 1; // include NULL.
if (isSSO()) {
// Copy the SSO buffer into allocated space
memmove_P(newbuffer, sso.buff, sizeof(sso.buff));
}
- if (newSize > oldSize)
- {
+ if (newSize > oldSize) {
memset(newbuffer + oldSize, 0, newSize - oldSize);
}
setSSO(false);
setCapacity(newSize - 1);
setLen(oldLen); // Needed in case of SSO where len() never existed
setBuffer(newbuffer);
- return 1;
+ return true;
}
- return 0;
+#ifdef DEBUG_ESP_PORT
+ identifyString(*this);
+ DEBUG_ESP_PORT.printf("OOM: %d -> %zu bytes\n", isSSO() ? 0: capacity(), newSize);
+#endif
+ return false;
}
-// /*********************************************/
-// /* Copy and Move */
-// /*********************************************/
+/*********************************************/
+/* Copy and Move */
+/*********************************************/
-String & String::copy(const char *cstr, unsigned int length) {
- if(!reserve(length)) {
+String &String::copy(const char *cstr, unsigned int length) {
+ if (!reserve(length)) {
invalidate();
return *this;
}
setLen(length);
- memmove_P(wbuffer(), cstr, length + 1);
+ memmove_P(wbuffer(), cstr, length);
+ wbuffer()[length] = 0;
return *this;
}
-String & String::copy(const __FlashStringHelper *pstr, unsigned int length) {
+String &String::copy(const __FlashStringHelper *pstr, unsigned int length) {
if (!reserve(length)) {
invalidate();
return *this;
}
setLen(length);
- memcpy_P(wbuffer(), (PGM_P)pstr, length + 1); // We know wbuffer() cannot ever be in PROGMEM, so memcpy safe here
+ memcpy_P(wbuffer(), (PGM_P)pstr, length); // We know wbuffer() cannot ever be in PROGMEM, so memcpy safe here
+ wbuffer()[length] = 0;
return *this;
}
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
-void String::move(String &rhs) {
- if(buffer()) {
- if(capacity() >= rhs.len()) {
- memmove_P(wbuffer(), rhs.buffer(), rhs.length() + 1);
- setLen(rhs.len());
- rhs.invalidate();
- return;
- } else {
- if (!isSSO()) {
- free(wbuffer());
- setBuffer(nullptr);
- }
- }
- }
- if (rhs.isSSO()) {
- setSSO(true);
- memmove_P(sso.buff, rhs.sso.buff, sizeof(sso.buff));
- } else {
- setSSO(false);
- setBuffer(rhs.wbuffer());
- }
- setCapacity(rhs.capacity());
- setLen(rhs.len());
- rhs.setSSO(false);
- rhs.setCapacity(0);
- rhs.setLen(0);
- rhs.setBuffer(nullptr);
+void String::move(String &rhs) noexcept {
+ invalidate();
+ sso = rhs.sso;
+ rhs.init();
}
-#endif
-String & String::operator =(const String &rhs) {
- if(this == &rhs)
+String &String::operator =(const String &rhs) {
+ if (this == &rhs)
return *this;
-
- if(rhs.buffer())
+ if (rhs.buffer())
copy(rhs.buffer(), rhs.len());
else
invalidate();
-
return *this;
}
-#ifdef __GXX_EXPERIMENTAL_CXX0X__
-String & String::operator =(String &&rval) {
- if(this != &rval)
+String &String::operator =(String &&rval) noexcept {
+ if (this != &rval)
move(rval);
return *this;
}
-String & String::operator =(StringSumHelper &&rval) {
- if(this != &rval)
- move(rval);
+String &String::operator =(const char *cstr) {
+ if (cstr)
+ copy(cstr, strlen(cstr));
+ else
+ invalidate();
return *this;
}
-#endif
-String & String::operator =(const char *cstr) {
- if(cstr)
- copy(cstr, strlen(cstr));
+String &String::operator =(const __FlashStringHelper *pstr) {
+ if (pstr)
+ copy(pstr, strlen_P((PGM_P)pstr));
else
invalidate();
-
return *this;
}
-String & String::operator = (const __FlashStringHelper *pstr)
-{
- if (pstr) copy(pstr, strlen_P((PGM_P)pstr));
- else invalidate();
-
+String &String::operator =(char c) {
+ char buffer[2] { c, '\0' };
+ *this = buffer;
return *this;
}
-// /*********************************************/
-// /* concat */
-// /*********************************************/
+/*********************************************/
+/* concat */
+/*********************************************/
-unsigned char String::concat(const String &s) {
+bool String::concat(const String &s) {
// Special case if we're concatting ourself (s += s;) since we may end up
// realloc'ing the buffer and moving s.buffer in the method called
if (&s == this) {
unsigned int newlen = 2 * len();
if (!s.buffer())
- return 0;
+ return false;
if (s.len() == 0)
- return 1;
+ return true;
if (!reserve(newlen))
- return 0;
+ return false;
memmove_P(wbuffer() + len(), buffer(), len());
setLen(newlen);
- wbuffer()[len()] = 0;
- return 1;
+ wbuffer()[newlen] = 0;
+ return true;
} else {
return concat(s.buffer(), s.len());
}
}
-unsigned char String::concat(const char *cstr, unsigned int length) {
+bool String::concat(const char *cstr, unsigned int length) {
unsigned int newlen = len() + length;
- if(!cstr)
- return 0;
- if(length == 0)
- return 1;
- if(!reserve(newlen))
- return 0;
- memmove_P(wbuffer() + len(), cstr, length + 1);
+ if (!cstr)
+ return false;
+ if (length == 0)
+ return true;
+ if (!reserve(newlen))
+ return false;
+ memmove_P(wbuffer() + len(), cstr, length);
setLen(newlen);
- return 1;
+ wbuffer()[newlen] = 0;
+ return true;
}
-unsigned char String::concat(const char *cstr) {
- if(!cstr)
- return 0;
+bool String::concat(const char *cstr) {
+ if (!cstr)
+ return false;
return concat(cstr, strlen(cstr));
}
-unsigned char String::concat(char c) {
- char buf[2];
- buf[0] = c;
- buf[1] = 0;
- return concat(buf, 1);
+bool String::concat(char c) {
+ return concat(&c, 1);
}
-unsigned char String::concat(unsigned char num) {
- char buf[1 + 3 * sizeof(unsigned char)];
- sprintf(buf, "%d", num);
- return concat(buf, strlen(buf));
+bool String::concat(unsigned char num) {
+ return concat(String(num));
}
-unsigned char String::concat(int num) {
- char buf[2 + 3 * sizeof(int)];
- sprintf(buf, "%d", num);
- return concat(buf, strlen(buf));
+bool String::concat(int num) {
+ return concat(String(num));
}
-unsigned char String::concat(unsigned int num) {
- char buf[1 + 3 * sizeof(unsigned int)];
- utoa(num, buf, 10);
- return concat(buf, strlen(buf));
+bool String::concat(unsigned int num) {
+ return concat(String(num));
}
-unsigned char String::concat(long num) {
- char buf[2 + 3 * sizeof(long)];
- sprintf(buf, "%ld", num);
- return concat(buf, strlen(buf));
+bool String::concat(long num) {
+ return concat(String(num));
}
-unsigned char String::concat(unsigned long num) {
- char buf[1 + 3 * sizeof(unsigned long)];
- ultoa(num, buf, 10);
- return concat(buf, strlen(buf));
+bool String::concat(unsigned long num) {
+ return concat(String(num));
}
-unsigned char String::concat(float num) {
- char buf[20];
- char* string = dtostrf(num, 4, 2, buf);
- return concat(string, strlen(string));
+bool String::concat(long long num) {
+ return concat(String(num));
}
-unsigned char String::concat(double num) {
- char buf[20];
- char* string = dtostrf(num, 4, 2, buf);
- return concat(string, strlen(string));
+bool String::concat(unsigned long long num) {
+ return concat(String(num));
}
-unsigned char String::concat(const __FlashStringHelper * str) {
- if (!str) return 0;
+bool String::concat(float num) {
+ return concat(String(num));
+}
+
+bool String::concat(double num) {
+ return concat(String(num));
+}
+
+bool String::concat(const __FlashStringHelper *str) {
+ if (!str)
+ return false;
int length = strlen_P((PGM_P)str);
- if (length == 0) return 1;
+ if (length == 0)
+ return true;
unsigned int newlen = len() + length;
- if (!reserve(newlen)) return 0;
- memcpy_P(wbuffer() + len(), (PGM_P)str, length + 1);
+ if (!reserve(newlen))
+ return false;
+ memcpy_P(wbuffer() + len(), (PGM_P)str, length);
setLen(newlen);
- return 1;
+ wbuffer()[newlen] = 0;
+ return true;
}
/*********************************************/
-/* Concatenate */
+/* Insert */
/*********************************************/
-StringSumHelper & operator +(const StringSumHelper &lhs, const String &rhs) {
- StringSumHelper &a = const_cast(lhs);
- if(!a.concat(rhs.buffer(), rhs.len()))
- a.invalidate();
- return a;
-}
+String &String::insert(size_t position, const char *other, size_t other_length) {
+ if (position > length())
+ return *this;
-StringSumHelper & operator +(const StringSumHelper &lhs, const char *cstr) {
- StringSumHelper &a = const_cast(lhs);
- if(!cstr || !a.concat(cstr, strlen(cstr)))
- a.invalidate();
- return a;
-}
+ auto len = length();
+ auto total = len + other_length;
+ if (!reserve(total))
+ return *this;
+
+ auto left = len - position;
+ setLen(total);
+
+ auto *start = wbuffer() + position;
+ memmove(start + other_length, start, left);
+ memmove_P(start, other, other_length);
+ wbuffer()[total] = '\0';
-StringSumHelper & operator +(const StringSumHelper &lhs, char c) {
- StringSumHelper &a = const_cast(lhs);
- if(!a.concat(c))
- a.invalidate();
- return a;
+ return *this;
}
-StringSumHelper & operator +(const StringSumHelper &lhs, unsigned char num) {
- StringSumHelper &a = const_cast(lhs);
- if(!a.concat(num))
- a.invalidate();
- return a;
+String &String::insert(size_t position, const __FlashStringHelper *other) {
+ auto *p = reinterpret_cast(other);
+ return insert(position, p, strlen_P(p));
}
-StringSumHelper & operator +(const StringSumHelper &lhs, int num) {
- StringSumHelper &a = const_cast(lhs);
- if(!a.concat(num))
- a.invalidate();
- return a;
+String &String::insert(size_t position, char other) {
+ char tmp[2] { other, '\0' };
+ return insert(position, tmp, 1);
}
-StringSumHelper & operator +(const StringSumHelper &lhs, unsigned int num) {
- StringSumHelper &a = const_cast(lhs);
- if(!a.concat(num))
- a.invalidate();
- return a;
+String &String::insert(size_t position, const char *other) {
+ return insert(position, other, strlen(other));
}
-StringSumHelper & operator +(const StringSumHelper &lhs, long num) {
- StringSumHelper &a = const_cast(lhs);
- if(!a.concat(num))
- a.invalidate();
- return a;
+String &String::insert(size_t position, const String &other) {
+ return insert(position, other.c_str(), other.length());
}
-StringSumHelper & operator +(const StringSumHelper &lhs, unsigned long num) {
- StringSumHelper &a = const_cast(lhs);
- if(!a.concat(num))
- a.invalidate();
- return a;
+String operator +(const String &lhs, String &&rhs) {
+ String res;
+ auto total = lhs.length() + rhs.length();
+ if (rhs.capacity() > total) {
+ rhs.insert(0, lhs);
+ res = std::move(rhs);
+ } else {
+ res.reserve(total);
+ res += lhs;
+ res += rhs;
+ rhs.invalidate();
+ }
+
+ return res;
}
-StringSumHelper & operator +(const StringSumHelper &lhs, float num) {
- StringSumHelper &a = const_cast(lhs);
- if(!a.concat(num))
- a.invalidate();
- return a;
+String operator +(String &&lhs, String &&rhs) {
+ String res;
+ auto total = lhs.length() + rhs.length();
+ if ((total > lhs.capacity()) && (total < rhs.capacity())) {
+ rhs.insert(0, lhs);
+ res = std::move(rhs);
+ } else {
+ lhs += rhs;
+ rhs.invalidate();
+ res = std::move(lhs);
+ }
+
+ return res;
}
-StringSumHelper & operator +(const StringSumHelper &lhs, double num) {
- StringSumHelper &a = const_cast(lhs);
- if(!a.concat(num))
- a.invalidate();
- return a;
+String operator +(char lhs, const String &rhs) {
+ String res;
+ res.reserve(rhs.length() + 1);
+ res += lhs;
+ res += rhs;
+ return res;
}
-StringSumHelper & operator + (const StringSumHelper &lhs, const __FlashStringHelper *rhs)
-{
- StringSumHelper &a = const_cast(lhs);
- if (!a.concat(rhs))
- a.invalidate();
- return a;
+String operator +(const char *lhs, const String &rhs) {
+ String res;
+ res.reserve(strlen_P(lhs) + rhs.length());
+ res += lhs;
+ res += rhs;
+ return res;
}
-// /*********************************************/
-// /* Comparison */
-// /*********************************************/
+/*********************************************/
+/* Comparison */
+/*********************************************/
int String::compareTo(const String &s) const {
- if(!buffer() || !s.buffer()) {
- if(s.buffer() && s.len() > 0)
- return 0 - *(unsigned char *) s.buffer();
- if(buffer() && len() > 0)
- return *(unsigned char *) buffer();
+ if (!buffer() || !s.buffer()) {
+ if (s.buffer() && s.len() > 0)
+ return 0 - *(unsigned char *)s.buffer();
+ if (buffer() && len() > 0)
+ return *(unsigned char *)buffer();
return 0;
}
return strcmp(buffer(), s.buffer());
}
-unsigned char String::equals(const String &s2) const {
+bool String::equals(const String &s2) const {
return (len() == s2.len() && compareTo(s2) == 0);
}
-unsigned char String::equals(const char *cstr) const {
- if(len() == 0)
+bool String::equals(const char *cstr) const {
+ if (len() == 0)
return (cstr == NULL || *cstr == 0);
- if(cstr == NULL)
+ if (cstr == NULL)
return buffer()[0] == 0;
return strcmp(buffer(), cstr) == 0;
}
-unsigned char String::operator<(const String &rhs) const {
+bool String::equals(const __FlashStringHelper *s) const {
+ return equals(String(s));
+}
+
+bool String::operator<(const String &rhs) const {
return compareTo(rhs) < 0;
}
-unsigned char String::operator>(const String &rhs) const {
+bool String::operator>(const String &rhs) const {
return compareTo(rhs) > 0;
}
-unsigned char String::operator<=(const String &rhs) const {
+bool String::operator<=(const String &rhs) const {
return compareTo(rhs) <= 0;
}
-unsigned char String::operator>=(const String &rhs) const {
+bool String::operator>=(const String &rhs) const {
return compareTo(rhs) >= 0;
}
-unsigned char String::equalsIgnoreCase(const String &s2) const {
- if(this == &s2)
- return 1;
- if(len() != s2.len())
- return 0;
- if(len() == 0)
- return 1;
+bool String::equalsIgnoreCase(const String &s2) const {
+ if (this == &s2)
+ return true;
+ if (len() != s2.len())
+ return false;
+ if (len() == 0)
+ return true;
const char *p1 = buffer();
const char *p2 = s2.buffer();
- while(*p1) {
- if(tolower(*p1++) != tolower(*p2++))
- return 0;
+ while (*p1) {
+ if (tolower(*p1++) != tolower(*p2++))
+ return false;
}
- return 1;
+ return true;
+}
+
+bool String::equalsIgnoreCase(const __FlashStringHelper *s) const {
+ return equalsIgnoreCase(String(s));
}
unsigned char String::equalsConstantTime(const String &s2) const {
// To avoid possible time-based attacks present function
// compares given strings in a constant time.
- if(len() != s2.len())
+ if (len() != s2.len())
return 0;
//at this point lengths are the same
- if(len() == 0)
+ if (len() == 0)
return 1;
- //at this point lenghts are the same and non-zero
+ //at this point lengths are the same and non-zero
const char *p1 = buffer();
const char *p2 = s2.buffer();
unsigned int equalchars = 0;
unsigned int diffchars = 0;
- while(*p1) {
- if(*p1 == *p2)
+ while (*p1) {
+ if (*p1 == *p2)
++equalchars;
else
++diffchars;
@@ -568,40 +618,55 @@ unsigned char String::equalsConstantTime(const String &s2) const {
return (equalcond & diffcond); //bitwise AND
}
-unsigned char String::startsWith(const String &s2) const {
- if(len() < s2.len())
- return 0;
+bool String::startsWith(const String &s2) const {
+ if (len() < s2.len())
+ return false;
return startsWith(s2, 0);
}
-unsigned char String::startsWith(const String &s2, unsigned int offset) const {
- if(offset > (unsigned)(len() - s2.len()) || !buffer() || !s2.buffer())
- return 0;
+bool String::startsWith(const char *prefix) const {
+ return this->startsWith(String(prefix));
+}
+bool String::startsWith(const __FlashStringHelper *prefix) const {
+ return this->startsWith(String(prefix));
+}
+
+bool String::startsWith(const String &s2, unsigned int offset) const {
+ if (offset > (unsigned)(len() - s2.len()) || !buffer() || !s2.buffer())
+ return false;
return strncmp(&buffer()[offset], s2.buffer(), s2.len()) == 0;
}
-unsigned char String::endsWith(const String &s2) const {
- if(len() < s2.len() || !buffer() || !s2.buffer())
- return 0;
- return strcmp(&buffer()[len() - s2.len()], s2.buffer()) == 0;
+bool String::startsWith(const __FlashStringHelper *prefix, unsigned int offset) const {
+ return startsWith(String(prefix), offset);
}
-// /*********************************************/
-// /* Character Access */
-// /*********************************************/
+bool String::endsWith(const String &s2) const {
+ if (len() < s2.len() || !buffer() || !s2.buffer())
+ return false;
+ return strcmp(&buffer()[len() - s2.len()], s2.buffer()) == 0;
+}
-char String::charAt(unsigned int loc) const {
- return operator[](loc);
+bool String::endsWith(const char *suffix) const {
+ return this->endsWith(String(suffix));
+}
+bool String::endsWith(const __FlashStringHelper *suffix) const {
+ return this->endsWith(String(suffix));
}
+
+/*********************************************/
+/* Character Access */
+/*********************************************/
+
void String::setCharAt(unsigned int loc, char c) {
- if(loc < len())
+ if (loc < len())
wbuffer()[loc] = c;
}
-char & String::operator[](unsigned int index) {
+char &String::operator[](unsigned int index) {
static char dummy_writable_char;
- if(index >= len() || !buffer()) {
+ if (index >= len() || !buffer()) {
dummy_writable_char = 0;
return dummy_writable_char;
}
@@ -609,69 +674,61 @@ char & String::operator[](unsigned int index) {
}
char String::operator[](unsigned int index) const {
- if(index >= len() || !buffer())
- return 0;
+ if (index >= len() || !buffer())
+ return '\0';
return buffer()[index];
}
void String::getBytes(unsigned char *buf, unsigned int bufsize, unsigned int index) const {
- if(!bufsize || !buf)
+ if (!bufsize || !buf)
return;
- if(index >= len()) {
+ if (index >= len()) {
buf[0] = 0;
return;
}
unsigned int n = bufsize - 1;
- if(n > len() - index)
+ if (n > len() - index)
n = len() - index;
- strncpy((char *) buf, buffer() + index, n);
+ strncpy((char *)buf, buffer() + index, n);
buf[n] = 0;
}
-// /*********************************************/
-// /* Search */
-// /*********************************************/
-
-int String::indexOf(char c) const {
- return indexOf(c, 0);
-}
+/*********************************************/
+/* Search */
+/*********************************************/
int String::indexOf(char ch, unsigned int fromIndex) const {
- if(fromIndex >= len())
+ if (fromIndex >= len())
return -1;
- const char* temp = strchr(buffer() + fromIndex, ch);
- if(temp == NULL)
+ const char *temp = strchr(buffer() + fromIndex, ch);
+ if (temp == NULL)
return -1;
return temp - buffer();
}
-int String::indexOf(const String &s2) const {
- return indexOf(s2, 0);
-}
-
-int String::indexOf(const String &s2, unsigned int fromIndex) const {
- if(fromIndex >= len())
+int String::indexOf(const char *s2, unsigned int fromIndex) const {
+ if (fromIndex >= len())
return -1;
- const char *found = strstr(buffer() + fromIndex, s2.buffer());
- if(found == NULL)
+ const char *found = strstr_P(buffer() + fromIndex, s2);
+ if (found == NULL)
return -1;
return found - buffer();
}
-int String::lastIndexOf(char theChar) const {
- return lastIndexOf(theChar, len() - 1);
+int String::indexOf(const String &s2, unsigned int fromIndex) const {
+ return indexOf(s2.c_str(), fromIndex);
+}
+
+int String::lastIndexOf(char ch) const {
+ return lastIndexOf(ch, len() - 1);
}
int String::lastIndexOf(char ch, unsigned int fromIndex) const {
- if(fromIndex >= len())
- return -1;
- char tempchar = buffer()[fromIndex + 1];
- wbuffer()[fromIndex + 1] = '\0';
- char* temp = strrchr(wbuffer(), ch);
- wbuffer()[fromIndex + 1] = tempchar;
- if(temp == NULL)
+ if (fromIndex >= len())
return -1;
- return temp - buffer();
+ int index = fromIndex + 1;
+ while (index-- > 0 && buffer()[index] != ch);
+ return index;
}
int String::lastIndexOf(const String &s2) const {
@@ -679,66 +736,72 @@ int String::lastIndexOf(const String &s2) const {
}
int String::lastIndexOf(const String &s2, unsigned int fromIndex) const {
- if(s2.len() == 0 || len() == 0 || s2.len() > len())
+ if (s2.len() == 0 || len() == 0 || s2.len() > len())
return -1;
- if(fromIndex >= len())
+ if (fromIndex >= len())
fromIndex = len() - 1;
int found = -1;
- for(char *p = wbuffer(); p <= wbuffer() + fromIndex; p++) {
+ for (const char *p = buffer(); p <= buffer() + fromIndex; p++) {
p = strstr(p, s2.buffer());
- if(!p)
+ if (!p)
break;
- if((unsigned int) (p - wbuffer()) <= fromIndex)
+ if ((unsigned int)(p - buffer()) <= fromIndex)
found = p - buffer();
}
return found;
}
+int String::lastIndexOf(const __FlashStringHelper *str) const {
+ return lastIndexOf(String(str));
+}
+
+int String::lastIndexOf(const __FlashStringHelper *str, unsigned int fromIndex) const {
+ return lastIndexOf(String(str), fromIndex);
+}
+
+
String String::substring(unsigned int left, unsigned int right) const {
- if(left > right) {
+ if (left > right) {
unsigned int temp = right;
right = left;
left = temp;
}
String out;
- if(left >= len())
+ if (left >= len())
return out;
- if(right > len())
+ if (right > len())
right = len();
- char temp = buffer()[right]; // save the replaced character
- wbuffer()[right] = '\0';
- out = wbuffer() + left; // pointer arithmetic
- wbuffer()[right] = temp; //restore character
+ out.concat(buffer() + left, right - left);
return out;
}
-// /*********************************************/
-// /* Modification */
-// /*********************************************/
+/*********************************************/
+/* Modification */
+/*********************************************/
void String::replace(char find, char replace) {
- if(!buffer())
+ if (!buffer())
return;
- for(char *p = wbuffer(); *p; p++) {
- if(*p == find)
+ for (char *p = wbuffer(); *p; p++) {
+ if (*p == find)
*p = replace;
}
}
-void String::replace(const String& find, const String& replace) {
- if(len() == 0 || find.len() == 0)
+void String::replace(const String &find, const String &replace) {
+ if (len() == 0 || find.len() == 0)
return;
int diff = replace.len() - find.len();
char *readFrom = wbuffer();
char *foundAt;
- if(diff == 0) {
- while((foundAt = strstr(readFrom, find.buffer())) != NULL) {
+ if (diff == 0) {
+ while ((foundAt = strstr(readFrom, find.buffer())) != NULL) {
memmove_P(foundAt, replace.buffer(), replace.len());
readFrom = foundAt + replace.len();
}
- } else if(diff < 0) {
+ } else if (diff < 0) {
char *writeTo = wbuffer();
- while((foundAt = strstr(readFrom, find.buffer())) != NULL) {
+ while ((foundAt = strstr(readFrom, find.buffer())) != NULL) {
unsigned int n = foundAt - readFrom;
memmove_P(writeTo, readFrom, n);
writeTo += n;
@@ -747,22 +810,22 @@ void String::replace(const String& find, const String& replace) {
readFrom = foundAt + find.len();
setLen(len() + diff);
}
- memmove_P(writeTo, readFrom, strlen(readFrom)+1);
+ memmove_P(writeTo, readFrom, strlen(readFrom) + 1);
} else {
unsigned int size = len(); // compute size needed for result
- while((foundAt = strstr(readFrom, find.buffer())) != NULL) {
+ while ((foundAt = strstr(readFrom, find.buffer())) != NULL) {
readFrom = foundAt + find.len();
size += diff;
}
- if(size == len())
+ if (size == len())
+ return;
+ if (size > capacity() && !changeBuffer(size))
return;
- if(size > capacity() && !changeBuffer(size))
- return; // XXX: tell user!
int index = len() - 1;
- while(index >= 0 && (index = lastIndexOf(find, index)) >= 0) {
+ while (index >= 0 && (index = lastIndexOf(find, index)) >= 0) {
readFrom = wbuffer() + index + find.len();
memmove_P(readFrom + diff, readFrom, len() - (readFrom - buffer()));
- int newLen = len() + diff;
+ int newLen = len() + diff;
memmove_P(wbuffer() + index, replace.buffer(), replace.len());
setLen(newLen);
wbuffer()[newLen] = 0;
@@ -771,21 +834,32 @@ void String::replace(const String& find, const String& replace) {
}
}
-void String::remove(unsigned int index) {
- // Pass the biggest integer as the count. The remove method
- // below will take care of truncating it at the end of the
- // string.
- remove(index, (unsigned int) -1);
+
+void String::replace(const char *find, const String &replace) {
+ this->replace(String(find), replace);
+}
+void String::replace(const __FlashStringHelper *find, const String &replace) {
+ this->replace(String(find), replace);
+}
+void String::replace(const char *find, const char *replace) {
+ this->replace(String(find), String(replace));
+}
+void String::replace(const __FlashStringHelper *find, const char *replace) {
+ this->replace(String(find), String(replace));
}
+void String::replace(const __FlashStringHelper *find, const __FlashStringHelper *replace) {
+ this->replace(String(find), String(replace));
+}
+
void String::remove(unsigned int index, unsigned int count) {
- if(index >= len()) {
+ if (index >= len()) {
return;
}
- if(count <= 0) {
+ if (count <= 0) {
return;
}
- if(count > len() - index) {
+ if (count > len() - index) {
count = len() - index;
}
char *writeTo = wbuffer() + index;
@@ -796,40 +870,40 @@ void String::remove(unsigned int index, unsigned int count) {
}
void String::toLowerCase(void) {
- if(!buffer())
+ if (!buffer())
return;
- for(char *p = wbuffer(); *p; p++) {
+ for (char *p = wbuffer(); *p; p++) {
*p = tolower(*p);
}
}
void String::toUpperCase(void) {
- if(!buffer())
+ if (!buffer())
return;
- for(char *p = wbuffer(); *p; p++) {
+ for (char *p = wbuffer(); *p; p++) {
*p = toupper(*p);
}
}
void String::trim(void) {
- if(!buffer() || len() == 0)
+ if (!buffer() || len() == 0)
return;
char *begin = wbuffer();
- while(isspace(*begin))
+ while (isspace(*begin))
begin++;
char *end = wbuffer() + len() - 1;
- while(isspace(*end) && end >= begin)
+ while (isspace(*end) && end >= begin)
end--;
unsigned int newlen = end + 1 - begin;
setLen(newlen);
- if(begin > buffer())
+ if (begin > buffer())
memmove_P(wbuffer(), begin, newlen);
wbuffer()[newlen] = 0;
}
-// /*********************************************/
-// /* Parsing / Conversion */
-// /*********************************************/
+/*********************************************/
+/* Parsing / Conversion */
+/*********************************************/
long String::toInt(void) const {
if (buffer())
@@ -840,11 +914,10 @@ long String::toInt(void) const {
float String::toFloat(void) const {
if (buffer())
return atof(buffer());
- return 0;
+ return 0.0F;
}
-double String::toDouble(void) const
-{
+double String::toDouble(void) const {
if (buffer())
return atof(buffer());
return 0.0;
diff --git a/cores/esp8266/WString.h b/cores/esp8266/WString.h
index 8c970abf14..1a2aebb298 100644
--- a/cores/esp8266/WString.h
+++ b/cores/esp8266/WString.h
@@ -23,223 +23,279 @@
#define String_class_h
#ifdef __cplusplus
-#include
-#include
-#include
#include
-// An inherited class for holding the result of a concatenation. These
-// result objects are assumed to be writable by subsequent concatenations.
-class StringSumHelper;
+#include