Compare commits
14
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d8ad7e7c2b | ||
|
|
ef7b6ac00a | ||
|
|
29a7f74e97 | ||
|
|
523bc584fd | ||
|
|
6da131f43c | ||
|
|
bb491af421 | ||
|
|
fb90fdcee2 | ||
|
|
ffe88feddc | ||
|
|
e55431ad94 | ||
|
|
5432016c29 | ||
|
|
cf81631026 | ||
|
|
46160c64d0 | ||
|
|
91b7d53cdd | ||
|
|
7a3fae61e2 |
No files matched your search
@@ -0,0 +1,177 @@
|
|||||||
|
name: Build and Release OpenMQTTGateway Firmware
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- development
|
||||||
|
tags:
|
||||||
|
- '*'
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-and-release:
|
||||||
|
name: Build Firmware & Publish Gitea Release
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Cache PlatformIO packages
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
~/.platformio
|
||||||
|
.pio/libdeps
|
||||||
|
key: ${{ runner.os }}-pio-${{ hashFiles('platformio.ini', 'environments.ini') }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-pio-
|
||||||
|
|
||||||
|
- name: Install Python & PlatformIO
|
||||||
|
run: |
|
||||||
|
if ! python3 -m venv /tmp/pio-venv >/dev/null 2>&1; then
|
||||||
|
rm -rf /tmp/pio-venv
|
||||||
|
apt-get update && apt-get install -y python3 python3-venv python3-pip curl
|
||||||
|
python3 -m venv /tmp/pio-venv
|
||||||
|
fi
|
||||||
|
/tmp/pio-venv/bin/pip install --upgrade pip
|
||||||
|
/tmp/pio-venv/bin/pip install -U platformio setuptools
|
||||||
|
echo "/tmp/pio-venv/bin" >> "$GITHUB_PATH"
|
||||||
|
|
||||||
|
- name: Determine default environment and version
|
||||||
|
id: prep
|
||||||
|
run: |
|
||||||
|
# Only the first active "default_envs" entry from platformio.ini is built
|
||||||
|
PIO_ENV="$(sed -n 's/^[[:space:]]*default_envs[[:space:]]*=[[:space:]]*//p' platformio.ini \
|
||||||
|
| head -n 1 | cut -d',' -f1 | tr -d '[:space:]')"
|
||||||
|
if [ -z "${PIO_ENV}" ]; then
|
||||||
|
echo "No active default_envs found in platformio.ini" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
SHORT_SHA="${GITHUB_SHA::7}"
|
||||||
|
if [ "${GITHUB_REF_TYPE}" = "tag" ]; then
|
||||||
|
TAG_NAME="${GITHUB_REF_NAME}"
|
||||||
|
else
|
||||||
|
BASE_VERSION="$(git describe --tags --abbrev=0 2>/dev/null || echo v1.7.0)"
|
||||||
|
TAG_NAME="${BASE_VERSION}-b${GITHUB_RUN_NUMBER}-${SHORT_SHA}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Environment: ${PIO_ENV}, version: ${TAG_NAME}"
|
||||||
|
echo "pio_env=${PIO_ENV}" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "tag_name=${TAG_NAME}" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "short_sha=${SHORT_SHA}" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
|
- name: Set version tag in sources
|
||||||
|
env:
|
||||||
|
TAG_NAME: ${{ steps.prep.outputs.tag_name }}
|
||||||
|
run: |
|
||||||
|
sed -i "s/version_tag/${TAG_NAME}/g" main/User_config.h scripts/latest_version.json
|
||||||
|
|
||||||
|
- name: Build OpenMQTTGateway Firmware (${{ steps.prep.outputs.pio_env }})
|
||||||
|
env:
|
||||||
|
PIO_ENV: ${{ steps.prep.outputs.pio_env }}
|
||||||
|
run: |
|
||||||
|
mkdir -p ".pio/build/${PIO_ENV}"
|
||||||
|
pio run -e "${PIO_ENV}"
|
||||||
|
|
||||||
|
- name: Prepare Release Artifacts
|
||||||
|
env:
|
||||||
|
PIO_ENV: ${{ steps.prep.outputs.pio_env }}
|
||||||
|
TAG_NAME: ${{ steps.prep.outputs.tag_name }}
|
||||||
|
run: |
|
||||||
|
mkdir -p dist
|
||||||
|
# Only the firmware image is published
|
||||||
|
cp ".pio/build/${PIO_ENV}/firmware.bin" "dist/OpenMQTTGateway-${PIO_ENV}-${TAG_NAME}.bin"
|
||||||
|
ls -lA dist
|
||||||
|
|
||||||
|
- name: Create Gitea Release and Upload Binaries
|
||||||
|
env:
|
||||||
|
GITEA_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
PIO_ENV: ${{ steps.prep.outputs.pio_env }}
|
||||||
|
TAG_NAME: ${{ steps.prep.outputs.tag_name }}
|
||||||
|
SHORT_SHA: ${{ steps.prep.outputs.short_sha }}
|
||||||
|
run: |
|
||||||
|
python3 - << 'EOF'
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
import subprocess
|
||||||
|
import urllib.request
|
||||||
|
import urllib.error
|
||||||
|
|
||||||
|
server_url = os.environ["GITHUB_SERVER_URL"].rstrip("/")
|
||||||
|
repo = os.environ["GITHUB_REPOSITORY"]
|
||||||
|
token = os.environ["GITEA_TOKEN"]
|
||||||
|
tag_name = os.environ["TAG_NAME"]
|
||||||
|
sha = os.environ["GITHUB_SHA"]
|
||||||
|
short_sha = os.environ["SHORT_SHA"]
|
||||||
|
pio_env = os.environ["PIO_ENV"]
|
||||||
|
|
||||||
|
api_base = f"{server_url}/api/v1/repos/{repo}"
|
||||||
|
headers = {
|
||||||
|
"Authorization": f"token {token}",
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
"Accept": "application/json",
|
||||||
|
}
|
||||||
|
|
||||||
|
release_notes = (
|
||||||
|
f"Automated OpenMQTTGateway firmware build.\n\n"
|
||||||
|
f"- **Environment:** `{pio_env}`\n"
|
||||||
|
f"- **Commit:** `{short_sha}`\n"
|
||||||
|
f"- **OTA update:** Upload the `.bin` file via the WebUI / OTA."
|
||||||
|
)
|
||||||
|
|
||||||
|
# Check if a release for this tag already exists
|
||||||
|
release_id = None
|
||||||
|
existing_assets = {}
|
||||||
|
req = urllib.request.Request(f"{api_base}/releases/tags/{tag_name}", headers=headers)
|
||||||
|
try:
|
||||||
|
with urllib.request.urlopen(req) as resp:
|
||||||
|
data = json.loads(resp.read().decode("utf-8"))
|
||||||
|
release_id = data["id"]
|
||||||
|
existing_assets = {a["name"]: a["id"] for a in data.get("assets", [])}
|
||||||
|
print(f"Found existing release ID {release_id} for tag {tag_name}")
|
||||||
|
except urllib.error.HTTPError as e:
|
||||||
|
if e.code != 404:
|
||||||
|
raise
|
||||||
|
|
||||||
|
# Create a new release if none exists
|
||||||
|
if release_id is None:
|
||||||
|
payload = json.dumps({
|
||||||
|
"tag_name": tag_name,
|
||||||
|
"target_commitish": sha,
|
||||||
|
"name": f"OpenMQTTGateway {tag_name} ({pio_env})",
|
||||||
|
"body": release_notes,
|
||||||
|
"draft": False,
|
||||||
|
"prerelease": False,
|
||||||
|
}).encode("utf-8")
|
||||||
|
req = urllib.request.Request(f"{api_base}/releases", data=payload, headers=headers, method="POST")
|
||||||
|
with urllib.request.urlopen(req) as resp:
|
||||||
|
data = json.loads(resp.read().decode("utf-8"))
|
||||||
|
release_id = data["id"]
|
||||||
|
print(f"Created release ID {release_id} for tag {tag_name}")
|
||||||
|
|
||||||
|
# Upload firmware binaries in dist/
|
||||||
|
for filename in sorted(os.listdir("dist")):
|
||||||
|
if filename in existing_assets:
|
||||||
|
del_req = urllib.request.Request(
|
||||||
|
f"{api_base}/releases/{release_id}/assets/{existing_assets[filename]}",
|
||||||
|
headers=headers,
|
||||||
|
method="DELETE",
|
||||||
|
)
|
||||||
|
urllib.request.urlopen(del_req).close()
|
||||||
|
filepath = os.path.join("dist", filename)
|
||||||
|
print(f"Uploading {filename}...")
|
||||||
|
subprocess.run([
|
||||||
|
"curl", "--fail", "-sS", "-X", "POST",
|
||||||
|
"-H", f"Authorization: token {token}",
|
||||||
|
"-F", f"attachment=@{filepath}",
|
||||||
|
f"{api_base}/releases/{release_id}/assets?name={filename}"
|
||||||
|
], check=True)
|
||||||
|
print(f"Uploaded {filename} successfully.")
|
||||||
|
EOF
|
||||||
@@ -1,126 +0,0 @@
|
|||||||
name: Build
|
|
||||||
|
|
||||||
on: [push, pull_request]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
environments:
|
|
||||||
- "rfbridge"
|
|
||||||
- "rfbridge-direct"
|
|
||||||
- "esp32dev-all-test"
|
|
||||||
- "esp32dev-rf"
|
|
||||||
- "esp32dev-pilight-cc1101"
|
|
||||||
- "esp32dev-somfy-cc1101"
|
|
||||||
- "esp32dev-pilight-somfy-cc1101"
|
|
||||||
- "esp32dev-weatherstation"
|
|
||||||
- "esp32dev-gf-sun-inverter"
|
|
||||||
- "esp32dev-ir"
|
|
||||||
- "esp32dev-ble"
|
|
||||||
- "esp32dev-ble-mqtt-undecoded"
|
|
||||||
- "esp32dev-ble-aws"
|
|
||||||
- "esp32feather-ble"
|
|
||||||
- "esp32-lolin32lite-ble"
|
|
||||||
- "esp32-olimex-gtw-ble-eth"
|
|
||||||
- "esp32-olimex-gtw-ble-poe"
|
|
||||||
- "esp32-olimex-gtw-ble-poe-iso"
|
|
||||||
- "esp32-wt32-eth01-ble-eth"
|
|
||||||
- "esp32-olimex-gtw-ble-wifi"
|
|
||||||
- "esp32-m5stick-ble"
|
|
||||||
- "esp32-m5stack-ble"
|
|
||||||
- "esp32-m5tough-ble"
|
|
||||||
- "esp32-m5stick-c-ble"
|
|
||||||
- "esp32-m5stick-cp-ble"
|
|
||||||
- "esp32s3-atomS3U"
|
|
||||||
- "esp32-m5atom-matrix"
|
|
||||||
- "esp32-m5atom-lite"
|
|
||||||
- "esp32dev-rtl_433"
|
|
||||||
- "esp32doitv1-aithinker-r01-sx1278"
|
|
||||||
- "heltec-rtl_433"
|
|
||||||
- "heltec-rtl_433-fsk"
|
|
||||||
- "heltec-ble"
|
|
||||||
- "lilygo-rtl_433"
|
|
||||||
- "lilygo-rtl_433-fsk"
|
|
||||||
- "lilygo-ble"
|
|
||||||
- "esp32dev-multi_receiver"
|
|
||||||
- "esp32dev-multi_receiver-pilight"
|
|
||||||
- "tinypico-ble"
|
|
||||||
- "ttgo-lora32-v1"
|
|
||||||
- "ttgo-lora32-v21"
|
|
||||||
- "ttgo-t-beam"
|
|
||||||
- "heltec-wifi-lora-32"
|
|
||||||
- "shelly-plus1"
|
|
||||||
- "nodemcuv2-all-test"
|
|
||||||
- "nodemcuv2-fastled-test"
|
|
||||||
- "nodemcuv2-2g"
|
|
||||||
- "nodemcuv2-ir"
|
|
||||||
- "nodemcuv2-rs232"
|
|
||||||
- "avatto-bakeey-ir"
|
|
||||||
- "nodemcuv2-rf"
|
|
||||||
- "nodemcuv2-rf-cc1101"
|
|
||||||
- "nodemcuv2-somfy-cc1101"
|
|
||||||
- "manual-wifi-test"
|
|
||||||
- "nodemcuv2-mqtt-fw-test"
|
|
||||||
- "rf-wifi-gateway"
|
|
||||||
- "nodemcuv2-rf2"
|
|
||||||
- "nodemcuv2-rf2-cc1101"
|
|
||||||
- "nodemcuv2-pilight"
|
|
||||||
- "nodemcuv2-weatherstation"
|
|
||||||
- "sonoff-basic"
|
|
||||||
- "sonoff-basic-rfr3"
|
|
||||||
- "atmega-all-test"
|
|
||||||
- "uno-rf"
|
|
||||||
- "uno-fastled"
|
|
||||||
- "esp32dev-ble-datatest"
|
|
||||||
- "esp32s3-dev-c1-ble"
|
|
||||||
- "esp32c3-dev-m1-ble"
|
|
||||||
- "airm2m_core_esp32c3"
|
|
||||||
- "esp32c3_lolin_mini"
|
|
||||||
- "esp32c3-m5stamp"
|
|
||||||
- "thingpulse-espgateway"
|
|
||||||
- "theengs-bridge"
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
name: Build with PlatformIO
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- name: Set up Python
|
|
||||||
uses: actions/setup-python@v4
|
|
||||||
with:
|
|
||||||
python-version: "3.x"
|
|
||||||
- name: Install platformio
|
|
||||||
run: |
|
|
||||||
python -m pip install --upgrade pip
|
|
||||||
pip install platformio
|
|
||||||
- name: Extract ESP32 platform version from platformio.ini
|
|
||||||
run: |
|
|
||||||
ESP32_VERSION=$(grep 'esp32_platform\s*=' platformio.ini | cut -d'@' -f2 | tr -d '[:space:]')
|
|
||||||
echo "ESP32_PLATFORM_VERSION=${ESP32_VERSION}" >> $GITHUB_ENV
|
|
||||||
- name: Run PlatformIO
|
|
||||||
run: platformio run -e ${{ matrix.environments }}
|
|
||||||
- name: Upload Assets
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: ${{ matrix.environments }}
|
|
||||||
path: |
|
|
||||||
.pio/build/*/firmware.bin
|
|
||||||
.pio/build/*/partitions.bin
|
|
||||||
retention-days: 7
|
|
||||||
|
|
||||||
documentation:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
name: Create the documentation
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- name: Set up Node.js
|
|
||||||
uses: actions/setup-node@v3
|
|
||||||
with:
|
|
||||||
node-version: "14.x"
|
|
||||||
- name: Download Common Config
|
|
||||||
run: |
|
|
||||||
curl -o docs/.vuepress/public/commonConfig.js https://www.theengs.io/commonConfig.js
|
|
||||||
- name: Install build dependencies
|
|
||||||
run: npm install
|
|
||||||
- name: Build documentation
|
|
||||||
run: npm run docs:build
|
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
name: Build binaries, docs and publish to dev folder
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
schedule:
|
|
||||||
- cron: '0 0 * * *'
|
|
||||||
jobs:
|
|
||||||
build-upload:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: github.repository_owner == '1technophile'
|
|
||||||
name: Build and upload Assets to Release
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- uses: benjlevesque/short-sha@v2.1
|
|
||||||
id: short-sha
|
|
||||||
with:
|
|
||||||
length: 6
|
|
||||||
- name: Set up Python
|
|
||||||
uses: actions/setup-python@v4
|
|
||||||
with:
|
|
||||||
python-version: "3.7"
|
|
||||||
- name: Install dependencies
|
|
||||||
run: |
|
|
||||||
python -m pip install --upgrade pip
|
|
||||||
pip install platformio requests shutils
|
|
||||||
npm install
|
|
||||||
- name: Set sha tag
|
|
||||||
run: |
|
|
||||||
sed -i "s/version_tag/${{ steps.short-sha.outputs.sha }}/g" main/User_config.h scripts/latest_version_dev.json
|
|
||||||
sed -i "s/version_tag/DEVELOPMENT SHA:${{ steps.short-sha.outputs.sha }} TEST ONLY/g" docs/.vuepress/config.js
|
|
||||||
sed -i "s|base: '/'|base: '/dev/'|g" docs/.vuepress/config.js
|
|
||||||
- name: Extract ESP32 platform version from platformio.ini
|
|
||||||
run: |
|
|
||||||
ESP32_VERSION=$(grep 'esp32_platform\s*=' platformio.ini | cut -d'@' -f2 | tr -d '[:space:]')
|
|
||||||
echo "ESP32_PLATFORM_VERSION=${ESP32_VERSION}" >> $GITHUB_ENV
|
|
||||||
- name: Run PlatformIO
|
|
||||||
run: |
|
|
||||||
export PLATFORMIO_BUILD_FLAGS="'-DDEVELOPMENTOTA=true'"
|
|
||||||
platformio run
|
|
||||||
- name: Prepare Release Assets
|
|
||||||
run: |
|
|
||||||
sudo apt install rename
|
|
||||||
./scripts/prepare_deploy.sh
|
|
||||||
- name: Set up Node.js
|
|
||||||
uses: actions/setup-node@v3
|
|
||||||
with:
|
|
||||||
node-version: "14.x"
|
|
||||||
- name: Download Common Config
|
|
||||||
run: |
|
|
||||||
curl -o docs/.vuepress/public/commonConfig.js https://www.theengs.io/commonConfig.js
|
|
||||||
- name: Build documentation
|
|
||||||
run: |
|
|
||||||
python ./scripts/gen_wu.py --dev
|
|
||||||
npm run docs:build
|
|
||||||
- name: Deploy to GitHub Pages
|
|
||||||
uses: peaceiris/actions-gh-pages@v3
|
|
||||||
with:
|
|
||||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
publish_dir: ./docs/.vuepress/dist
|
|
||||||
destination_dir: dev
|
|
||||||
cname: docs.openmqttgateway.com
|
|
||||||
- name: Running Page Speed Insights
|
|
||||||
uses: jakepartusch/psi-action@v1.3
|
|
||||||
id: psi
|
|
||||||
with:
|
|
||||||
url: "https://docs.openmqttgateway.com/dev/"
|
|
||||||
threshold: 70
|
|
||||||
key: ${{ secrets.APIKEY }}
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
name: Check Code Format
|
|
||||||
|
|
||||||
on: [push, pull_request]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
lint:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- name: Check main format
|
|
||||||
uses: DoozyX/clang-format-lint-action@v0.6
|
|
||||||
with:
|
|
||||||
source: "./main"
|
|
||||||
extensions: "h,ino"
|
|
||||||
clangFormatVersion: 9
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
name: Create and publish documentation
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
workflow_call:
|
|
||||||
jobs:
|
|
||||||
documentation:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
name: Create the documentation and deploy it to GitHub Pages
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- name: Set up Node.js
|
|
||||||
uses: actions/setup-node@v3
|
|
||||||
with:
|
|
||||||
node-version: "14.x"
|
|
||||||
- name: Set up Python
|
|
||||||
uses: actions/setup-python@v4
|
|
||||||
with:
|
|
||||||
python-version: "3.7"
|
|
||||||
- name: Install build dependencies
|
|
||||||
run: |
|
|
||||||
python -m pip install --upgrade pip
|
|
||||||
pip install requests pandas markdown pytablereader tabulate
|
|
||||||
npm install
|
|
||||||
- name: Download Common Config
|
|
||||||
run: |
|
|
||||||
curl -o docs/.vuepress/public/commonConfig.js https://www.theengs.io/commonConfig.js
|
|
||||||
- name: get lastest release tag
|
|
||||||
id: last_release
|
|
||||||
uses: InsonusK/get-latest-release@v1.0.1
|
|
||||||
with:
|
|
||||||
myToken: ${{ github.token }}
|
|
||||||
view_top: 1
|
|
||||||
- name: Set version tag from git
|
|
||||||
run: sed -i "s/version_tag/${{steps.last_release.outputs.tag_name}}/g" docs/.vuepress/config.js scripts/latest_version.json
|
|
||||||
- name: Build documentation
|
|
||||||
run: |
|
|
||||||
python ./scripts/generate_board_docs.py
|
|
||||||
python ./scripts/gen_wu.py ${GITHUB_REPOSITORY}
|
|
||||||
npm run docs:build
|
|
||||||
- name: Deploy to GitHub Pages
|
|
||||||
uses: peaceiris/actions-gh-pages@v3
|
|
||||||
with:
|
|
||||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
publish_dir: ./docs/.vuepress/dist
|
|
||||||
cname: docs.openmqttgateway.com
|
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
name: Release
|
|
||||||
|
|
||||||
on:
|
|
||||||
release:
|
|
||||||
types: [published]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build-upload:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
name: Build and upload Assets to Release
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- name: Set up Python
|
|
||||||
uses: actions/setup-python@v4
|
|
||||||
with:
|
|
||||||
python-version: "3.7"
|
|
||||||
- name: Install platformio
|
|
||||||
run: |
|
|
||||||
python -m pip install --upgrade pip
|
|
||||||
pip install platformio
|
|
||||||
- name: Set version tag from git
|
|
||||||
run: sed -i "s/version_tag/${GITHUB_REF#refs/tags/}/g" main/User_config.h scripts/latest_version.json
|
|
||||||
- name: Extract ESP32 platform version from platformio.ini
|
|
||||||
run: |
|
|
||||||
ESP32_VERSION=$(grep 'esp32_platform\s*=' platformio.ini | cut -d'@' -f2 | tr -d '[:space:]')
|
|
||||||
echo "ESP32_PLATFORM_VERSION=${ESP32_VERSION}" >> $GITHUB_ENV
|
|
||||||
- name: Run PlatformIO
|
|
||||||
run: platformio run
|
|
||||||
- name: Prepare Release Assets
|
|
||||||
run: |
|
|
||||||
sudo apt install rename
|
|
||||||
./scripts/prepare_deploy.sh
|
|
||||||
- name: Get upload url
|
|
||||||
id: release-id
|
|
||||||
run: |
|
|
||||||
RELEASE_ID=$(jq --raw-output '.release.id' $GITHUB_EVENT_PATH)
|
|
||||||
echo "::set-output name=upload_url::https://uploads.github.com/repos/${GITHUB_REPOSITORY}/releases/${RELEASE_ID}/assets{?name,label}"
|
|
||||||
- name: Upload Release Assets
|
|
||||||
uses: bgpat/release-asset-action@03b0c30db1c4031ce3474740b0e4275cd7e126a3
|
|
||||||
with:
|
|
||||||
pattern: "toDeploy/*"
|
|
||||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
release-url: ${{ steps.release-id.outputs.upload_url }}
|
|
||||||
allow-overwrite: true
|
|
||||||
call-workflow-passing-data:
|
|
||||||
needs: build-upload
|
|
||||||
uses: ./.github/workflows/manual_docs.yml
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
name: Close inactive issues or PR
|
|
||||||
on:
|
|
||||||
schedule:
|
|
||||||
- cron: "30 0 * * *"
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
close-issues:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
permissions:
|
|
||||||
issues: write
|
|
||||||
pull-requests: write
|
|
||||||
steps:
|
|
||||||
- uses: actions/stale@v4.1.1
|
|
||||||
with:
|
|
||||||
days-before-issue-stale: 90
|
|
||||||
days-before-issue-close: 14
|
|
||||||
stale-issue-label: "stale"
|
|
||||||
stale-issue-message: "This issue is stale because it has been open for 90 days with no activity."
|
|
||||||
close-issue-message: "This issue was closed because it has been inactive for 14 days since being marked as stale."
|
|
||||||
days-before-pr-stale: 90
|
|
||||||
days-before-pr-close: 14
|
|
||||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
exempt-issue-labels: "enhancement"
|
|
||||||
@@ -7,3 +7,7 @@ node_modules
|
|||||||
main/certs/private*
|
main/certs/private*
|
||||||
lib/*
|
lib/*
|
||||||
!lib/esp32-bt-lib
|
!lib/esp32-bt-lib
|
||||||
|
CMakeLists.txt
|
||||||
|
dependencies.lock
|
||||||
|
sdkconfig.*
|
||||||
|
!sdkconfig.defaults
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 45 KiB After Width: | Height: | Size: 38 KiB |
@@ -141,8 +141,8 @@ The frequency key is optional, if not set the gateway will use the default frequ
|
|||||||
|
|
||||||
Send PROG command with remote 0:
|
Send PROG command with remote 0:
|
||||||
|
|
||||||
`mosquitto_pub -t home/OpenMQTTGateway_Somfy/commands/MQTTtoSomfy -m '{"remote":0,"command":"Prog","frequency":433.92}'`
|
`mosquitto_pub -t home/OpenMQTTGateway_Somfy/commands/MQTTtoSomfy -m '{"remote":0,"command":"Prog","frequency":433.42}'`
|
||||||
|
|
||||||
Send Up command with remote 1:
|
Send Up command with remote 1:
|
||||||
|
|
||||||
`mosquitto_pub -t home/OpenMQTTGateway_Somfy/commands/MQTTtoSomfy -m '{"remote":1,"command":"Up","frequency":433.92}'`
|
`mosquitto_pub -t home/OpenMQTTGateway_Somfy/commands/MQTTtoSomfy -m '{"remote":1,"command":"Up","frequency":433.42}'`
|
||||||
+23
-4
@@ -776,7 +776,7 @@ build_flags =
|
|||||||
'-DRF_MODULE_GDO0=12' ; CC1101 pin GDO0
|
'-DRF_MODULE_GDO0=12' ; CC1101 pin GDO0
|
||||||
'-DRF_MODULE_GDO2=27' ; CC1101 pin GDO2
|
'-DRF_MODULE_GDO2=27' ; CC1101 pin GDO2
|
||||||
; *** RadioLib Options ***
|
; *** RadioLib Options ***
|
||||||
; '-DRADIOLIB_DEBUG=true'
|
; '-DRADIOLIB_DEBUG=true'<
|
||||||
; '-DRADIOLIB_VERBOSE=true'
|
; '-DRADIOLIB_VERBOSE=true'
|
||||||
custom_description = Gateway using RTL_433_ESP library, need CC1101
|
custom_description = Gateway using RTL_433_ESP library, need CC1101
|
||||||
|
|
||||||
@@ -799,12 +799,12 @@ build_flags =
|
|||||||
'-DZgatewayRTL_433="rtl_433"'
|
'-DZgatewayRTL_433="rtl_433"'
|
||||||
'-DZradioSX127x="SX127x"'
|
'-DZradioSX127x="SX127x"'
|
||||||
; *** ssd1306 Display Options ***
|
; *** ssd1306 Display Options ***
|
||||||
'-DZdisplaySSD1306="HELTEC_SSD1306"'
|
; '-DZdisplaySSD1306="HELTEC_SSD1306"'
|
||||||
; '-DLOG_TO_OLED=false' ; Enable log to OLED
|
; '-DLOG_TO_OLED=false' ; Enable log to OLED
|
||||||
; '-DJSON_TO_OLED=true'
|
; '-DJSON_TO_OLED=true'
|
||||||
; '-DLOG_LEVEL_OLED=LOG_LEVEL_NOTICE'
|
; '-DLOG_LEVEL_OLED=LOG_LEVEL_NOTICE'
|
||||||
; '-DDISPLAY_IDLE_LOGO=false'
|
; '-DDISPLAY_IDLE_LOGO=true'
|
||||||
; '-DDISPLAY_BRIGHTNESS=80'
|
; '-DDISPLAY_BRIGHTNESS=20'
|
||||||
; '-DDISPLAY_METRIC=false'
|
; '-DDISPLAY_METRIC=false'
|
||||||
custom_description = Gateway using RTL_433_ESP and RadioLib
|
custom_description = Gateway using RTL_433_ESP and RadioLib
|
||||||
custom_hardware = ESP32 HELTEC LORA32 V2
|
custom_hardware = ESP32 HELTEC LORA32 V2
|
||||||
@@ -1810,3 +1810,22 @@ build_flags =
|
|||||||
; '-DsimplePublishing=true'
|
; '-DsimplePublishing=true'
|
||||||
custom_description = BLE Gateway using ethernet or wifi with external antenna
|
custom_description = BLE Gateway using ethernet or wifi with external antenna
|
||||||
custom_hardware = ThingPulse gateway single ESP32
|
custom_hardware = ThingPulse gateway single ESP32
|
||||||
|
|
||||||
|
[env:esp32dev-ble-idf]
|
||||||
|
platform = ${com.esp32_platform}
|
||||||
|
framework = arduino, espidf
|
||||||
|
board = esp32dev
|
||||||
|
extra_scripts = ${com-esp32.extra_scripts}
|
||||||
|
board_build.partitions = partitions/min_spiffs.csv
|
||||||
|
lib_deps =
|
||||||
|
${com-esp32.lib_deps}
|
||||||
|
${libraries.ble}
|
||||||
|
${libraries.decoder}
|
||||||
|
build_flags =
|
||||||
|
${com-esp32.build_flags}
|
||||||
|
'-DZgatewayBT="BT"'
|
||||||
|
'-DLED_SEND_RECEIVE=2'
|
||||||
|
'-DLED_SEND_RECEIVE_ON=0'
|
||||||
|
'-DGateway_Name="OMG_ESP32_BLE"'
|
||||||
|
'-DUSE_BLUFI=1'
|
||||||
|
custom_description = Regular BLE gateway with adaptive scanning activated, automatically adapts the scan parameters depending on your devices
|
||||||
+1
-1
@@ -674,7 +674,7 @@ Adafruit_NeoPixel leds2(ANEOPIX_IND_NUM_LEDS, ANEOPIX_IND_DATA_GPIO2, ANEOPIX_IN
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(ESP32)
|
#if defined(ESP32)
|
||||||
# define JSON_MSG_BUFFER 768
|
# define JSON_MSG_BUFFER 816 // adjusted to minimum size covering largest Theengs device JSON properties (RuuviTag_RAWv2)
|
||||||
# define SIGNAL_SIZE_UL_ULL uint64_t
|
# define SIGNAL_SIZE_UL_ULL uint64_t
|
||||||
# define STRTO_UL_ULL strtoull
|
# define STRTO_UL_ULL strtoull
|
||||||
#elif defined(ESP8266)
|
#elif defined(ESP8266)
|
||||||
|
|||||||
+265
@@ -0,0 +1,265 @@
|
|||||||
|
/*
|
||||||
|
OpenMQTTGateway - ESP8266 or Arduino program for home automation
|
||||||
|
|
||||||
|
Act as a wifi or ethernet gateway between your 433mhz/infrared IR signal and a MQTT broker
|
||||||
|
Send and receiving command by MQTT
|
||||||
|
|
||||||
|
This program enables to:
|
||||||
|
- receive MQTT data from a topic and send signal (RF, IR, BLE, GSM) corresponding to the received MQTT data
|
||||||
|
- publish MQTT data to a different topic related to received signals (RF, IR, BLE, GSM)
|
||||||
|
|
||||||
|
Copyright: (c)Florian ROBERT
|
||||||
|
|
||||||
|
This file is part of OpenMQTTGateway.
|
||||||
|
|
||||||
|
OpenMQTTGateway is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
OpenMQTTGateway is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#if defined(ESP32) && defined(USE_BLUFI)
|
||||||
|
|
||||||
|
# include "esp_blufi_api.h"
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
# include "esp_blufi.h"
|
||||||
|
}
|
||||||
|
|
||||||
|
/* store the station info for send back to phone */
|
||||||
|
//static bool gl_sta_connected = false;
|
||||||
|
bool omg_blufi_ble_connected = false;
|
||||||
|
static uint8_t gl_sta_bssid[6];
|
||||||
|
static uint8_t gl_sta_ssid[32];
|
||||||
|
static uint8_t gl_sta_passwd[64];
|
||||||
|
static int gl_sta_ssid_len;
|
||||||
|
static bool gl_sta_is_connecting = false;
|
||||||
|
static esp_blufi_extra_info_t gl_sta_conn_info;
|
||||||
|
|
||||||
|
static void example_event_callback(esp_blufi_cb_event_t event, esp_blufi_cb_param_t* param);
|
||||||
|
void wifi_event_handler(arduino_event_id_t event);
|
||||||
|
esp_err_t blufi_security_init(void);
|
||||||
|
void blufi_dh_negotiate_data_handler(uint8_t* data, int len, uint8_t** output_data, int* output_len, bool* need_free);
|
||||||
|
int blufi_aes_encrypt(uint8_t iv8, uint8_t* crypt_data, int crypt_len);
|
||||||
|
int blufi_aes_decrypt(uint8_t iv8, uint8_t* crypt_data, int crypt_len);
|
||||||
|
uint16_t blufi_crc_checksum(uint8_t iv8, uint8_t* data, int len);
|
||||||
|
void blufi_security_deinit(void);
|
||||||
|
|
||||||
|
static void example_event_callback(esp_blufi_cb_event_t event, esp_blufi_cb_param_t* param) {
|
||||||
|
/* actually, should post to blufi_task handle the procedure,
|
||||||
|
* now, as a example, we do it more simply */
|
||||||
|
switch (event) {
|
||||||
|
case ESP_BLUFI_EVENT_INIT_FINISH:
|
||||||
|
Log.notice(F("BLUFI init finish" CR));
|
||||||
|
esp_blufi_adv_start();
|
||||||
|
break;
|
||||||
|
case ESP_BLUFI_EVENT_DEINIT_FINISH:
|
||||||
|
Log.notice(F("BLUFI deinit finish" CR));
|
||||||
|
NimBLEDevice::deinit(true);
|
||||||
|
break;
|
||||||
|
case ESP_BLUFI_EVENT_BLE_CONNECT:
|
||||||
|
omg_blufi_ble_connected = true;
|
||||||
|
esp_blufi_adv_stop();
|
||||||
|
blufi_security_init();
|
||||||
|
break;
|
||||||
|
case ESP_BLUFI_EVENT_BLE_DISCONNECT:
|
||||||
|
omg_blufi_ble_connected = false;
|
||||||
|
blufi_security_deinit();
|
||||||
|
if (WiFi.isConnected()) {
|
||||||
|
esp_blufi_deinit();
|
||||||
|
} else {
|
||||||
|
esp_blufi_adv_start();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ESP_BLUFI_EVENT_REQ_CONNECT_TO_AP:
|
||||||
|
Log.notice(F("BLUFI requset wifi connect to AP" CR));
|
||||||
|
WiFi.begin((char*)gl_sta_ssid, (char*)gl_sta_passwd);
|
||||||
|
gl_sta_is_connecting = true;
|
||||||
|
break;
|
||||||
|
case ESP_BLUFI_EVENT_REQ_DISCONNECT_FROM_AP:
|
||||||
|
Log.notice(F("BLUFI requset wifi disconnect from AP\n" CR));
|
||||||
|
WiFi.disconnect();
|
||||||
|
break;
|
||||||
|
case ESP_BLUFI_EVENT_REPORT_ERROR:
|
||||||
|
Log.notice(F("BLUFI report error, error code %d\n" CR), param->report_error.state);
|
||||||
|
esp_blufi_send_error_info(param->report_error.state);
|
||||||
|
break;
|
||||||
|
case ESP_BLUFI_EVENT_GET_WIFI_STATUS: {
|
||||||
|
esp_blufi_extra_info_t info;
|
||||||
|
if (WiFi.isConnected()) {
|
||||||
|
memset(&info, 0, sizeof(esp_blufi_extra_info_t));
|
||||||
|
memcpy(info.sta_bssid, gl_sta_bssid, 6);
|
||||||
|
info.sta_bssid_set = true;
|
||||||
|
info.sta_ssid = gl_sta_ssid;
|
||||||
|
info.sta_ssid_len = gl_sta_ssid_len;
|
||||||
|
esp_blufi_send_wifi_conn_report(WIFI_MODE_STA, ESP_BLUFI_STA_CONN_SUCCESS, 0, &info);
|
||||||
|
} else if (gl_sta_is_connecting) {
|
||||||
|
esp_blufi_send_wifi_conn_report(WIFI_MODE_STA, ESP_BLUFI_STA_CONNECTING, 0, &gl_sta_conn_info);
|
||||||
|
} else {
|
||||||
|
esp_blufi_send_wifi_conn_report(WIFI_MODE_STA, ESP_BLUFI_STA_CONN_FAIL, 0, &gl_sta_conn_info);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ESP_BLUFI_EVENT_RECV_SLAVE_DISCONNECT_BLE:
|
||||||
|
esp_blufi_disconnect();
|
||||||
|
break;
|
||||||
|
case ESP_BLUFI_EVENT_RECV_STA_SSID:
|
||||||
|
strncpy((char*)gl_sta_ssid, (char*)param->sta_ssid.ssid, param->sta_ssid.ssid_len);
|
||||||
|
gl_sta_ssid[param->sta_ssid.ssid_len] = '\0';
|
||||||
|
Log.notice(F("Recv STA SSID %s" CR), gl_sta_ssid);
|
||||||
|
break;
|
||||||
|
case ESP_BLUFI_EVENT_RECV_STA_PASSWD:
|
||||||
|
strncpy((char*)gl_sta_passwd, (char*)param->sta_passwd.passwd, param->sta_passwd.passwd_len);
|
||||||
|
gl_sta_passwd[param->sta_passwd.passwd_len] = '\0';
|
||||||
|
Log.notice(F("Recv STA PASSWORD %s" CR), gl_sta_passwd);
|
||||||
|
break;
|
||||||
|
case ESP_BLUFI_EVENT_GET_WIFI_LIST: {
|
||||||
|
WiFi.scanNetworks(true);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ESP_BLUFI_EVENT_RECV_CUSTOM_DATA: {
|
||||||
|
Log.notice(F("Recv Custom Data %" PRIu32 CR), param->custom_data.data_len);
|
||||||
|
esp_log_buffer_hex("Custom Data", param->custom_data.data, param->custom_data.data_len);
|
||||||
|
|
||||||
|
DynamicJsonDocument json(1024);
|
||||||
|
auto error = deserializeJson(json, param->custom_data.data);
|
||||||
|
if (error) {
|
||||||
|
Log.error(F("deserialize config failed: %s, buffer capacity: %u" CR), error.c_str(), json.capacity());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!json.isNull()) {
|
||||||
|
Log.trace(F("\nparsed json, size: %u" CR), json.memoryUsage());
|
||||||
|
if (json.containsKey("mqtt_server"))
|
||||||
|
strcpy(mqtt_server, json["mqtt_server"]);
|
||||||
|
if (json.containsKey("mqtt_port"))
|
||||||
|
strcpy(mqtt_port, json["mqtt_port"]);
|
||||||
|
if (json.containsKey("mqtt_user"))
|
||||||
|
strcpy(mqtt_user, json["mqtt_user"]);
|
||||||
|
if (json.containsKey("mqtt_pass"))
|
||||||
|
strcpy(mqtt_pass, json["mqtt_pass"]);
|
||||||
|
if (json.containsKey("mqtt_topic"))
|
||||||
|
strcpy(mqtt_topic, json["mqtt_topic"]);
|
||||||
|
if (json.containsKey("mqtt_broker_secure"))
|
||||||
|
mqtt_secure = json["mqtt_broker_secure"].as<bool>();
|
||||||
|
if (json.containsKey("gateway_name"))
|
||||||
|
strcpy(gateway_name, json["gateway_name"]);
|
||||||
|
saveConfig();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ESP_BLUFI_EVENT_RECV_USERNAME:
|
||||||
|
break;
|
||||||
|
case ESP_BLUFI_EVENT_RECV_CA_CERT:
|
||||||
|
break;
|
||||||
|
case ESP_BLUFI_EVENT_RECV_CLIENT_CERT:
|
||||||
|
break;
|
||||||
|
case ESP_BLUFI_EVENT_RECV_SERVER_CERT:
|
||||||
|
break;
|
||||||
|
case ESP_BLUFI_EVENT_RECV_CLIENT_PRIV_KEY:
|
||||||
|
break;
|
||||||
|
;
|
||||||
|
case ESP_BLUFI_EVENT_RECV_SERVER_PRIV_KEY:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void wifi_event_handler(arduino_event_id_t event) {
|
||||||
|
switch (event) {
|
||||||
|
case ARDUINO_EVENT_WIFI_STA_GOT_IP6:
|
||||||
|
case ARDUINO_EVENT_WIFI_STA_GOT_IP: {
|
||||||
|
gl_sta_is_connecting = false;
|
||||||
|
esp_blufi_extra_info_t info;
|
||||||
|
memset(&info, 0, sizeof(esp_blufi_extra_info_t));
|
||||||
|
memcpy(info.sta_bssid, gl_sta_bssid, 6);
|
||||||
|
info.sta_bssid_set = true;
|
||||||
|
info.sta_ssid = gl_sta_ssid;
|
||||||
|
info.sta_ssid_len = gl_sta_ssid_len;
|
||||||
|
if (omg_blufi_ble_connected == true) {
|
||||||
|
esp_blufi_send_wifi_conn_report(WIFI_MODE_STA, ESP_BLUFI_STA_CONN_SUCCESS, 0, &info);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ARDUINO_EVENT_WIFI_SCAN_DONE: {
|
||||||
|
uint16_t apCount = WiFi.scanComplete();
|
||||||
|
if (apCount == 0) {
|
||||||
|
Log.notice(F("No AP found" CR));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
wifi_ap_record_t* ap_list = (wifi_ap_record_t*)malloc(sizeof(wifi_ap_record_t) * apCount);
|
||||||
|
if (!ap_list) {
|
||||||
|
Log.error(F("malloc error, ap_list is NULL"));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
ESP_ERROR_CHECK(esp_wifi_scan_get_ap_records(&apCount, ap_list));
|
||||||
|
esp_blufi_ap_record_t* blufi_ap_list = (esp_blufi_ap_record_t*)malloc(apCount * sizeof(esp_blufi_ap_record_t));
|
||||||
|
if (!blufi_ap_list) {
|
||||||
|
if (ap_list) {
|
||||||
|
free(ap_list);
|
||||||
|
}
|
||||||
|
Log.error(F("malloc error, blufi_ap_list is NULL" CR));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
for (int i = 0; i < apCount; ++i) {
|
||||||
|
blufi_ap_list[i].rssi = ap_list[i].rssi;
|
||||||
|
memcpy(blufi_ap_list[i].ssid, ap_list[i].ssid, sizeof(ap_list[i].ssid));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (omg_blufi_ble_connected == true) {
|
||||||
|
esp_blufi_send_wifi_list(apCount, blufi_ap_list);
|
||||||
|
}
|
||||||
|
|
||||||
|
free(ap_list);
|
||||||
|
free(blufi_ap_list);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
static esp_blufi_callbacks_t example_callbacks = {
|
||||||
|
.event_cb = example_event_callback,
|
||||||
|
.negotiate_data_handler = blufi_dh_negotiate_data_handler,
|
||||||
|
.encrypt_func = blufi_aes_encrypt,
|
||||||
|
.decrypt_func = blufi_aes_decrypt,
|
||||||
|
.checksum_func = blufi_crc_checksum,
|
||||||
|
};
|
||||||
|
|
||||||
|
bool startBlufi() {
|
||||||
|
esp_err_t ret = ESP_OK;
|
||||||
|
WiFi.onEvent(wifi_event_handler);
|
||||||
|
|
||||||
|
ret = esp_blufi_register_callbacks(&example_callbacks);
|
||||||
|
if (ret) {
|
||||||
|
Log.error(F("%s blufi register failed, error code = %x" CR), __func__, ret);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (NimBLEDevice::getInitialized()) {
|
||||||
|
NimBLEDevice::deinit(true);
|
||||||
|
delay(50);
|
||||||
|
}
|
||||||
|
esp_blufi_btc_init();
|
||||||
|
uint8_t mac[6];
|
||||||
|
esp_read_mac(mac, ESP_MAC_WIFI_STA);
|
||||||
|
char advName[20] = {0};
|
||||||
|
snprintf(advName, sizeof(advName), "OMGBFI_%02X%02X%02X%02X%02X%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
|
||||||
|
NimBLEDevice::init(advName);
|
||||||
|
esp_blufi_gatt_svr_init();
|
||||||
|
ble_gatts_start();
|
||||||
|
return esp_blufi_profile_init() == ESP_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // defined(ESP32) && defined(USE_BLUFI)
|
||||||
@@ -0,0 +1,197 @@
|
|||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Unlicense OR CC0-1.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined(ESP32) && defined(USE_BLUFI)
|
||||||
|
|
||||||
|
# include "esp_blufi_api.h"
|
||||||
|
# include "esp_crc.h"
|
||||||
|
# include "mbedtls/aes.h"
|
||||||
|
# include "mbedtls/dhm.h"
|
||||||
|
# include "mbedtls/md5.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
The SEC_TYPE_xxx is for self-defined packet data type in the procedure of "BLUFI negotiate key"
|
||||||
|
If user use other negotiation procedure to exchange(or generate) key, should redefine the type by yourself.
|
||||||
|
*/
|
||||||
|
# define SEC_TYPE_DH_PARAM_LEN 0x00
|
||||||
|
# define SEC_TYPE_DH_PARAM_DATA 0x01
|
||||||
|
# define SEC_TYPE_DH_P 0x02
|
||||||
|
# define SEC_TYPE_DH_G 0x03
|
||||||
|
# define SEC_TYPE_DH_PUBLIC 0x04
|
||||||
|
|
||||||
|
struct blufi_security {
|
||||||
|
# define DH_SELF_PUB_KEY_LEN 128
|
||||||
|
# define DH_SELF_PUB_KEY_BIT_LEN (DH_SELF_PUB_KEY_LEN * 8)
|
||||||
|
uint8_t self_public_key[DH_SELF_PUB_KEY_LEN];
|
||||||
|
# define SHARE_KEY_LEN 128
|
||||||
|
# define SHARE_KEY_BIT_LEN (SHARE_KEY_LEN * 8)
|
||||||
|
uint8_t share_key[SHARE_KEY_LEN];
|
||||||
|
size_t share_len;
|
||||||
|
# define PSK_LEN 16
|
||||||
|
uint8_t psk[PSK_LEN];
|
||||||
|
uint8_t* dh_param;
|
||||||
|
int dh_param_len;
|
||||||
|
uint8_t iv[16];
|
||||||
|
mbedtls_dhm_context dhm;
|
||||||
|
mbedtls_aes_context aes;
|
||||||
|
};
|
||||||
|
static struct blufi_security* blufi_sec;
|
||||||
|
|
||||||
|
static int myrand(void* rng_state, unsigned char* output, size_t len) {
|
||||||
|
esp_fill_random(output, len);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" void btc_blufi_report_error(esp_blufi_error_state_t state);
|
||||||
|
|
||||||
|
void blufi_dh_negotiate_data_handler(uint8_t* data, int len, uint8_t** output_data, int* output_len, bool* need_free) {
|
||||||
|
int ret;
|
||||||
|
uint8_t type = data[0];
|
||||||
|
|
||||||
|
if (blufi_sec == NULL) {
|
||||||
|
Log.error(F("BLUFI Security is not initialized" CR));
|
||||||
|
btc_blufi_report_error(ESP_BLUFI_INIT_SECURITY_ERROR);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case SEC_TYPE_DH_PARAM_LEN:
|
||||||
|
blufi_sec->dh_param_len = ((data[1] << 8) | data[2]);
|
||||||
|
if (blufi_sec->dh_param) {
|
||||||
|
free(blufi_sec->dh_param);
|
||||||
|
blufi_sec->dh_param = NULL;
|
||||||
|
}
|
||||||
|
blufi_sec->dh_param = (uint8_t*)malloc(blufi_sec->dh_param_len);
|
||||||
|
if (blufi_sec->dh_param == NULL) {
|
||||||
|
btc_blufi_report_error(ESP_BLUFI_DH_MALLOC_ERROR);
|
||||||
|
Log.error(F("%s, malloc failed\n" CR), __func__);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SEC_TYPE_DH_PARAM_DATA: {
|
||||||
|
if (blufi_sec->dh_param == NULL) {
|
||||||
|
Log.error(F("%s, blufi_sec->dh_param == NULL" CR), __func__);
|
||||||
|
btc_blufi_report_error(ESP_BLUFI_DH_PARAM_ERROR);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
uint8_t* param = blufi_sec->dh_param;
|
||||||
|
memcpy(blufi_sec->dh_param, &data[1], blufi_sec->dh_param_len);
|
||||||
|
ret = mbedtls_dhm_read_params(&blufi_sec->dhm, ¶m, ¶m[blufi_sec->dh_param_len]);
|
||||||
|
if (ret) {
|
||||||
|
Log.error(F("%s read param failed %d" CR), __func__, ret);
|
||||||
|
btc_blufi_report_error(ESP_BLUFI_READ_PARAM_ERROR);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
free(blufi_sec->dh_param);
|
||||||
|
blufi_sec->dh_param = NULL;
|
||||||
|
|
||||||
|
ret = mbedtls_dhm_make_public(&blufi_sec->dhm, (int)mbedtls_mpi_size(&blufi_sec->dhm.P), blufi_sec->self_public_key, blufi_sec->dhm.len, myrand, NULL);
|
||||||
|
if (ret) {
|
||||||
|
Log.error(F("%s make public failed %d" CR), __func__, ret);
|
||||||
|
btc_blufi_report_error(ESP_BLUFI_MAKE_PUBLIC_ERROR);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = mbedtls_dhm_calc_secret(&blufi_sec->dhm,
|
||||||
|
blufi_sec->share_key,
|
||||||
|
SHARE_KEY_BIT_LEN,
|
||||||
|
&blufi_sec->share_len,
|
||||||
|
myrand, NULL);
|
||||||
|
if (ret) {
|
||||||
|
Log.error(F("%s mbedtls_dhm_calc_secret failed %d" CR), __func__, ret);
|
||||||
|
btc_blufi_report_error(ESP_BLUFI_DH_PARAM_ERROR);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
mbedtls_md5(blufi_sec->share_key, blufi_sec->share_len, blufi_sec->psk);
|
||||||
|
|
||||||
|
mbedtls_aes_setkey_enc(&blufi_sec->aes, blufi_sec->psk, 128);
|
||||||
|
|
||||||
|
/* alloc output data */
|
||||||
|
*output_data = &blufi_sec->self_public_key[0];
|
||||||
|
*output_len = blufi_sec->dhm.len;
|
||||||
|
*need_free = false;
|
||||||
|
|
||||||
|
} break;
|
||||||
|
case SEC_TYPE_DH_P:
|
||||||
|
break;
|
||||||
|
case SEC_TYPE_DH_G:
|
||||||
|
break;
|
||||||
|
case SEC_TYPE_DH_PUBLIC:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int blufi_aes_encrypt(uint8_t iv8, uint8_t* crypt_data, int crypt_len) {
|
||||||
|
int ret;
|
||||||
|
size_t iv_offset = 0;
|
||||||
|
uint8_t iv0[16];
|
||||||
|
|
||||||
|
memcpy(iv0, blufi_sec->iv, sizeof(blufi_sec->iv));
|
||||||
|
iv0[0] = iv8; /* set iv8 as the iv0[0] */
|
||||||
|
|
||||||
|
ret = mbedtls_aes_crypt_cfb128(&blufi_sec->aes, MBEDTLS_AES_ENCRYPT, crypt_len, &iv_offset, iv0, crypt_data, crypt_data);
|
||||||
|
if (ret) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return crypt_len;
|
||||||
|
}
|
||||||
|
|
||||||
|
int blufi_aes_decrypt(uint8_t iv8, uint8_t* crypt_data, int crypt_len) {
|
||||||
|
int ret;
|
||||||
|
size_t iv_offset = 0;
|
||||||
|
uint8_t iv0[16];
|
||||||
|
|
||||||
|
memcpy(iv0, blufi_sec->iv, sizeof(blufi_sec->iv));
|
||||||
|
iv0[0] = iv8; /* set iv8 as the iv0[0] */
|
||||||
|
|
||||||
|
ret = mbedtls_aes_crypt_cfb128(&blufi_sec->aes, MBEDTLS_AES_DECRYPT, crypt_len, &iv_offset, iv0, crypt_data, crypt_data);
|
||||||
|
if (ret) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return crypt_len;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t blufi_crc_checksum(uint8_t iv8, uint8_t* data, int len) {
|
||||||
|
/* This iv8 ignore, not used */
|
||||||
|
return esp_crc16_be(0, data, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
esp_err_t blufi_security_init(void) {
|
||||||
|
blufi_sec = (struct blufi_security*)malloc(sizeof(struct blufi_security));
|
||||||
|
if (blufi_sec == NULL) {
|
||||||
|
return ESP_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(blufi_sec, 0x0, sizeof(struct blufi_security));
|
||||||
|
|
||||||
|
mbedtls_dhm_init(&blufi_sec->dhm);
|
||||||
|
mbedtls_aes_init(&blufi_sec->aes);
|
||||||
|
|
||||||
|
memset(blufi_sec->iv, 0x0, 16);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void blufi_security_deinit(void) {
|
||||||
|
if (blufi_sec == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (blufi_sec->dh_param) {
|
||||||
|
free(blufi_sec->dh_param);
|
||||||
|
blufi_sec->dh_param = NULL;
|
||||||
|
}
|
||||||
|
mbedtls_dhm_free(&blufi_sec->dhm);
|
||||||
|
mbedtls_aes_free(&blufi_sec->aes);
|
||||||
|
|
||||||
|
memset(blufi_sec, 0x0, sizeof(struct blufi_security));
|
||||||
|
|
||||||
|
free(blufi_sec);
|
||||||
|
blufi_sec = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // defined(ESP32) && defined(USE_BLUFI)
|
||||||
+16
-2
@@ -43,7 +43,6 @@ QueueHandle_t BLEQueue;
|
|||||||
# include <decoder.h>
|
# include <decoder.h>
|
||||||
# include <driver/adc.h>
|
# include <driver/adc.h>
|
||||||
# include <esp_bt.h>
|
# include <esp_bt.h>
|
||||||
# include <esp_bt_main.h>
|
|
||||||
# include <esp_wifi.h>
|
# include <esp_wifi.h>
|
||||||
|
|
||||||
# include <atomic>
|
# include <atomic>
|
||||||
@@ -892,7 +891,11 @@ void setupBTTasksAndBLE() {
|
|||||||
xTaskCreatePinnedToCore(
|
xTaskCreatePinnedToCore(
|
||||||
procBLETask, /* Function to implement the task */
|
procBLETask, /* Function to implement the task */
|
||||||
"procBLETask", /* Name of the task */
|
"procBLETask", /* Name of the task */
|
||||||
|
# ifdef USE_BLUFI
|
||||||
|
13000,
|
||||||
|
# else
|
||||||
8500, /* Stack size in bytes */
|
8500, /* Stack size in bytes */
|
||||||
|
# endif
|
||||||
NULL, /* Task input parameter */
|
NULL, /* Task input parameter */
|
||||||
2, /* Priority of the task (set higher than core task) */
|
2, /* Priority of the task (set higher than core task) */
|
||||||
&xProcBLETaskHandle, /* Task handle. */
|
&xProcBLETaskHandle, /* Task handle. */
|
||||||
@@ -1020,7 +1023,18 @@ void launchBTDiscovery(bool overrideDiscovery) {
|
|||||||
}
|
}
|
||||||
if (!properties.empty()) {
|
if (!properties.empty()) {
|
||||||
StaticJsonDocument<JSON_MSG_BUFFER> jsonBuffer;
|
StaticJsonDocument<JSON_MSG_BUFFER> jsonBuffer;
|
||||||
deserializeJson(jsonBuffer, properties);
|
auto error = deserializeJson(jsonBuffer, properties);
|
||||||
|
if (error) {
|
||||||
|
if (jsonBuffer.overflowed()) {
|
||||||
|
// This should not happen if JSON_MSG_BUFFER is large enough for
|
||||||
|
// the Theengs json properties
|
||||||
|
Log.error(F("JSON deserialization of Theengs properties overflowed (error %s), buffer capacity: %u. Program might crash. Properties json: %s" CR),
|
||||||
|
error.c_str(), jsonBuffer.capacity(), properties.c_str());
|
||||||
|
} else {
|
||||||
|
Log.error(F("JSON deserialization of Theengs properties errored: %" CR),
|
||||||
|
error.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
for (JsonPair prop : jsonBuffer["properties"].as<JsonObject>()) {
|
for (JsonPair prop : jsonBuffer["properties"].as<JsonObject>()) {
|
||||||
Log.trace(F("Key: %s"), prop.key().c_str());
|
Log.trace(F("Key: %s"), prop.key().c_str());
|
||||||
Log.trace(F("Unit: %s"), prop.value()["unit"].as<const char*>());
|
Log.trace(F("Unit: %s"), prop.value()["unit"].as<const char*>());
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ void MeasureGPIOInput() {
|
|||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
Log.notice(F("Erasing ESP Config, restarting" CR));
|
Log.notice(F("Erasing ESP Config, restarting" CR));
|
||||||
setup_wifimanager(true);
|
setupwifi(true);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
resetTime = 0;
|
resetTime = 0;
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ void MeasureHCSR501() {
|
|||||||
# ifdef HCSR501_LED_NOTIFY_GPIO
|
# ifdef HCSR501_LED_NOTIFY_GPIO
|
||||||
digitalWrite(HCSR501_LED_NOTIFY_GPIO, pirState == HCSR501_LED_ON);
|
digitalWrite(HCSR501_LED_NOTIFY_GPIO, pirState == HCSR501_LED_ON);
|
||||||
# endif
|
# endif
|
||||||
if (HCSR501data.size() > 1) {
|
if (HCSR501data.size() > 0) {
|
||||||
HCSR501data["origin"] = subjectHCSR501toMQTT;
|
HCSR501data["origin"] = subjectHCSR501toMQTT;
|
||||||
handleJsonEnqueue(HCSR501data);
|
handleJsonEnqueue(HCSR501data);
|
||||||
}
|
}
|
||||||
|
|||||||
+20
-6
@@ -1133,14 +1133,14 @@ void setup() {
|
|||||||
# ifdef ESP32_ETHERNET
|
# ifdef ESP32_ETHERNET
|
||||||
setup_ethernet_esp32();
|
setup_ethernet_esp32();
|
||||||
# endif
|
# endif
|
||||||
if (!failSafeMode && !ethConnected) setup_wifimanager(false);
|
if (!failSafeMode && !ethConnected) setupwifi(false);
|
||||||
} else {
|
} else {
|
||||||
# ifdef ESP32_ETHERNET
|
# ifdef ESP32_ETHERNET
|
||||||
setup_ethernet_esp32();
|
setup_ethernet_esp32();
|
||||||
# endif
|
# endif
|
||||||
Log.notice(F("No config in flash, launching wifi manager" CR));
|
Log.notice(F("No config in flash, launching wifi manager" CR));
|
||||||
// In failSafeMode we don't want to setup wifi manager as it has already been done before
|
// In failSafeMode we don't want to setup wifi manager as it has already been done before
|
||||||
if (!failSafeMode) setup_wifimanager(false);
|
if (!failSafeMode) setupwifi(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
# endif
|
# endif
|
||||||
@@ -1362,6 +1362,13 @@ void setup() {
|
|||||||
#if defined(ESP8266) || defined(ESP32)
|
#if defined(ESP8266) || defined(ESP32)
|
||||||
// Bypass for ESP not reconnecting automaticaly the second time https://github.com/espressif/arduino-esp32/issues/2501
|
// Bypass for ESP not reconnecting automaticaly the second time https://github.com/espressif/arduino-esp32/issues/2501
|
||||||
bool wifi_reconnect_bypass() {
|
bool wifi_reconnect_bypass() {
|
||||||
|
# if defined(ESP32) && defined(USE_BLUFI)
|
||||||
|
extern bool omg_blufi_ble_connected;
|
||||||
|
if (omg_blufi_ble_connected) {
|
||||||
|
Log.notice(F("BLUFI is connected, bypassing wifi reconnect" CR));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
# endif
|
||||||
uint8_t wifi_autoreconnect_cnt = 0;
|
uint8_t wifi_autoreconnect_cnt = 0;
|
||||||
# ifdef ESP32
|
# ifdef ESP32
|
||||||
while (WiFi.status() != WL_CONNECTED && wifi_autoreconnect_cnt < maxConnectionRetryNetwork) {
|
while (WiFi.status() != WL_CONNECTED && wifi_autoreconnect_cnt < maxConnectionRetryNetwork) {
|
||||||
@@ -1628,7 +1635,7 @@ void blockingWaitForReset() {
|
|||||||
Log.trace(F("mounted file system" CR));
|
Log.trace(F("mounted file system" CR));
|
||||||
if (SPIFFS.exists("/config.json")) {
|
if (SPIFFS.exists("/config.json")) {
|
||||||
Log.notice(F("Erasing ESP Config, restarting" CR));
|
Log.notice(F("Erasing ESP Config, restarting" CR));
|
||||||
setup_wifimanager(true);
|
setupwifi(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
delay(30000);
|
delay(30000);
|
||||||
@@ -1636,7 +1643,7 @@ void blockingWaitForReset() {
|
|||||||
Log.notice(F("Going into failsafe mode without peripherals" CR));
|
Log.notice(F("Going into failsafe mode without peripherals" CR));
|
||||||
// Failsafe mode enable to connect to Wifi or change the firmware without the peripherals setup
|
// Failsafe mode enable to connect to Wifi or change the firmware without the peripherals setup
|
||||||
failSafeMode = true;
|
failSafeMode = true;
|
||||||
setup_wifimanager(false);
|
setupwifi(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1766,13 +1773,20 @@ bool loadConfigFromFlash() {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setup_wifimanager(bool reset_settings) {
|
void setupwifi(bool reset_settings) {
|
||||||
delay(10);
|
delay(10);
|
||||||
WiFi.mode(WIFI_STA);
|
WiFi.mode(WIFI_STA);
|
||||||
|
|
||||||
if (reset_settings)
|
if (reset_settings)
|
||||||
eraseAndRestart();
|
eraseAndRestart();
|
||||||
|
|
||||||
|
# if defined(ESP32) && defined(USE_BLUFI)
|
||||||
|
if (!wifi_reconnect_bypass()) {
|
||||||
|
startBlufi();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
|
||||||
# ifdef USE_MAC_AS_GATEWAY_NAME
|
# ifdef USE_MAC_AS_GATEWAY_NAME
|
||||||
String s = WiFi.macAddress();
|
String s = WiFi.macAddress();
|
||||||
snprintf(WifiManager_ssid, MAC_NAME_MAX_LEN, "%s_%.2s%.2s", Gateway_Short_Name, s.c_str(), s.c_str() + 3);
|
snprintf(WifiManager_ssid, MAC_NAME_MAX_LEN, "%s_%.2s%.2s", Gateway_Short_Name, s.c_str(), s.c_str() + 3);
|
||||||
@@ -2881,7 +2895,7 @@ void MQTTtoSYS(char* topicOri, JsonObject& SYSdata) { // json object decoding
|
|||||||
ESPRestart(5);
|
ESPRestart(5);
|
||||||
} else if (strstr(cmd, eraseCmd) != NULL) { //erase and restart
|
} else if (strstr(cmd, eraseCmd) != NULL) { //erase and restart
|
||||||
# ifndef ESPWifiManualSetup
|
# ifndef ESPWifiManualSetup
|
||||||
setup_wifimanager(true);
|
setupwifi(true);
|
||||||
# endif
|
# endif
|
||||||
} else if (strstr(cmd, statusCmd) != NULL) { //erase and restart
|
} else if (strstr(cmd, statusCmd) != NULL) { //erase and restart
|
||||||
stateMeasures();
|
stateMeasures();
|
||||||
|
|||||||
Generated
+12
-12
@@ -7144,9 +7144,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/follow-redirects": {
|
"node_modules/follow-redirects": {
|
||||||
"version": "1.15.4",
|
"version": "1.15.6",
|
||||||
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz",
|
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
|
||||||
"integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==",
|
"integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -8413,9 +8413,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/ip": {
|
"node_modules/ip": {
|
||||||
"version": "1.1.8",
|
"version": "1.1.9",
|
||||||
"resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz",
|
"resolved": "https://registry.npmjs.org/ip/-/ip-1.1.9.tgz",
|
||||||
"integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==",
|
"integrity": "sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/ip-regex": {
|
"node_modules/ip-regex": {
|
||||||
@@ -21003,9 +21003,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"follow-redirects": {
|
"follow-redirects": {
|
||||||
"version": "1.15.4",
|
"version": "1.15.6",
|
||||||
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz",
|
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
|
||||||
"integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==",
|
"integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"for-each": {
|
"for-each": {
|
||||||
@@ -21960,9 +21960,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"ip": {
|
"ip": {
|
||||||
"version": "1.1.8",
|
"version": "1.1.9",
|
||||||
"resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz",
|
"resolved": "https://registry.npmjs.org/ip/-/ip-1.1.9.tgz",
|
||||||
"integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==",
|
"integrity": "sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"ip-regex": {
|
"ip-regex": {
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
# Name, Type, SubType, Offset, Size, Flags
|
||||||
|
nvs, data, nvs, 0x9000, 0x5000,
|
||||||
|
otadata, data, ota, 0xe000, 0x2000,
|
||||||
|
app0, app, ota_0, 0x10000, 0x140000,
|
||||||
|
app1, app, ota_1, 0x150000,0x140000,
|
||||||
|
spiffs, data, spiffs, 0x290000,0x160000,
|
||||||
|
coredump, data, coredump,0x3F0000,0x10000,
|
||||||
|
@@ -0,0 +1,7 @@
|
|||||||
|
# Name, Type, SubType, Offset, Size, Flags
|
||||||
|
nvs, data, nvs, 0x9000, 0x5000,
|
||||||
|
otadata, data, ota, 0xe000, 0x2000,
|
||||||
|
app0, app, ota_0, 0x10000, 0x640000,
|
||||||
|
app1, app, ota_1, 0x650000,0x640000,
|
||||||
|
spiffs, data, spiffs, 0xc90000,0x360000,
|
||||||
|
coredump, data, coredump,0xFF0000,0x10000,
|
||||||
|
@@ -0,0 +1,7 @@
|
|||||||
|
# Name, Type, SubType, Offset, Size, Flags
|
||||||
|
nvs, data, nvs, 0x9000, 0x5000,
|
||||||
|
otadata, data, ota, 0xe000, 0x2000,
|
||||||
|
app0, app, ota_0, 0x10000, 0x330000,
|
||||||
|
app1, app, ota_1, 0x340000,0x330000,
|
||||||
|
spiffs, data, spiffs, 0x670000,0x180000,
|
||||||
|
coredump, data, coredump,0x7F0000,0x10000,
|
||||||
|
@@ -0,0 +1,7 @@
|
|||||||
|
# Name, Type, SubType, Offset, Size, Flags
|
||||||
|
nvs, data, nvs, 0x9000, 0x5000,
|
||||||
|
otadata, data, ota, 0xe000, 0x2000,
|
||||||
|
app0, app, ota_0, 0x10000, 0x1E0000,
|
||||||
|
app1, app, ota_1, 0x1F0000,0x1E0000,
|
||||||
|
spiffs, data, spiffs, 0x3D0000,0x20000,
|
||||||
|
coredump, data, coredump,0x3F0000,0x10000,
|
||||||
|
+3
-2
@@ -60,7 +60,7 @@ extra_configs =
|
|||||||
;default_envs = esp32s3-atomS3U
|
;default_envs = esp32s3-atomS3U
|
||||||
;default_envs = esp32doitv1-aithinker-r01-sx1278
|
;default_envs = esp32doitv1-aithinker-r01-sx1278
|
||||||
;default_envs = esp32dev-rtl_433
|
;default_envs = esp32dev-rtl_433
|
||||||
;default_envs = heltec-rtl_433
|
default_envs = heltec-rtl_433
|
||||||
;default_envs = heltec-rtl_433-fsk
|
;default_envs = heltec-rtl_433-fsk
|
||||||
;default_envs = heltec-ble
|
;default_envs = heltec-ble
|
||||||
;default_envs = lilygo-rtl_433
|
;default_envs = lilygo-rtl_433
|
||||||
@@ -103,6 +103,7 @@ extra_configs =
|
|||||||
;default_envs = lolin_c3_mini
|
;default_envs = lolin_c3_mini
|
||||||
;default_envs = thingpulse-espgateway
|
;default_envs = thingpulse-espgateway
|
||||||
;default_envs = theengs-bridge
|
;default_envs = theengs-bridge
|
||||||
|
;default_envs = esp32dev-ble-idf
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
; ENVIRONMENTS PARAMETERS ;
|
; ENVIRONMENTS PARAMETERS ;
|
||||||
@@ -220,4 +221,4 @@ lib_deps =
|
|||||||
${libraries.ethernet}
|
${libraries.ethernet}
|
||||||
build_flags =
|
build_flags =
|
||||||
${env.build_flags}
|
${env.build_flags}
|
||||||
'-DsimpleReceiving=false'
|
'-DsimpleReceiving=false'
|
||||||
@@ -13,9 +13,8 @@ def calculate_md5(filepath):
|
|||||||
|
|
||||||
def main():
|
def main():
|
||||||
print(f"Pre build BLE library replacement script")
|
print(f"Pre build BLE library replacement script")
|
||||||
home_path = os.environ.get('HOME') or os.environ.get('USERPROFILE')
|
|
||||||
source_file = 'lib/esp32-bt-lib/esp32/libbtdm_app.a'
|
source_file = 'lib/esp32-bt-lib/esp32/libbtdm_app.a'
|
||||||
destination_file = os.path.join(home_path, '.platformio', 'packages', 'framework-arduinoespressif32', 'tools', 'sdk', 'esp32', 'ld', 'libbtdm_app.a')
|
destination_file = os.path.join(env.GetProjectConfig().get("platformio", "packages_dir"), 'framework-arduinoespressif32', 'tools', 'sdk', 'esp32', 'ld', 'libbtdm_app.a')
|
||||||
|
|
||||||
try:
|
try:
|
||||||
shutil.copyfile(source_file, destination_file)
|
shutil.copyfile(source_file, destination_file)
|
||||||
|
|||||||
@@ -0,0 +1,218 @@
|
|||||||
|
CONFIG_FREERTOS_HZ=1000
|
||||||
|
CONFIG_COAP_MBEDTLS_PSK=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bluetooth
|
||||||
|
#
|
||||||
|
CONFIG_BT_ENABLED=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bluetooth controller
|
||||||
|
#
|
||||||
|
CONFIG_BTDM_CTRL_MODE_BLE_ONLY=y
|
||||||
|
# CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY is not set
|
||||||
|
# CONFIG_BTDM_CTRL_MODE_BTDM is not set
|
||||||
|
CONFIG_BTDM_CTRL_BLE_MAX_CONN=3
|
||||||
|
CONFIG_BTDM_CTRL_BR_EDR_SCO_DATA_PATH_EFF=0
|
||||||
|
CONFIG_BTDM_CTRL_PCM_ROLE_EFF=0
|
||||||
|
CONFIG_BTDM_CTRL_PCM_POLAR_EFF=0
|
||||||
|
CONFIG_BTDM_CTRL_BLE_MAX_CONN_EFF=3
|
||||||
|
CONFIG_BTDM_CTRL_BR_EDR_MAX_ACL_CONN_EFF=0
|
||||||
|
CONFIG_BTDM_CTRL_BR_EDR_MAX_SYNC_CONN_EFF=0
|
||||||
|
CONFIG_BTDM_CTRL_PINNED_TO_CORE_0=y
|
||||||
|
# CONFIG_BTDM_CTRL_PINNED_TO_CORE_1 is not set
|
||||||
|
CONFIG_BTDM_CTRL_PINNED_TO_CORE=0
|
||||||
|
CONFIG_BTDM_CTRL_HCI_MODE_VHCI=y
|
||||||
|
# CONFIG_BTDM_CTRL_HCI_MODE_UART_H4 is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# MODEM SLEEP Options
|
||||||
|
#
|
||||||
|
CONFIG_BTDM_CTRL_MODEM_SLEEP=y
|
||||||
|
CONFIG_BTDM_CTRL_MODEM_SLEEP_MODE_ORIG=y
|
||||||
|
# CONFIG_BTDM_CTRL_MODEM_SLEEP_MODE_EVED is not set
|
||||||
|
CONFIG_BTDM_CTRL_LPCLK_SEL_MAIN_XTAL=y
|
||||||
|
# end of MODEM SLEEP Options
|
||||||
|
|
||||||
|
CONFIG_BTDM_BLE_DEFAULT_SCA_250PPM=y
|
||||||
|
CONFIG_BTDM_BLE_SLEEP_CLOCK_ACCURACY_INDEX_EFF=1
|
||||||
|
CONFIG_BTDM_BLE_SCAN_DUPL=y
|
||||||
|
CONFIG_BTDM_SCAN_DUPL_TYPE_DEVICE=y
|
||||||
|
# CONFIG_BTDM_SCAN_DUPL_TYPE_DATA is not set
|
||||||
|
# CONFIG_BTDM_SCAN_DUPL_TYPE_DATA_DEVICE is not set
|
||||||
|
CONFIG_BTDM_SCAN_DUPL_TYPE=0
|
||||||
|
CONFIG_BTDM_SCAN_DUPL_CACHE_SIZE=100
|
||||||
|
# CONFIG_BTDM_BLE_MESH_SCAN_DUPL_EN is not set
|
||||||
|
CONFIG_BTDM_CTRL_FULL_SCAN_SUPPORTED=y
|
||||||
|
CONFIG_BTDM_BLE_ADV_REPORT_FLOW_CTRL_SUPP=y
|
||||||
|
CONFIG_BTDM_BLE_ADV_REPORT_FLOW_CTRL_NUM=100
|
||||||
|
CONFIG_BTDM_BLE_ADV_REPORT_DISCARD_THRSHOLD=20
|
||||||
|
CONFIG_BTDM_RESERVE_DRAM=0xdb5c
|
||||||
|
CONFIG_BTDM_CTRL_HLI=y
|
||||||
|
# end of Bluetooth controller
|
||||||
|
|
||||||
|
# CONFIG_BT_BLUEDROID_ENABLED is not set
|
||||||
|
CONFIG_BT_NIMBLE_ENABLED=y
|
||||||
|
# CONFIG_BT_CONTROLLER_ONLY is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# NimBLE Options
|
||||||
|
#
|
||||||
|
CONFIG_BT_NIMBLE_MEM_ALLOC_MODE_INTERNAL=y
|
||||||
|
# CONFIG_BT_NIMBLE_MEM_ALLOC_MODE_DEFAULT is not set
|
||||||
|
# CONFIG_BT_NIMBLE_LOG_LEVEL_NONE is not set
|
||||||
|
# CONFIG_BT_NIMBLE_LOG_LEVEL_ERROR is not set
|
||||||
|
# CONFIG_BT_NIMBLE_LOG_LEVEL_WARNING is not set
|
||||||
|
CONFIG_BT_NIMBLE_LOG_LEVEL_INFO=y
|
||||||
|
# CONFIG_BT_NIMBLE_LOG_LEVEL_DEBUG is not set
|
||||||
|
CONFIG_BT_NIMBLE_LOG_LEVEL=1
|
||||||
|
CONFIG_BT_NIMBLE_MAX_CONNECTIONS=3
|
||||||
|
CONFIG_BT_NIMBLE_MAX_BONDS=3
|
||||||
|
CONFIG_BT_NIMBLE_MAX_CCCDS=8
|
||||||
|
CONFIG_BT_NIMBLE_L2CAP_COC_MAX_NUM=0
|
||||||
|
CONFIG_BT_NIMBLE_PINNED_TO_CORE_0=y
|
||||||
|
# CONFIG_BT_NIMBLE_PINNED_TO_CORE_1 is not set
|
||||||
|
CONFIG_BT_NIMBLE_PINNED_TO_CORE=0
|
||||||
|
CONFIG_BT_NIMBLE_TASK_STACK_SIZE=4096
|
||||||
|
CONFIG_BT_NIMBLE_ROLE_CENTRAL=y
|
||||||
|
CONFIG_BT_NIMBLE_ROLE_PERIPHERAL=y
|
||||||
|
CONFIG_BT_NIMBLE_ROLE_BROADCASTER=y
|
||||||
|
CONFIG_BT_NIMBLE_ROLE_OBSERVER=y
|
||||||
|
CONFIG_BT_NIMBLE_NVS_PERSIST=y
|
||||||
|
CONFIG_BT_NIMBLE_SM_LEGACY=y
|
||||||
|
CONFIG_BT_NIMBLE_SM_SC=y
|
||||||
|
# CONFIG_BT_NIMBLE_DEBUG is not set
|
||||||
|
# CONFIG_BT_NIMBLE_SM_SC_DEBUG_KEYS is not set
|
||||||
|
CONFIG_BT_NIMBLE_SVC_GAP_DEVICE_NAME="nimble"
|
||||||
|
CONFIG_BT_NIMBLE_GAP_DEVICE_NAME_MAX_LEN=31
|
||||||
|
CONFIG_BT_NIMBLE_ATT_PREFERRED_MTU=256
|
||||||
|
CONFIG_BT_NIMBLE_SVC_GAP_APPEARANCE=0
|
||||||
|
CONFIG_BT_NIMBLE_ACL_BUF_COUNT=20
|
||||||
|
CONFIG_BT_NIMBLE_ACL_BUF_SIZE=255
|
||||||
|
CONFIG_BT_NIMBLE_HCI_EVT_BUF_SIZE=70
|
||||||
|
CONFIG_BT_NIMBLE_HCI_EVT_HI_BUF_COUNT=30
|
||||||
|
CONFIG_BT_NIMBLE_HCI_EVT_LO_BUF_COUNT=8
|
||||||
|
CONFIG_BT_NIMBLE_MSYS1_BLOCK_COUNT=12
|
||||||
|
CONFIG_BT_NIMBLE_HS_FLOW_CTRL=y
|
||||||
|
CONFIG_BT_NIMBLE_HS_FLOW_CTRL_ITVL=1000
|
||||||
|
CONFIG_BT_NIMBLE_HS_FLOW_CTRL_THRESH=2
|
||||||
|
CONFIG_BT_NIMBLE_HS_FLOW_CTRL_TX_ON_DISCONNECT=y
|
||||||
|
CONFIG_BT_NIMBLE_RPA_TIMEOUT=900
|
||||||
|
# CONFIG_BT_NIMBLE_MESH is not set
|
||||||
|
CONFIG_BT_NIMBLE_CRYPTO_STACK_MBEDTLS=y
|
||||||
|
CONFIG_BT_NIMBLE_HS_STOP_TIMEOUT_MS=2000
|
||||||
|
# CONFIG_BT_NIMBLE_ENABLE_CONN_REATTEMPT is not set
|
||||||
|
CONFIG_BT_NIMBLE_BLUFI_ENABLE=y
|
||||||
|
CONFIG_BT_NIMBLE_USE_ESP_TIMER=y
|
||||||
|
# end of NimBLE Options
|
||||||
|
# end of Bluetooth
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# TLS Key Exchange Methods
|
||||||
|
#
|
||||||
|
CONFIG_MBEDTLS_PSK_MODES=y
|
||||||
|
CONFIG_MBEDTLS_KEY_EXCHANGE_PSK=y
|
||||||
|
CONFIG_MBEDTLS_KEY_EXCHANGE_DHE_PSK=y
|
||||||
|
CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_PSK=y
|
||||||
|
CONFIG_MBEDTLS_KEY_EXCHANGE_RSA_PSK=y
|
||||||
|
CONFIG_MBEDTLS_KEY_EXCHANGE_RSA=y
|
||||||
|
CONFIG_MBEDTLS_KEY_EXCHANGE_DHE_RSA=y
|
||||||
|
CONFIG_MBEDTLS_KEY_EXCHANGE_ELLIPTIC_CURVE=y
|
||||||
|
CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_RSA=y
|
||||||
|
CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA=y
|
||||||
|
CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA=y
|
||||||
|
CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_RSA=y
|
||||||
|
# end of TLS Key Exchange Methods
|
||||||
|
|
||||||
|
#
|
||||||
|
# Arduino Configuration
|
||||||
|
#
|
||||||
|
CONFIG_ARDUINO_VARIANT="esp32"
|
||||||
|
CONFIG_ENABLE_ARDUINO_DEPENDS=y
|
||||||
|
CONFIG_AUTOSTART_ARDUINO=y
|
||||||
|
# CONFIG_ARDUINO_RUN_CORE0 is not set
|
||||||
|
CONFIG_ARDUINO_RUN_CORE1=y
|
||||||
|
# CONFIG_ARDUINO_RUN_NO_AFFINITY is not set
|
||||||
|
CONFIG_ARDUINO_RUNNING_CORE=1
|
||||||
|
CONFIG_ARDUINO_LOOP_STACK_SIZE=8192
|
||||||
|
# CONFIG_ARDUINO_EVENT_RUN_CORE0 is not set
|
||||||
|
CONFIG_ARDUINO_EVENT_RUN_CORE1=y
|
||||||
|
# CONFIG_ARDUINO_EVENT_RUN_NO_AFFINITY is not set
|
||||||
|
CONFIG_ARDUINO_EVENT_RUNNING_CORE=1
|
||||||
|
# CONFIG_ARDUINO_SERIAL_EVENT_RUN_CORE0 is not set
|
||||||
|
# CONFIG_ARDUINO_SERIAL_EVENT_RUN_CORE1 is not set
|
||||||
|
CONFIG_ARDUINO_SERIAL_EVENT_RUN_NO_AFFINITY=y
|
||||||
|
CONFIG_ARDUINO_SERIAL_EVENT_TASK_RUNNING_CORE=-1
|
||||||
|
CONFIG_ARDUINO_SERIAL_EVENT_TASK_STACK_SIZE=2048
|
||||||
|
CONFIG_ARDUINO_SERIAL_EVENT_TASK_PRIORITY=24
|
||||||
|
CONFIG_ARDUINO_UDP_RUN_CORE0=y
|
||||||
|
# CONFIG_ARDUINO_UDP_RUN_CORE1 is not set
|
||||||
|
# CONFIG_ARDUINO_UDP_RUN_NO_AFFINITY is not set
|
||||||
|
CONFIG_ARDUINO_UDP_RUNNING_CORE=0
|
||||||
|
CONFIG_ARDUINO_UDP_TASK_PRIORITY=3
|
||||||
|
# CONFIG_ARDUINO_ISR_IRAM is not set
|
||||||
|
# CONFIG_DISABLE_HAL_LOCKS is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Debug Log Configuration
|
||||||
|
#
|
||||||
|
# CONFIG_ARDUHAL_LOG_DEFAULT_LEVEL_NONE is not set
|
||||||
|
CONFIG_ARDUHAL_LOG_DEFAULT_LEVEL_ERROR=y
|
||||||
|
# CONFIG_ARDUHAL_LOG_DEFAULT_LEVEL_WARN is not set
|
||||||
|
# CONFIG_ARDUHAL_LOG_DEFAULT_LEVEL_INFO is not set
|
||||||
|
# CONFIG_ARDUHAL_LOG_DEFAULT_LEVEL_DEBUG is not set
|
||||||
|
# CONFIG_ARDUHAL_LOG_DEFAULT_LEVEL_VERBOSE is not set
|
||||||
|
CONFIG_ARDUHAL_LOG_DEFAULT_LEVEL=1
|
||||||
|
# CONFIG_ARDUHAL_LOG_COLORS is not set
|
||||||
|
# CONFIG_ARDUHAL_ESP_LOG is not set
|
||||||
|
# end of Debug Log Configuration
|
||||||
|
|
||||||
|
# CONFIG_ARDUHAL_PARTITION_SCHEME_DEFAULT is not set
|
||||||
|
# CONFIG_ARDUHAL_PARTITION_SCHEME_MINIMAL is not set
|
||||||
|
# CONFIG_ARDUHAL_PARTITION_SCHEME_NO_OTA is not set
|
||||||
|
# CONFIG_ARDUHAL_PARTITION_SCHEME_HUGE_APP is not set
|
||||||
|
CONFIG_ARDUHAL_PARTITION_SCHEME_MIN_SPIFFS=y
|
||||||
|
CONFIG_ARDUHAL_PARTITION_SCHEME="min_spiffs"
|
||||||
|
# CONFIG_AUTOCONNECT_WIFI is not set
|
||||||
|
CONFIG_ARDUINO_SELECTIVE_COMPILATION=y
|
||||||
|
CONFIG_ARDUINO_SELECTIVE_ArduinoOTA=y
|
||||||
|
CONFIG_ARDUINO_SELECTIVE_AsyncUDP=y
|
||||||
|
# CONFIG_ARDUINO_SELECTIVE_AzureIoT is not set
|
||||||
|
# CONFIG_ARDUINO_SELECTIVE_BLE is not set
|
||||||
|
# CONFIG_ARDUINO_SELECTIVE_BluetoothSerial is not set
|
||||||
|
CONFIG_ARDUINO_SELECTIVE_DNSServer=y
|
||||||
|
CONFIG_ARDUINO_SELECTIVE_EEPROM=y
|
||||||
|
CONFIG_ARDUINO_SELECTIVE_ESP32=y
|
||||||
|
CONFIG_ARDUINO_SELECTIVE_ESPmDNS=y
|
||||||
|
CONFIG_ARDUINO_SELECTIVE_FFat=y
|
||||||
|
CONFIG_ARDUINO_SELECTIVE_FS=y
|
||||||
|
CONFIG_ARDUINO_SELECTIVE_HTTPClient=y
|
||||||
|
CONFIG_ARDUINO_SELECTIVE_LITTLEFS=y
|
||||||
|
CONFIG_ARDUINO_SELECTIVE_NetBIOS=y
|
||||||
|
CONFIG_ARDUINO_SELECTIVE_Preferences=y
|
||||||
|
CONFIG_ARDUINO_SELECTIVE_SD=y
|
||||||
|
CONFIG_ARDUINO_SELECTIVE_SD_MMC=y
|
||||||
|
# CONFIG_ARDUINO_SELECTIVE_SimpleBLE is not set
|
||||||
|
CONFIG_ARDUINO_SELECTIVE_SPI=y
|
||||||
|
CONFIG_ARDUINO_SELECTIVE_SPIFFS=y
|
||||||
|
CONFIG_ARDUINO_SELECTIVE_Ticker=y
|
||||||
|
CONFIG_ARDUINO_SELECTIVE_Update=y
|
||||||
|
CONFIG_ARDUINO_SELECTIVE_WebServer=y
|
||||||
|
CONFIG_ARDUINO_SELECTIVE_WiFi=y
|
||||||
|
CONFIG_ARDUINO_SELECTIVE_WiFiClientSecure=y
|
||||||
|
CONFIG_ARDUINO_SELECTIVE_WiFiProv=y
|
||||||
|
CONFIG_ARDUINO_SELECTIVE_Wire=y
|
||||||
|
# end of Arduino Configuration
|
||||||
|
|
||||||
|
# CONFIG_ESP32_WIFI_IRAM_OPT is not set
|
||||||
|
# CONFIG_ESP32_WIFI_RX_IRAM_OPT is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# SPI configuration
|
||||||
|
#
|
||||||
|
# CONFIG_SPI_MASTER_IN_IRAM is not set
|
||||||
|
# CONFIG_SPI_MASTER_ISR_IN_IRAM is not set
|
||||||
|
# CONFIG_SPI_SLAVE_IN_IRAM is not set
|
||||||
|
# CONFIG_SPI_SLAVE_ISR_IN_IRAM is not set
|
||||||
|
# end of SPI configuration
|
||||||
Reference in new issue
Block a user