diff --git a/.github/workflows/build_esp32.yml b/.github/workflows/build_esp32.yml
index 32cd45000..2c4622f43 100644
--- a/.github/workflows/build_esp32.yml
+++ b/.github/workflows/build_esp32.yml
@@ -3,6 +3,9 @@ name: Build ESP32
on:
workflow_call:
inputs:
+ version:
+ required: true
+ type: string
board:
required: true
type: string
@@ -14,11 +17,10 @@ jobs:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
-
- - name: Get release version string
- shell: bash
- run: echo "long=$(./bin/buildinfo.py long)" >> $GITHUB_OUTPUT
- id: version
+ with:
+ submodules: recursive
+ ref: ${{github.event.pull_request.head.ref}}
+ repository: ${{github.event.pull_request.head.repo.full_name}}
- name: Build ESP32
id: build
@@ -33,7 +35,7 @@ jobs:
- name: Store binaries as an artifact
uses: actions/upload-artifact@v4
with:
- name: firmware-esp32-${{ inputs.board }}-${{ steps.version.outputs.long }}.zip
+ name: firmware-esp32-${{ inputs.board }}-${{ inputs.version }}.zip
overwrite: true
path: |
release/*.bin
diff --git a/.github/workflows/build_esp32_c3.yml b/.github/workflows/build_esp32_c3.yml
index 161786f99..3e7746166 100644
--- a/.github/workflows/build_esp32_c3.yml
+++ b/.github/workflows/build_esp32_c3.yml
@@ -3,6 +3,9 @@ name: Build ESP32-C3
on:
workflow_call:
inputs:
+ version:
+ required: true
+ type: string
board:
required: true
type: string
@@ -14,11 +17,10 @@ jobs:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
-
- - name: Get release version string
- shell: bash
- run: echo "long=$(./bin/buildinfo.py long)" >> $GITHUB_OUTPUT
- id: version
+ with:
+ submodules: recursive
+ ref: ${{github.event.pull_request.head.ref}}
+ repository: ${{github.event.pull_request.head.repo.full_name}}
- name: Build ESP32-C3
id: build
@@ -33,7 +35,7 @@ jobs:
- name: Store binaries as an artifact
uses: actions/upload-artifact@v4
with:
- name: firmware-esp32c3-${{ inputs.board }}-${{ steps.version.outputs.long }}.zip
+ name: firmware-esp32c3-${{ inputs.board }}-${{ inputs.version }}.zip
overwrite: true
path: |
release/*.bin
diff --git a/.github/workflows/build_esp32_c6.yml b/.github/workflows/build_esp32_c6.yml
index 90cdcc78e..6f32eb3c6 100644
--- a/.github/workflows/build_esp32_c6.yml
+++ b/.github/workflows/build_esp32_c6.yml
@@ -3,6 +3,9 @@ name: Build ESP32-C6
on:
workflow_call:
inputs:
+ version:
+ required: true
+ type: string
board:
required: true
type: string
@@ -14,11 +17,10 @@ jobs:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
-
- - name: Get release version string
- shell: bash
- run: echo "long=$(./bin/buildinfo.py long)" >> $GITHUB_OUTPUT
- id: version
+ with:
+ submodules: recursive
+ ref: ${{github.event.pull_request.head.ref}}
+ repository: ${{github.event.pull_request.head.repo.full_name}}
- name: Build ESP32-C6
id: build
@@ -33,7 +35,7 @@ jobs:
- name: Store binaries as an artifact
uses: actions/upload-artifact@v4
with:
- name: firmware-esp32c6-${{ inputs.board }}-${{ steps.version.outputs.long }}.zip
+ name: firmware-esp32c6-${{ inputs.board }}-${{ inputs.version }}.zip
overwrite: true
path: |
release/*.bin
diff --git a/.github/workflows/build_esp32_s3.yml b/.github/workflows/build_esp32_s3.yml
index e5ed48e3e..6527d6d7c 100644
--- a/.github/workflows/build_esp32_s3.yml
+++ b/.github/workflows/build_esp32_s3.yml
@@ -3,6 +3,9 @@ name: Build ESP32-S3
on:
workflow_call:
inputs:
+ version:
+ required: true
+ type: string
board:
required: true
type: string
@@ -14,11 +17,10 @@ jobs:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
-
- - name: Get release version string
- shell: bash
- run: echo "long=$(./bin/buildinfo.py long)" >> $GITHUB_OUTPUT
- id: version
+ with:
+ submodules: recursive
+ ref: ${{github.event.pull_request.head.ref}}
+ repository: ${{github.event.pull_request.head.repo.full_name}}
- name: Build ESP32-S3
id: build
@@ -33,7 +35,7 @@ jobs:
- name: Store binaries as an artifact
uses: actions/upload-artifact@v4
with:
- name: firmware-esp32s3-${{ inputs.board }}-${{ steps.version.outputs.long }}.zip
+ name: firmware-esp32s3-${{ inputs.board }}-${{ inputs.version }}.zip
overwrite: true
path: |
release/*.bin
diff --git a/.github/workflows/build_nrf52.yml b/.github/workflows/build_nrf52.yml
index 312aeb372..89be40187 100644
--- a/.github/workflows/build_nrf52.yml
+++ b/.github/workflows/build_nrf52.yml
@@ -3,6 +3,9 @@ name: Build NRF52
on:
workflow_call:
inputs:
+ version:
+ required: true
+ type: string
board:
required: true
type: string
@@ -14,11 +17,10 @@ jobs:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
-
- - name: Get release version string
- shell: bash
- run: echo "long=$(./bin/buildinfo.py long)" >> $GITHUB_OUTPUT
- id: version
+ with:
+ submodules: recursive
+ ref: ${{github.event.pull_request.head.ref}}
+ repository: ${{github.event.pull_request.head.repo.full_name}}
- name: Build NRF52
id: build
@@ -31,7 +33,7 @@ jobs:
- name: Store binaries as an artifact
uses: actions/upload-artifact@v4
with:
- name: firmware-nrf52840-${{ inputs.board }}-${{ steps.version.outputs.long }}.zip
+ name: firmware-nrf52840-${{ inputs.board }}-${{ inputs.version }}.zip
overwrite: true
path: |
release/*.uf2
diff --git a/.github/workflows/build_rpi2040.yml b/.github/workflows/build_rpi2040.yml
index 2abd7a839..fbaa21684 100644
--- a/.github/workflows/build_rpi2040.yml
+++ b/.github/workflows/build_rpi2040.yml
@@ -3,6 +3,9 @@ name: Build RPI2040
on:
workflow_call:
inputs:
+ version:
+ required: true
+ type: string
board:
required: true
type: string
@@ -14,11 +17,10 @@ jobs:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
-
- - name: Get release version string
- shell: bash
- run: echo "long=$(./bin/buildinfo.py long)" >> $GITHUB_OUTPUT
- id: version
+ with:
+ submodules: recursive
+ ref: ${{github.event.pull_request.head.ref}}
+ repository: ${{github.event.pull_request.head.repo.full_name}}
- name: Build Raspberry Pi 2040
id: build
@@ -31,7 +33,7 @@ jobs:
- name: Store binaries as an artifact
uses: actions/upload-artifact@v4
with:
- name: firmware-rp2040-${{ inputs.board }}-${{ steps.version.outputs.long }}.zip
+ name: firmware-rp2040-${{ inputs.board }}-${{ inputs.version }}.zip
overwrite: true
path: |
release/*.uf2
diff --git a/.github/workflows/build_stm32.yml b/.github/workflows/build_stm32.yml
index 10680f422..f06e8f3b8 100644
--- a/.github/workflows/build_stm32.yml
+++ b/.github/workflows/build_stm32.yml
@@ -3,6 +3,9 @@ name: Build STM32
on:
workflow_call:
inputs:
+ version:
+ required: true
+ type: string
board:
required: true
type: string
@@ -14,11 +17,10 @@ jobs:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
-
- - name: Get release version string
- shell: bash
- run: echo "long=$(./bin/buildinfo.py long)" >> $GITHUB_OUTPUT
- id: version
+ with:
+ submodules: recursive
+ ref: ${{github.event.pull_request.head.ref}}
+ repository: ${{github.event.pull_request.head.repo.full_name}}
- name: Build STM32WL
id: build
@@ -31,7 +33,7 @@ jobs:
- name: Store binaries as an artifact
uses: actions/upload-artifact@v4
with:
- name: firmware-stm32-${{ inputs.board }}-${{ steps.version.outputs.long }}.zip
+ name: firmware-stm32-${{ inputs.board }}-${{ inputs.version }}.zip
overwrite: true
path: |
release/*.hex
diff --git a/.github/workflows/daily_packaging.yml b/.github/workflows/daily_packaging.yml
index 63d24687b..eb61554f2 100644
--- a/.github/workflows/daily_packaging.yml
+++ b/.github/workflows/daily_packaging.yml
@@ -30,7 +30,11 @@ jobs:
strategy:
fail-fast: false
matrix:
- series: [plucky, noble, jammy]
+ series:
+ - jammy # 22.04
+ - noble # 24.04
+ - plucky # 25.04
+ - questing # 25.10
uses: ./.github/workflows/package_ppa.yml
with:
ppa_repo: ppa:meshtastic/daily
diff --git a/.github/workflows/main_matrix.yml b/.github/workflows/main_matrix.yml
index a676efa1e..9d5cb0981 100644
--- a/.github/workflows/main_matrix.yml
+++ b/.github/workflows/main_matrix.yml
@@ -33,9 +33,7 @@ jobs:
arch: [esp32, esp32s3, esp32c3, esp32c6, nrf52840, rp2040, stm32, check]
runs-on: ubuntu-latest
steps:
- - id: checkout
- uses: actions/checkout@v4
- name: Checkout base
+ - uses: actions/checkout@v4
- id: jsonStep
run: |
if [[ "$GITHUB_HEAD_REF" == "" ]]; then
@@ -55,6 +53,21 @@ jobs:
stm32: ${{ steps.jsonStep.outputs.stm32 }}
check: ${{ steps.jsonStep.outputs.check }}
+ version:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - name: Get release version string
+ run: |
+ echo "long=$(./bin/buildinfo.py long)" >> $GITHUB_OUTPUT
+ echo "deb=$(./bin/buildinfo.py deb)" >> $GITHUB_OUTPUT
+ id: version
+ env:
+ BUILD_LOCATION: local
+ outputs:
+ long: ${{ steps.version.outputs.long }}
+ deb: ${{ steps.version.outputs.deb }}
+
check:
needs: setup
strategy:
@@ -72,66 +85,73 @@ jobs:
run: bin/check-all.sh ${{ matrix.board }}
build-esp32:
- needs: setup
+ needs: [setup, version]
strategy:
fail-fast: false
matrix: ${{ fromJson(needs.setup.outputs.esp32) }}
uses: ./.github/workflows/build_esp32.yml
with:
+ version: ${{ needs.version.outputs.long }}
board: ${{ matrix.board }}
build-esp32-s3:
- needs: setup
+ needs: [setup, version]
strategy:
fail-fast: false
matrix: ${{ fromJson(needs.setup.outputs.esp32s3) }}
uses: ./.github/workflows/build_esp32_s3.yml
with:
+ version: ${{ needs.version.outputs.long }}
board: ${{ matrix.board }}
build-esp32-c3:
- needs: setup
+ needs: [setup, version]
strategy:
fail-fast: false
matrix: ${{ fromJson(needs.setup.outputs.esp32c3) }}
uses: ./.github/workflows/build_esp32_c3.yml
with:
+ version: ${{ needs.version.outputs.long }}
board: ${{ matrix.board }}
build-esp32-c6:
- needs: setup
+ needs: [setup, version]
strategy:
fail-fast: false
matrix: ${{ fromJson(needs.setup.outputs.esp32c6) }}
uses: ./.github/workflows/build_esp32_c6.yml
with:
+ version: ${{ needs.version.outputs.long }}
board: ${{ matrix.board }}
build-nrf52:
- needs: setup
+ needs: [setup, version]
strategy:
fail-fast: false
matrix: ${{ fromJson(needs.setup.outputs.nrf52840) }}
uses: ./.github/workflows/build_nrf52.yml
with:
+ version: ${{ needs.version.outputs.long }}
board: ${{ matrix.board }}
build-rpi2040:
- needs: setup
+ needs: [setup, version]
strategy:
fail-fast: false
matrix: ${{ fromJson(needs.setup.outputs.rp2040) }}
uses: ./.github/workflows/build_rpi2040.yml
with:
+ version: ${{ needs.version.outputs.long }}
board: ${{ matrix.board }}
build-stm32:
- needs: setup
+ needs: [setup, version]
strategy:
fail-fast: false
matrix: ${{ fromJson(needs.setup.outputs.stm32) }}
uses: ./.github/workflows/build_stm32.yml
with:
+ version: ${{ needs.version.outputs.long }}
board: ${{ matrix.board }}
build-debian-src:
@@ -214,6 +234,7 @@ jobs:
runs-on: ubuntu-latest
needs:
[
+ version,
build-esp32,
build-esp32-s3,
build-esp32-c3,
@@ -238,17 +259,13 @@ jobs:
- name: Display structure of downloaded files
run: ls -R
- - name: Get release version string
- run: echo "long=$(./bin/buildinfo.py long)" >> $GITHUB_OUTPUT
- id: version
-
- name: Move files up
run: mv -b -t ./ ./bin/device-*.sh ./bin/device-*.bat
- name: Repackage in single firmware zip
uses: actions/upload-artifact@v4
with:
- name: firmware-${{matrix.arch}}-${{ steps.version.outputs.long }}
+ name: firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}
overwrite: true
path: |
./firmware-*.bin
@@ -264,7 +281,7 @@ jobs:
- uses: actions/download-artifact@v4
with:
- name: firmware-${{matrix.arch}}-${{ steps.version.outputs.long }}
+ name: firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}
merge-multiple: true
path: ./output
@@ -278,12 +295,12 @@ jobs:
chmod +x ./output/device-update.sh
- name: Zip firmware
- run: zip -j -9 -r ./firmware-${{matrix.arch}}-${{ steps.version.outputs.long }}.zip ./output
+ run: zip -j -9 -r ./firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip ./output
- name: Repackage in single elfs zip
uses: actions/upload-artifact@v4
with:
- name: debug-elfs-${{matrix.arch}}-${{ steps.version.outputs.long }}.zip
+ name: debug-elfs-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip
overwrite: true
path: ./*.elf
retention-days: 30
@@ -291,8 +308,8 @@ jobs:
- uses: scruplelesswizard/comment-artifact@main
if: ${{ github.event_name == 'pull_request' }}
with:
- name: firmware-${{matrix.arch}}-${{ steps.version.outputs.long }}
- description: "Download firmware-${{matrix.arch}}-${{ steps.version.outputs.long }}.zip. This artifact will be available for 90 days from creation"
+ name: firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}
+ description: "Download firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip. This artifact will be available for 90 days from creation"
github-token: ${{ secrets.GITHUB_TOKEN }}
release-artifacts:
@@ -301,6 +318,7 @@ jobs:
outputs:
upload_url: ${{ steps.create_release.outputs.upload_url }}
needs:
+ - version
- gather-artifacts
- build-debian-src
- package-pio-deps-native-tft
@@ -313,44 +331,36 @@ jobs:
with:
python-version: 3.x
- - name: Get release version string
- run: |
- echo "long=$(./bin/buildinfo.py long)" >> $GITHUB_OUTPUT
- echo "deb=$(./bin/buildinfo.py deb)" >> $GITHUB_OUTPUT
- id: version
- env:
- BUILD_LOCATION: local
-
- name: Create release
uses: softprops/action-gh-release@v2
id: create_release
with:
draft: true
prerelease: true
- name: Meshtastic Firmware ${{ steps.version.outputs.long }} Alpha
- tag_name: v${{ steps.version.outputs.long }}
+ name: Meshtastic Firmware ${{ needs.version.outputs.long }} Alpha
+ tag_name: v${{ needs.version.outputs.long }}
body: |
Autogenerated by github action, developer should edit as required before publishing...
- name: Download source deb
uses: actions/download-artifact@v4
with:
- pattern: firmware-debian-${{ steps.version.outputs.deb }}~UNRELEASED-src
+ pattern: firmware-debian-${{ needs.version.outputs.deb }}~UNRELEASED-src
merge-multiple: true
path: ./output/debian-src
- name: Download `native-tft` pio deps
uses: actions/download-artifact@v4
with:
- pattern: platformio-deps-native-tft-${{ steps.version.outputs.long }}
+ pattern: platformio-deps-native-tft-${{ needs.version.outputs.long }}
merge-multiple: true
path: ./output/pio-deps-native-tft
- name: Zip Linux sources
working-directory: output
run: |
- zip -j -9 -r ./meshtasticd-${{ steps.version.outputs.deb }}-src.zip ./debian-src
- zip -9 -r ./platformio-deps-native-tft-${{ steps.version.outputs.long }}.zip ./pio-deps-native-tft
+ zip -j -9 -r ./meshtasticd-${{ needs.version.outputs.deb }}-src.zip ./debian-src
+ zip -9 -r ./platformio-deps-native-tft-${{ needs.version.outputs.long }}.zip ./pio-deps-native-tft
# For diagnostics
- name: Display structure of downloaded files
@@ -360,8 +370,8 @@ jobs:
# Only run when targeting master branch with workflow_dispatch
if: ${{ github.ref_name == 'master' }}
run: |
- gh release upload v${{ steps.version.outputs.long }} ./output/meshtasticd-${{ steps.version.outputs.deb }}-src.zip
- gh release upload v${{ steps.version.outputs.long }} ./output/platformio-deps-native-tft-${{ steps.version.outputs.long }}.zip
+ gh release upload v${{ needs.version.outputs.long }} ./output/meshtasticd-${{ needs.version.outputs.deb }}-src.zip
+ gh release upload v${{ needs.version.outputs.long }} ./output/platformio-deps-native-tft-${{ needs.version.outputs.long }}.zip
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -372,7 +382,7 @@ jobs:
arch: [esp32, esp32s3, esp32c3, esp32c6, nrf52840, rp2040, stm32]
runs-on: ubuntu-latest
if: ${{ github.event_name == 'workflow_dispatch' }}
- needs: [release-artifacts]
+ needs: [release-artifacts, version]
steps:
- name: Checkout
uses: actions/checkout@v4
@@ -382,13 +392,9 @@ jobs:
with:
python-version: 3.x
- - name: Get release version string
- run: echo "long=$(./bin/buildinfo.py long)" >> $GITHUB_OUTPUT
- id: version
-
- uses: actions/download-artifact@v4
with:
- pattern: firmware-${{matrix.arch}}-${{ steps.version.outputs.long }}
+ pattern: firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}
merge-multiple: true
path: ./output
@@ -401,16 +407,16 @@ jobs:
chmod +x ./output/device-update.sh
- name: Zip firmware
- run: zip -j -9 -r ./firmware-${{matrix.arch}}-${{ steps.version.outputs.long }}.zip ./output
+ run: zip -j -9 -r ./firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip ./output
- uses: actions/download-artifact@v4
with:
- name: debug-elfs-${{matrix.arch}}-${{ steps.version.outputs.long }}.zip
+ name: debug-elfs-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip
merge-multiple: true
path: ./elfs
- name: Zip debug elfs
- run: zip -j -9 -r ./debug-elfs-${{matrix.arch}}-${{ steps.version.outputs.long }}.zip ./elfs
+ run: zip -j -9 -r ./debug-elfs-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip ./elfs
# For diagnostics
- name: Display structure of downloaded files
@@ -420,15 +426,15 @@ jobs:
# Only run when targeting master branch with workflow_dispatch
if: ${{ github.ref_name == 'master' }}
run: |
- gh release upload v${{ steps.version.outputs.long }} ./firmware-${{matrix.arch}}-${{ steps.version.outputs.long }}.zip
- gh release upload v${{ steps.version.outputs.long }} ./debug-elfs-${{matrix.arch}}-${{ steps.version.outputs.long }}.zip
+ gh release upload v${{ needs.version.outputs.long }} ./firmware-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip
+ gh release upload v${{ needs.version.outputs.long }} ./debug-elfs-${{matrix.arch}}-${{ needs.version.outputs.long }}.zip
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
publish-firmware:
runs-on: ubuntu-24.04
if: ${{ github.event_name == 'workflow_dispatch' }}
- needs: [release-firmware]
+ needs: [release-firmware, version]
env:
targets: esp32,esp32s3,esp32c3,esp32c6,nrf52840,rp2040,stm32
steps:
@@ -440,13 +446,9 @@ jobs:
with:
python-version: 3.x
- - name: Get release version string
- run: echo "long=$(./bin/buildinfo.py long)" >> $GITHUB_OUTPUT
- id: version
-
- uses: actions/download-artifact@v4
with:
- pattern: firmware-{${{ env.targets }}}-${{ steps.version.outputs.long }}
+ pattern: firmware-{${{ env.targets }}}-${{ needs.version.outputs.long }}
merge-multiple: true
path: ./publish
@@ -460,9 +462,9 @@ jobs:
external_repository: meshtastic/meshtastic.github.io
publish_branch: master
publish_dir: ./publish
- destination_dir: ${{ env.DEST_PREFIX }}firmware-${{ steps.version.outputs.long }}
+ destination_dir: ${{ env.DEST_PREFIX }}firmware-${{ needs.version.outputs.long }}
keep_files: true
user_name: github-actions[bot]
user_email: github-actions[bot]@users.noreply.github.com
- commit_message: ${{ steps.version.outputs.long }}
+ commit_message: ${{ needs.version.outputs.long }}
enable_jekyll: true
diff --git a/.github/workflows/pr_enforce_labels.yml b/.github/workflows/pr_enforce_labels.yml
new file mode 100644
index 000000000..93114e2c7
--- /dev/null
+++ b/.github/workflows/pr_enforce_labels.yml
@@ -0,0 +1,24 @@
+name: Check PR Labels
+
+on:
+ pull_request:
+ types: [opened, edited, labeled, unlabeled, synchronize, reopened]
+
+permissions:
+ pull-requests: read
+ contents: read
+
+jobs:
+ check-label:
+ runs-on: ubuntu-24.04
+ steps:
+ - name: Check for PR labels
+ uses: actions/github-script@v7
+ with:
+ script: |
+ const labels = context.payload.pull_request.labels.map(label => label.name);
+ const requiredLabels = ['bugfix', 'enhancement', 'hardware-support', 'dependencies', 'submodules', 'github_actions', 'trunk'];
+ const hasRequiredLabel = labels.some(label => requiredLabels.includes(label));
+ if (!hasRequiredLabel) {
+ core.setFailed(`PR must have at least one of the following labels before it can be merged: ${requiredLabels.join(', ')}.`);
+ }
diff --git a/.github/workflows/release_channels.yml b/.github/workflows/release_channels.yml
index ed2de1717..e52e67227 100644
--- a/.github/workflows/release_channels.yml
+++ b/.github/workflows/release_channels.yml
@@ -20,7 +20,11 @@ jobs:
strategy:
fail-fast: false
matrix:
- series: [plucky, noble, jammy]
+ series:
+ - jammy # 22.04
+ - noble # 24.04
+ - plucky # 25.04
+ # - questing # 25.10
uses: ./.github/workflows/package_ppa.yml
with:
ppa_repo: |-
@@ -99,8 +103,9 @@ jobs:
with:
base: ${{ github.event.repository.default_branch }}
branch: create-pull-request/bump-version
+ labels: github_actions
title: Bump release version
- commit-message: automated bumps
+ commit-message: Automated version bumps
add-paths: |
version.properties
debian/changelog
diff --git a/.github/workflows/update_protobufs.yml b/.github/workflows/update_protobufs.yml
index ccdcc19ae..3952d9d02 100644
--- a/.github/workflows/update_protobufs.yml
+++ b/.github/workflows/update_protobufs.yml
@@ -34,7 +34,9 @@ jobs:
uses: peter-evans/create-pull-request@v7
with:
branch: create-pull-request/update-protobufs
+ labels: submodules
title: Update protobufs and classes
+ commit-message: Update protobufs
add-paths: |
protobufs
src/mesh
diff --git a/.trunk/trunk.yaml b/.trunk/trunk.yaml
index f0271c856..d6a8cc8c1 100644
--- a/.trunk/trunk.yaml
+++ b/.trunk/trunk.yaml
@@ -8,15 +8,15 @@ plugins:
uri: https://github.com/trunk-io/plugins
lint:
enabled:
- - checkov@3.2.450
- - renovate@41.29.1
+ - checkov@3.2.451
+ - renovate@41.38.1
- prettier@3.6.2
- - trufflehog@3.89.2
+ - trufflehog@3.90.0
- yamllint@1.37.1
- bandit@1.8.6
- trivy@0.64.1
- taplo@0.9.3
- - ruff@0.12.2
+ - ruff@0.12.4
- isort@6.0.1
- markdownlint@0.45.0
- oxipng@9.1.5
diff --git a/arch/esp32/esp32.ini b/arch/esp32/esp32.ini
index 6b9ebcb24..8990053eb 100644
--- a/arch/esp32/esp32.ini
+++ b/arch/esp32/esp32.ini
@@ -54,8 +54,8 @@ lib_deps =
h2zero/NimBLE-Arduino@^1.4.3
# renovate: datasource=git-refs depName=libpax packageName=https://github.com/dbinfrago/libpax gitBranch=master
https://github.com/dbinfrago/libpax/archive/3cdc0371c375676a97967547f4065607d4c53fd1.zip
- # renovate: datasource=custom.pio depName=XPowersLib packageName=lewisxhe/library/XPowersLib
- lewisxhe/XPowersLib@0.3.0
+ # renovate: datasource=github-tags depName=XPowersLib packageName=lewisxhe/XPowersLib
+ https://github.com/lewisxhe/XPowersLib/archive/v0.3.0.zip
# renovate: datasource=git-refs depName=meshtastic-ESP32_Codec2 packageName=https://github.com/meshtastic/ESP32_Codec2 gitBranch=master
https://github.com/meshtastic/ESP32_Codec2/archive/633326c78ac251c059ab3a8c430fcdf25b41672f.zip
# renovate: datasource=custom.pio depName=rweather/Crypto packageName=rweather/library/Crypto
diff --git a/arch/portduino/portduino.ini b/arch/portduino/portduino.ini
index 03a8a6583..693ab63b7 100644
--- a/arch/portduino/portduino.ini
+++ b/arch/portduino/portduino.ini
@@ -39,7 +39,7 @@ build_flags =
-Isrc/platform/portduino
-DRADIOLIB_EEPROM_UNSUPPORTED
-DPORTDUINO_LINUX_HARDWARE
- -DHAS_UDP_MULTICAST
+ -DHAS_UDP_MULTICAST=1
-lpthread
-lstdc++fs
-lbluetooth
diff --git a/arch/stm32/stm32.ini b/arch/stm32/stm32.ini
index be1ed662f..153ca9f3e 100644
--- a/arch/stm32/stm32.ini
+++ b/arch/stm32/stm32.ini
@@ -23,14 +23,20 @@ build_flags =
-DMESHTASTIC_EXCLUDE_SCREEN=1
-DMESHTASTIC_EXCLUDE_MQTT=1
-DMESHTASTIC_EXCLUDE_BLUETOOTH=1
- -DMESHTASTIC_EXCLUDE_GPS=1
-DMESHTASTIC_EXCLUDE_WIFI=1
-DMESHTASTIC_EXCLUDE_TZ=1 ; Exclude TZ to save some flash space.
+ -DSERIAL_RX_BUFFER_SIZE=256 ; For GPS - the default of 64 is too small.
+ -DHAS_SCREEN=0 ; Always disable screen for STM32, it is not supported.
-DPIO_FRAMEWORK_ARDUINO_NANOLIB_FLOAT_PRINTF ; This is REQUIRED for at least traceroute debug prints - without it the length ends up uninitialized.
- ;-DDEBUG_MUTE
+ -DDEBUG_MUTE ; You can #undef DEBUG_MUTE in certain source files if you need the logs.
-fmerge-all-constants
-ffunction-sections
-fdata-sections
+ -DRADIOLIB_EXCLUDE_SX128X=1
+ -DRADIOLIB_EXCLUDE_SX127X=1
+ -DRADIOLIB_EXCLUDE_LR11X0=1
+ -DHAL_DAC_MODULE_ONLY
+ -DHAL_RNG_MODULE_ENABLED
build_src_filter =
${arduino_base.build_src_filter} - - - - - - - - - - - - - -
diff --git a/bin/org.meshtastic.meshtasticd.metainfo.xml b/bin/org.meshtastic.meshtasticd.metainfo.xml
index 291fe7a7c..116155807 100644
--- a/bin/org.meshtastic.meshtasticd.metainfo.xml
+++ b/bin/org.meshtastic.meshtasticd.metainfo.xml
@@ -87,6 +87,9 @@
+
+ https://github.com/meshtastic/firmware/releases?q=tag%3Av2.7.4
+
https://github.com/meshtastic/firmware/releases?q=tag%3Av2.7.3
diff --git a/bin/platformio-custom.py b/bin/platformio-custom.py
index be2a9ab71..fc1b4bc2e 100644
--- a/bin/platformio-custom.py
+++ b/bin/platformio-custom.py
@@ -3,6 +3,7 @@
# trunk-ignore-all(flake8/F821): For SConstruct imports
import sys
from os.path import join
+import subprocess
import json
import re
@@ -92,6 +93,17 @@ prefsLoc = projenv["PROJECT_DIR"] + "/version.properties"
verObj = readProps(prefsLoc)
print("Using meshtastic platformio-custom.py, firmware version " + verObj["long"] + " on " + env.get("PIOENV"))
+# get repository owner if git is installed
+try:
+ r_owner = (
+ subprocess.check_output(["git", "config", "--get", "remote.origin.url"])
+ .decode("utf-8")
+ .strip().split("/")
+ )
+ repo_owner = r_owner[-2] + "/" + r_owner[-1].replace(".git", "")
+except subprocess.CalledProcessError:
+ repo_owner = "unknown"
+
jsonLoc = env["PROJECT_DIR"] + "/userPrefs.jsonc"
with open(jsonLoc) as f:
jsonStr = re.sub("//.*","", f.read(), flags=re.MULTILINE)
@@ -117,6 +129,7 @@ flags = [
"-DAPP_VERSION=" + verObj["long"],
"-DAPP_VERSION_SHORT=" + verObj["short"],
"-DAPP_ENV=" + env.get("PIOENV"),
+ "-DAPP_REPO=" + repo_owner,
] + pref_flags
print ("Using flags:")
diff --git a/boards/t-deck-pro.json b/boards/t-deck-pro.json
new file mode 100644
index 000000000..2f4bd594a
--- /dev/null
+++ b/boards/t-deck-pro.json
@@ -0,0 +1,43 @@
+{
+ "build": {
+ "arduino": {
+ "ldscript": "esp32s3_out.ld",
+ "memory_type": "qio_qspi",
+ "partitions": "default_16MB.csv"
+ },
+ "core": "esp32",
+ "extra_flags": [
+ "-DBOARD_HAS_PSRAM",
+ "-DARDUINO_USB_CDC_ON_BOOT=1",
+ "-DARDUINO_USB_MODE=1",
+ "-DARDUINO_RUNNING_CORE=1",
+ "-DARDUINO_EVENT_RUNNING_CORE=1"
+ ],
+ "f_cpu": "240000000L",
+ "f_flash": "80000000L",
+ "flash_mode": "qio",
+ "hwids": [["0x303A", "0x1001"]],
+ "mcu": "esp32s3",
+ "variant": "esp32s3"
+ },
+ "connectivity": ["wifi", "bluetooth", "lora"],
+ "debug": {
+ "default_tool": "esp-builtin",
+ "onboard_tools": ["esp-builtin"],
+ "openocd_target": "esp32s3.cfg"
+ },
+ "frameworks": ["arduino", "espidf"],
+ "name": "LilyGo T-Deck Pro S3 (16M Flash 8M QSPI PSRAM )",
+ "upload": {
+ "flash_size": "16MB",
+ "maximum_ram_size": 327680,
+ "maximum_size": 16777216,
+ "require_upload_port": true,
+ "speed": 921600
+ },
+ "monitor": {
+ "speed": 115200
+ },
+ "url": "https://lilygo.cc/products/t-deck-pro",
+ "vendor": "LilyGo"
+}
diff --git a/debian/changelog b/debian/changelog
index b5009028a..02a32f2f1 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,4 +1,4 @@
-meshtasticd (2.7.3.0) UNRELEASED; urgency=medium
+meshtasticd (2.7.4.0) UNRELEASED; urgency=medium
[ Austin Lane ]
* Initial packaging
@@ -31,4 +31,7 @@ meshtasticd (2.7.3.0) UNRELEASED; urgency=medium
[ Ubuntu ]
* GitHub Actions Automatic version bump
- -- Ubuntu Thu, 10 Jul 2025 16:29:27 +0000
+ [ ]
+ * GitHub Actions Automatic version bump
+
+ -- Sat, 19 Jul 2025 11:36:55 +0000
diff --git a/platformio.ini b/platformio.ini
index b1f89e5b4..c0eb6fedb 100644
--- a/platformio.ini
+++ b/platformio.ini
@@ -6,7 +6,9 @@ default_envs = tbeam
extra_configs =
arch/*/*.ini
- variants/*/platformio.ini
+ variants/*/platformio.ini ; Remove when all variants migrated to new dir structure
+ variants/*/*/platformio.ini
+ variants/*/diy/*/platformio.ini
src/graphics/niche/InkHUD/PlatformioConfig.ini
description = Meshtastic
diff --git a/protobufs b/protobufs
index 584f0a3a3..fa02e14d8 160000
--- a/protobufs
+++ b/protobufs
@@ -1 +1 @@
-Subproject commit 584f0a3a359103acf0bfce506c1b1fc32c639841
+Subproject commit fa02e14d8d01850336eaea0e9552aef4f08f0a40
diff --git a/src/Power.cpp b/src/Power.cpp
index 9c67977bd..298f08e0d 100644
--- a/src/Power.cpp
+++ b/src/Power.cpp
@@ -120,6 +120,15 @@ NullSensor max17048Sensor;
RAK9154Sensor rak9154Sensor;
#endif
+#ifdef HAS_PPM
+// note: XPOWERS_CHIP_XXX must be defined in variant.h
+#include
+#endif
+
+#ifdef HAS_BQ27220
+#include "bq27220.h"
+#endif
+
#ifdef HAS_PMU
XPowersLibInterface *PMU = NULL;
#else
@@ -665,6 +674,8 @@ bool Power::setup()
found = true;
} else if (lipoInit()) {
found = true;
+ } else if (lipoChargerInit()) {
+ found = true;
} else if (analogInit()) {
found = true;
}
@@ -681,7 +692,16 @@ bool Power::setup()
void Power::shutdown()
{
- LOG_INFO("Shutting Down");
+
+#if HAS_SCREEN
+ if (screen) {
+ screen->showSimpleBanner("Shutting Down...", 0); // stays on screen
+ }
+#endif
+#if !defined(ARCH_STM32WL)
+ playShutdownMelody();
+#endif
+ nodeDB->saveToDisk();
#if defined(ARCH_NRF52) || defined(ARCH_ESP32) || defined(ARCH_RP2040)
#ifdef PIN_LED1
@@ -693,7 +713,11 @@ void Power::shutdown()
#ifdef PIN_LED3
ledOff(PIN_LED3);
#endif
- doDeepSleep(DELAY_FOREVER, false, false);
+ doDeepSleep(DELAY_FOREVER, false, true);
+#elif defined(ARCH_PORTDUINO)
+ exit(EXIT_SUCCESS);
+#else
+ LOG_WARN("FIXME implement shutdown for this platform");
#endif
}
@@ -1237,3 +1261,144 @@ bool Power::lipoInit()
return false;
}
#endif
+
+#if defined(HAS_PPM) && HAS_PPM
+
+/**
+ * Adapter class for BQ25896/BQ27220 Lipo battery charger.
+ */
+class LipoCharger : public HasBatteryLevel
+{
+ private:
+ XPowersPPM *ppm = nullptr;
+ BQ27220 *bq = nullptr;
+
+ public:
+ /**
+ * Init the I2C BQ25896 Lipo battery charger
+ */
+ bool runOnce()
+ {
+ if (ppm == nullptr) {
+ ppm = new XPowersPPM;
+ bool result = ppm->init(Wire, I2C_SDA, I2C_SCL, BQ25896_ADDR);
+ if (result) {
+ LOG_INFO("PPM BQ25896 init succeeded");
+ // Set the minimum operating voltage. Below this voltage, the PPM will protect
+ // ppm->setSysPowerDownVoltage(3100);
+
+ // Set input current limit, default is 500mA
+ // ppm->setInputCurrentLimit(800);
+
+ // Disable current limit pin
+ // ppm->disableCurrentLimitPin();
+
+ // Set the charging target voltage, Range:3840 ~ 4608mV ,step:16 mV
+ ppm->setChargeTargetVoltage(4288);
+
+ // Set the precharge current , Range: 64mA ~ 1024mA ,step:64mA
+ // ppm->setPrechargeCurr(64);
+
+ // The premise is that limit pin is disabled, or it will
+ // only follow the maximum charging current set by limit pin.
+ // Set the charging current , Range:0~5056mA ,step:64mA
+ ppm->setChargerConstantCurr(1024);
+
+ // To obtain voltage data, the ADC must be enabled first
+ ppm->enableMeasure();
+
+ // Turn on charging function
+ // If there is no battery connected, do not turn on the charging function
+ ppm->enableCharge();
+ } else {
+ LOG_WARN("PPM BQ25896 init failed");
+ delete ppm;
+ ppm = nullptr;
+ return false;
+ }
+ }
+ if (bq == nullptr) {
+ bq = new BQ27220;
+ bq->setDefaultCapacity(BQ27220_DESIGN_CAPACITY);
+
+ bool result = bq->init();
+ if (result) {
+ LOG_DEBUG("BQ27220 design capacity: %d", bq->getDesignCapacity());
+ LOG_DEBUG("BQ27220 fullCharge capacity: %d", bq->getFullChargeCapacity());
+ LOG_DEBUG("BQ27220 remaining capacity: %d", bq->getRemainingCapacity());
+ return true;
+ } else {
+ LOG_WARN("BQ27220 init failed");
+ delete bq;
+ bq = nullptr;
+ return false;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Battery state of charge, from 0 to 100 or -1 for unknown
+ */
+ virtual int getBatteryPercent() override
+ {
+ return -1;
+ // return bq->getChargePercent(); // don't use BQ27220 for battery percent, it is not calibrated
+ }
+
+ /**
+ * The raw voltage of the battery in millivolts, or NAN if unknown
+ */
+ virtual uint16_t getBattVoltage() override { return bq->getVoltage(); }
+
+ /**
+ * return true if there is a battery installed in this unit
+ */
+ virtual bool isBatteryConnect() override { return ppm->getBattVoltage() > 0; }
+
+ /**
+ * return true if there is an external power source detected
+ */
+ virtual bool isVbusIn() override { return ppm->getVbusVoltage() > 0; }
+
+ /**
+ * return true if the battery is currently charging
+ */
+ virtual bool isCharging() override
+ {
+ bool isCharging = ppm->isCharging();
+ if (isCharging) {
+ LOG_DEBUG("BQ27220 time to full charge: %d min", bq->getTimeToFull());
+ } else {
+ if (!ppm->isVbusIn()) {
+ LOG_DEBUG("BQ27220 time to empty: %d min (%d mAh)", bq->getTimeToEmpty(), bq->getRemainingCapacity());
+ }
+ }
+ return isCharging;
+ }
+};
+
+LipoCharger lipoCharger;
+
+/**
+ * Init the Lipo battery charger
+ */
+bool Power::lipoChargerInit()
+{
+ bool result = lipoCharger.runOnce();
+ LOG_DEBUG("Power::lipoChargerInit lipo sensor is %s", result ? "ready" : "not ready yet");
+ if (!result)
+ return false;
+ batteryLevel = &lipoCharger;
+ return true;
+}
+
+#else
+/**
+ * The Lipo battery level sensor is unavailable - default to AnalogBatteryLevel
+ */
+bool Power::lipoChargerInit()
+{
+ return false;
+}
+#endif
diff --git a/src/buzz/BuzzerFeedbackThread.cpp b/src/buzz/BuzzerFeedbackThread.cpp
index 2bd3158a3..ce762c764 100644
--- a/src/buzz/BuzzerFeedbackThread.cpp
+++ b/src/buzz/BuzzerFeedbackThread.cpp
@@ -47,10 +47,6 @@ int BuzzerFeedbackThread::handleInputEvent(const InputEvent *event)
playComboTune(); // Ping sent feedback
break;
- case INPUT_BROKER_SHUTDOWN:
- playShutdownMelody(); // Shutdown feedback
- break;
-
default:
// For other events, check if it's a printable character
if (event->kbchar >= 32 && event->kbchar <= 126) {
@@ -69,10 +65,7 @@ int32_t BuzzerFeedbackThread::runOnce()
// This thread is primarily event-driven, but we can use runOnce
// for any periodic tasks if needed in the future
- if (needsUpdate) {
- needsUpdate = false;
- // Could add any periodic processing here
- }
+ needsUpdate = false;
// Run every 100ms when active, less frequently when idle
return needsUpdate ? 100 : 1000;
diff --git a/src/configuration.h b/src/configuration.h
index cddc7ba7a..0e24990b5 100644
--- a/src/configuration.h
+++ b/src/configuration.h
@@ -150,11 +150,12 @@ along with this program. If not, see .
// Define if screen should be mirrored left to right
// #define SCREEN_MIRROR
-// I2C Keyboards (M5Stack, RAK14004, T-Deck)
+// I2C Keyboards (M5Stack, RAK14004, T-Deck, T-Deck Pro, T-Lora Pager, CardKB, BBQ10, MPR121, TCA8418)
#define CARDKB_ADDR 0x5F
#define TDECK_KB_ADDR 0x55
#define BBQ10_KB_ADDR 0x1F
#define MPR121_KB_ADDR 0x5A
+#define TCA8418_KB_ADDR 0x34
// -----------------------------------------------------------------------------
// SENSOR
@@ -193,8 +194,11 @@ along with this program. If not, see .
#define MLX90614_ADDR_DEF 0x5A
#define CGRADSENS_ADDR 0x66
#define LTR390UV_ADDR 0x53
-#define XPOWERS_AXP192_AXP2101_ADDRESS 0x34 // same adress as TCA8418
+#define XPOWERS_AXP192_AXP2101_ADDRESS 0x34 // same adress as TCA8418_KB
#define PCT2075_ADDR 0x37
+#define BQ27220_ADDR 0x55 // same address as TDECK_KB
+#define BQ25896_ADDR 0x6B
+#define LTR553ALS_ADDR 0x23
// -----------------------------------------------------------------------------
// ACCELEROMETER
@@ -208,6 +212,7 @@ along with this program. If not, see .
#define BMX160_ADDR 0x69
#define ICM20948_ADDR 0x69
#define ICM20948_ADDR_ALT 0x68
+#define BHI260AP_ADDR 0x28
#define BMM150_ADDR 0x13
// -----------------------------------------------------------------------------
@@ -230,6 +235,7 @@ along with this program. If not, see .
// Touchscreen
// -----------------------------------------------------------------------------
#define FT6336U_ADDR 0x48
+#define CST328_ADDR 0x1A
// -----------------------------------------------------------------------------
// RAK12035VB Soil Monitor (using RAK12023 up to 3 RAK12035 monitors can be connected)
diff --git a/src/detect/ScanI2C.h b/src/detect/ScanI2C.h
index dd290db98..c1358861b 100644
--- a/src/detect/ScanI2C.h
+++ b/src/detect/ScanI2C.h
@@ -74,7 +74,12 @@ class ScanI2C
RAK12035,
TCA8418KB,
PCT2075,
- BMM150,
+ CST328,
+ BQ25896,
+ BQ27220,
+ LTR553ALS,
+ BHI260AP,
+ BMM150
} DeviceType;
// typedef uint8_t DeviceAddress;
diff --git a/src/detect/ScanI2CTwoWire.cpp b/src/detect/ScanI2CTwoWire.cpp
index 9e9441123..652d50d51 100644
--- a/src/detect/ScanI2CTwoWire.cpp
+++ b/src/detect/ScanI2CTwoWire.cpp
@@ -206,7 +206,17 @@ void ScanI2CTwoWire::scanPort(I2CPort port, uint8_t *address, uint8_t asize)
}
break;
- SCAN_SIMPLE_CASE(TDECK_KB_ADDR, TDECKKB, "T-Deck keyboard", (uint8_t)addr.address);
+ case TDECK_KB_ADDR:
+ // Do we have the T-Deck keyboard or the T-Deck Pro battery sensor?
+ registerValue = getRegisterValue(ScanI2CTwoWire::RegisterLocation(addr, 0x04), 1);
+ if (registerValue != 0) {
+ logFoundDevice("BQ27220", (uint8_t)addr.address);
+ type = BQ27220;
+ } else {
+ logFoundDevice("TDECKKB", (uint8_t)addr.address);
+ type = TDECKKB;
+ }
+ break;
SCAN_SIMPLE_CASE(BBQ10_KB_ADDR, BBQ10KB, "BB Q10", (uint8_t)addr.address);
SCAN_SIMPLE_CASE(ST7567_ADDRESS, SCREEN_ST7567, "ST7567", (uint8_t)addr.address);
@@ -396,6 +406,12 @@ void ScanI2CTwoWire::scanPort(I2CPort port, uint8_t *address, uint8_t asize)
logFoundDevice("BQ24295", (uint8_t)addr.address);
break;
}
+ registerValue = getRegisterValue(ScanI2CTwoWire::RegisterLocation(addr, 0x14), 1); // get ID
+ if ((registerValue & 0b00000011) == 0b00000010) {
+ type = BQ25896;
+ logFoundDevice("BQ25896", (uint8_t)addr.address);
+ break;
+ }
registerValue = getRegisterValue(ScanI2CTwoWire::RegisterLocation(addr, 0x0F), 1); // get ID
if (registerValue == 0x6A) {
type = LSM6DS3;
@@ -447,6 +463,9 @@ void ScanI2CTwoWire::scanPort(I2CPort port, uint8_t *address, uint8_t asize)
SCAN_SIMPLE_CASE(DFROBOT_RAIN_ADDR, DFROBOT_RAIN, "DFRobot Rain Gauge", (uint8_t)addr.address);
SCAN_SIMPLE_CASE(LTR390UV_ADDR, LTR390UV, "LTR390UV", (uint8_t)addr.address);
SCAN_SIMPLE_CASE(PCT2075_ADDR, PCT2075, "PCT2075", (uint8_t)addr.address);
+ SCAN_SIMPLE_CASE(CST328_ADDR, CST328, "CST328", (uint8_t)addr.address);
+ SCAN_SIMPLE_CASE(LTR553ALS_ADDR, LTR553ALS, "LTR553ALS", (uint8_t)addr.address);
+ SCAN_SIMPLE_CASE(BHI260AP_ADDR, BHI260AP, "BHI260AP", (uint8_t)addr.address);
SCAN_SIMPLE_CASE(SCD4X_ADDR, SCD4X, "SCD4X", (uint8_t)addr.address);
SCAN_SIMPLE_CASE(BMM150_ADDR, BMM150, "BMM150", (uint8_t)addr.address);
#ifdef HAS_TPS65233
diff --git a/src/gps/GPS.cpp b/src/gps/GPS.cpp
index 345c738d6..3a6b19f64 100644
--- a/src/gps/GPS.cpp
+++ b/src/gps/GPS.cpp
@@ -39,9 +39,9 @@ template std::size_t array_count(const T (&)[N])
return N;
}
-#if defined(NRF52840_XXAA) || defined(NRF52833_XXAA) || defined(ARCH_ESP32) || defined(ARCH_PORTDUINO)
-#if defined(RAK2560)
-HardwareSerial *GPS::_serial_gps = &Serial2;
+#if defined(NRF52840_XXAA) || defined(NRF52833_XXAA) || defined(ARCH_ESP32) || defined(ARCH_PORTDUINO) || defined(ARCH_STM32WL)
+#if defined(GPS_SERIAL_PORT)
+HardwareSerial *GPS::_serial_gps = &GPS_SERIAL_PORT;
#else
HardwareSerial *GPS::_serial_gps = &Serial1;
#endif
diff --git a/src/gps/RTC.cpp b/src/gps/RTC.cpp
index 5054be3f0..d574c9ad0 100644
--- a/src/gps/RTC.cpp
+++ b/src/gps/RTC.cpp
@@ -226,7 +226,14 @@ RTCSetResult perhapsSetRTC(RTCQuality q, struct tm &t)
time_t res = gm_mktime(&t);
struct timeval tv;
tv.tv_sec = res;
- tv.tv_usec = 0; // time.centisecond() * (10 / 1000);
+ tv.tv_usec = 0; // time.centisecond() * (10 / 1000);
+ uint32_t printableEpoch = tv.tv_sec; // Print lib only supports 32 bit but time_t can be 64 bit on some platforms
+#ifdef BUILD_EPOCH
+ if (tv.tv_sec < BUILD_EPOCH) {
+ LOG_WARN("Ignore time (%ld) before build epoch (%ld)!", printableEpoch, BUILD_EPOCH);
+ return RTCSetResultInvalidTime;
+ }
+#endif
// LOG_DEBUG("Got time from GPS month=%d, year=%d, unixtime=%ld", t.tm_mon, t.tm_year, tv.tv_sec);
if (t.tm_year < 0 || t.tm_year >= 300) {
diff --git a/src/graphics/EInkDisplay2.cpp b/src/graphics/EInkDisplay2.cpp
index 66c7938b5..3bd20feec 100644
--- a/src/graphics/EInkDisplay2.cpp
+++ b/src/graphics/EInkDisplay2.cpp
@@ -206,7 +206,7 @@ bool EInkDisplay::connect()
adafruitDisplay->setRotation(0);
adafruitDisplay->setPartialWindow(0, 0, EINK_WIDTH, EINK_HEIGHT);
}
-#elif defined(M5_COREINK)
+#elif defined(M5_COREINK) || defined(T_DECK_PRO)
auto lowLevel = new EINK_DISPLAY_MODEL(PIN_EINK_CS, PIN_EINK_DC, PIN_EINK_RES, PIN_EINK_BUSY);
adafruitDisplay = new GxEPD2_BW(*lowLevel);
adafruitDisplay->init(115200, true, 40, false, SPI, SPISettings(4000000, MSBFIRST, SPI_MODE0));
diff --git a/src/graphics/Screen.cpp b/src/graphics/Screen.cpp
index 1f2e7e4d9..f22a0d8a8 100644
--- a/src/graphics/Screen.cpp
+++ b/src/graphics/Screen.cpp
@@ -386,9 +386,7 @@ void Screen::handleSetOn(bool on, FrameCallback einkScreensaver)
#ifdef T_WATCH_S3
PMU->enablePowerOutput(XPOWERS_ALDO2);
#endif
-#ifdef HELTEC_TRACKER_V1_X
- uint8_t tft_vext_enabled = digitalRead(VEXT_ENABLE);
-#endif
+
#if !ARCH_PORTDUINO
dispdev->displayOn();
#endif
@@ -400,10 +398,7 @@ void Screen::handleSetOn(bool on, FrameCallback einkScreensaver)
dispdev->displayOn();
#ifdef HELTEC_TRACKER_V1_X
- // If the TFT VEXT power is not enabled, initialize the UI.
- if (!tft_vext_enabled) {
- ui->init();
- }
+ ui->init();
#endif
#ifdef USE_ST7789
pinMode(VTFT_CTRL, OUTPUT);
@@ -584,7 +579,7 @@ void Screen::setup()
touchScreenImpl1->init();
}
}
-#elif HAS_TOUCHSCREEN
+#elif HAS_TOUCHSCREEN && !defined(USE_EINK)
touchScreenImpl1 =
new TouchScreenImpl1(dispdev->getWidth(), dispdev->getHeight(), static_cast(dispdev)->getTouch);
touchScreenImpl1->init();
@@ -869,6 +864,8 @@ void Screen::setFrames(FrameFocus focus)
uint8_t previousFrameCount = framesetInfo.frameCount;
FramesetInfo fsi; // Location of specific frames, for applying focus parameter
+ graphics::UIRenderer::rebuildFavoritedNodes();
+
LOG_DEBUG("Show standard frames");
showingNormalScreen = true;
@@ -1004,7 +1001,7 @@ void Screen::setFrames(FrameFocus focus)
// Insert favorite frames *after* collecting them all
if (!favoriteFrames.empty()) {
fsi.positions.firstFavorite = numframes;
- for (auto &f : favoriteFrames) {
+ for (const auto &f : favoriteFrames) {
normalFrames[numframes++] = f;
indicatorIcons.push_back(icon_node);
}
@@ -1379,9 +1376,12 @@ int Screen::handleInputEvent(const InputEvent *event)
menuHandler::clockMenu();
} else if (this->ui->getUiState()->currentFrame == framesetInfo.positions.lora) {
menuHandler::LoraRegionPicker();
- } else if (this->ui->getUiState()->currentFrame == framesetInfo.positions.textMessage &&
- devicestate.rx_text_message.from) {
- menuHandler::messageResponseMenu();
+ } else if (this->ui->getUiState()->currentFrame == framesetInfo.positions.textMessage) {
+ if (devicestate.rx_text_message.from) {
+ menuHandler::messageResponseMenu();
+ } else {
+ menuHandler::textMessageBaseMenu();
+ }
} else if (framesetInfo.positions.firstFavorite != 255 &&
this->ui->getUiState()->currentFrame >= framesetInfo.positions.firstFavorite &&
this->ui->getUiState()->currentFrame <= framesetInfo.positions.lastFavorite) {
diff --git a/src/graphics/SharedUIDisplay.cpp b/src/graphics/SharedUIDisplay.cpp
index 7cd876ac5..b458e54e4 100644
--- a/src/graphics/SharedUIDisplay.cpp
+++ b/src/graphics/SharedUIDisplay.cpp
@@ -206,7 +206,7 @@ void drawCommonHeader(OLEDDisplay *display, int16_t x, int16_t y, const char *ti
timeX = screenW - xOffset - timeStrWidth + 3;
// === Show Mail or Mute Icon to the Left of Time ===
- int iconRightEdge = timeX - 1;
+ int iconRightEdge = timeX - 2;
bool showMail = false;
diff --git a/src/graphics/draw/ClockRenderer.cpp b/src/graphics/draw/ClockRenderer.cpp
index 8d7e91000..08466662c 100644
--- a/src/graphics/draw/ClockRenderer.cpp
+++ b/src/graphics/draw/ClockRenderer.cpp
@@ -186,7 +186,7 @@ void drawDigitalClockFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int1
{
display->clear();
display->setTextAlignment(TEXT_ALIGN_LEFT);
- int line = 1;
+
// === Set Title, Blank for Clock
const char *titleStr = "";
// === Header ===
@@ -218,7 +218,6 @@ void drawDigitalClockFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int1
hour %= 12;
if (hour == 0)
hour = 12;
- bool isPM = hour >= 12;
snprintf(timeString, sizeof(timeString), "%d:%02d", hour, minute);
} else {
snprintf(timeString, sizeof(timeString), "%02d:%02d", hour, minute);
@@ -230,6 +229,8 @@ void drawDigitalClockFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int1
#ifdef T_WATCH_S3
float scale = 1.5;
+#elif defined(CHATTER_2)
+ float scale = 1.1;
#else
float scale = 0.75;
if (isHighResolution) {
@@ -285,6 +286,9 @@ void drawDigitalClockFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int1
int yOffset = (isHighResolution) ? 3 : 1;
#ifdef SENSECAP_INDICATOR
yOffset -= 3;
+#endif
+#ifdef T_DECK
+ yOffset -= 5;
#endif
if (config.display.use_12h_clock) {
display->drawString(startingHourMinuteTextX + xOffset, (display->getHeight() - hourMinuteTextY) - yOffset - 2,
@@ -362,7 +366,7 @@ void drawAnalogClockFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16
// hour hand radius and y coordinate
int16_t hourHandRadius = radius * 0.35;
if (isHighResolution) {
- int16_t hourHandRadius = radius * 0.55;
+ hourHandRadius = radius * 0.55;
}
int16_t hourHandNoonY = centerY - hourHandRadius;
@@ -381,7 +385,7 @@ void drawAnalogClockFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16
bool isPM = hour >= 12;
if (config.display.use_12h_clock) {
- bool isPM = hour >= 12;
+ isPM = hour >= 12;
display->setFont(FONT_SMALL);
int yOffset = isHighResolution ? 1 : 0;
#ifdef USE_EINK
diff --git a/src/graphics/draw/DebugRenderer.cpp b/src/graphics/draw/DebugRenderer.cpp
index b1a901f99..5420d1b4b 100644
--- a/src/graphics/draw/DebugRenderer.cpp
+++ b/src/graphics/draw/DebugRenderer.cpp
@@ -483,7 +483,7 @@ void drawLoRaFocused(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x,
}
// ****************************
-// * Memory Screen *
+// * System Screen *
// ****************************
void drawMemoryUsage(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y)
{
@@ -593,7 +593,19 @@ void drawMemoryUsage(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x,
}
line += 1;
char appversionstr[35];
- snprintf(appversionstr, sizeof(appversionstr), "Ver.: %s", optstr(APP_VERSION));
+ snprintf(appversionstr, sizeof(appversionstr), "Ver: %s", optstr(APP_VERSION));
+ char appversionstr_formatted[40];
+ char *lastDot = strrchr(appversionstr, '.');
+ if (lastDot) {
+ size_t prefixLen = lastDot - appversionstr;
+ strncpy(appversionstr_formatted, appversionstr, prefixLen);
+ appversionstr_formatted[prefixLen] = '\0';
+ strncat(appversionstr_formatted, " (", sizeof(appversionstr_formatted) - strlen(appversionstr_formatted) - 1);
+ strncat(appversionstr_formatted, lastDot + 1, sizeof(appversionstr_formatted) - strlen(appversionstr_formatted) - 1);
+ strncat(appversionstr_formatted, ")", sizeof(appversionstr_formatted) - strlen(appversionstr_formatted) - 1);
+ strncpy(appversionstr, appversionstr_formatted, sizeof(appversionstr) - 1);
+ appversionstr[sizeof(appversionstr) - 1] = '\0';
+ }
int textWidth = display->getStringWidth(appversionstr);
int nameX = (SCREEN_WIDTH - textWidth) / 2;
display->drawString(nameX, getTextPositions(display)[line], appversionstr);
diff --git a/src/graphics/draw/MenuHandler.cpp b/src/graphics/draw/MenuHandler.cpp
index f6b250ebc..83198a7c5 100644
--- a/src/graphics/draw/MenuHandler.cpp
+++ b/src/graphics/draw/MenuHandler.cpp
@@ -344,14 +344,37 @@ void menuHandler::homeBaseMenu()
screen->showOverlayBanner(bannerOptions);
}
+void menuHandler::textMessageBaseMenu()
+{
+ enum optionsNumbers { Back, Preset, Freetext, enumEnd };
+
+ static const char *optionsArray[enumEnd] = {"Back"};
+ static int optionsEnumArray[enumEnd] = {Back};
+ int options = 1;
+ optionsArray[options] = "New Preset Msg";
+ optionsEnumArray[options++] = Preset;
+ if (kb_found) {
+ optionsArray[options] = "New Freetext Msg";
+ optionsEnumArray[options++] = Freetext;
+ }
+
+ BannerOverlayOptions bannerOptions;
+ bannerOptions.message = "Message Action";
+ bannerOptions.optionsArrayPtr = optionsArray;
+ bannerOptions.optionsEnumPtr = optionsEnumArray;
+ bannerOptions.optionsCount = options;
+ bannerOptions.bannerCallback = [](int selected) -> void {
+ if (selected == Preset) {
+ cannedMessageModule->LaunchWithDestination(NODENUM_BROADCAST);
+ } else if (selected == Freetext) {
+ cannedMessageModule->LaunchFreetextWithDestination(NODENUM_BROADCAST);
+ }
+ };
+ screen->showOverlayBanner(bannerOptions);
+}
+
void menuHandler::systemBaseMenu()
{
- // Check if brightness is supported
- bool hasSupportBrightness = false;
-#if defined(ST7789_CS) || defined(USE_OLED) || defined(USE_SSD1306) || defined(USE_SH1106) || defined(USE_SH1107) || HAS_TFT
- hasSupportBrightness = true;
-#endif
-
enum optionsNumbers { Back, Notifications, ScreenOptions, PowerMenu, Test, enumEnd };
static const char *optionsArray[enumEnd] = {"Back"};
static int optionsEnumArray[enumEnd] = {Back};
@@ -421,11 +444,11 @@ void menuHandler::favoriteBaseMenu()
bannerOptions.optionsEnumPtr = optionsEnumArray;
bannerOptions.optionsCount = options;
bannerOptions.bannerCallback = [](int selected) -> void {
- if (selected == 1) {
+ if (selected == Preset) {
cannedMessageModule->LaunchWithDestination(graphics::UIRenderer::currentFavoriteNodeNum);
- } else if (selected == 2 && kb_found) {
+ } else if (selected == Freetext) {
cannedMessageModule->LaunchFreetextWithDestination(graphics::UIRenderer::currentFavoriteNodeNum);
- } else if ((!kb_found && selected == 2) || (selected == 3 && kb_found)) {
+ } else if (selected == Remove) {
menuHandler::menuQueue = menuHandler::remove_favorite;
screen->runNow();
}
@@ -678,6 +701,7 @@ void menuHandler::TFTColorPickerMenu(OLEDDisplay *display)
bannerOptions.optionsArrayPtr = optionsArray;
bannerOptions.optionsCount = 10;
bannerOptions.bannerCallback = [display](int selected) -> void {
+#if defined(HELTEC_MESH_NODE_T114) || defined(HELTEC_VISION_MASTER_T190) || defined(T_DECK) || HAS_TFT
uint8_t TFT_MESH_r = 0;
uint8_t TFT_MESH_g = 0;
uint8_t TFT_MESH_b = 0;
@@ -729,7 +753,6 @@ void menuHandler::TFTColorPickerMenu(OLEDDisplay *display)
screen->runNow();
}
-#if defined(HELTEC_MESH_NODE_T114) || defined(HELTEC_VISION_MASTER_T190) || HAS_TFT
if (selected != 0) {
display->setColor(BLACK);
display->fillRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
@@ -792,9 +815,8 @@ void menuHandler::shutdownMenu()
bannerOptions.optionsCount = 2;
bannerOptions.bannerCallback = [](int selected) -> void {
if (selected == 1) {
- IF_SCREEN(screen->showSimpleBanner("Shutting Down...", 0));
- nodeDB->saveToDisk();
- power->shutdown();
+ InputEvent event = {.inputEvent = (input_broker_event)INPUT_BROKER_SHUTDOWN, .kbchar = 0, .touchX = 0, .touchY = 0};
+ inputBroker->injectInputEvent(&event);
} else {
menuQueue = power_menu;
screen->runNow();
@@ -827,8 +849,9 @@ void menuHandler::removeFavoriteMenu()
bannerOptions.optionsCount = 2;
bannerOptions.bannerCallback = [](int selected) -> void {
if (selected == 1) {
+ LOG_INFO("Removing %x as favorite node", graphics::UIRenderer::currentFavoriteNodeNum);
nodeDB->set_favorite(false, graphics::UIRenderer::currentFavoriteNodeNum);
- screen->setFrames(graphics::Screen::FOCUS_PRESERVE);
+ screen->setFrames(graphics::Screen::FOCUS_DEFAULT);
}
};
screen->showOverlayBanner(bannerOptions);
@@ -924,23 +947,28 @@ void menuHandler::screenOptionsMenu()
{
// Check if brightness is supported
bool hasSupportBrightness = false;
-#if defined(ST7789_CS) || defined(USE_OLED) || defined(USE_SSD1306) || defined(USE_SH1106) || defined(USE_SH1107) || HAS_TFT
+#if defined(ST7789_CS) || defined(USE_OLED) || defined(USE_SSD1306) || defined(USE_SH1106) || defined(USE_SH1107)
hasSupportBrightness = true;
#endif
+#if defined(T_DECK)
+ // TDeck Doesn't seem to support brightness at all, at least not reliably
+ hasSupportBrightness = false;
+#endif
+
enum optionsNumbers { Back, Brightness, ScreenColor };
static const char *optionsArray[4] = {"Back"};
static int optionsEnumArray[4] = {Back};
int options = 1;
// Only show brightness for B&W displays
- if (hasSupportBrightness && !HAS_TFT) {
+ if (hasSupportBrightness) {
optionsArray[options] = "Brightness";
optionsEnumArray[options++] = Brightness;
}
// Only show screen color for TFT displays
-#if defined(HELTEC_MESH_NODE_T114) || defined(HELTEC_VISION_MASTER_T190) || HAS_TFT
+#if defined(HELTEC_MESH_NODE_T114) || defined(HELTEC_VISION_MASTER_T190) || defined(T_DECK) || HAS_TFT
optionsArray[options] = "Screen Color";
optionsEnumArray[options++] = ScreenColor;
#endif
diff --git a/src/graphics/draw/MenuHandler.h b/src/graphics/draw/MenuHandler.h
index 2273dbbed..1f989be79 100644
--- a/src/graphics/draw/MenuHandler.h
+++ b/src/graphics/draw/MenuHandler.h
@@ -48,6 +48,7 @@ class menuHandler
static void ClockFacePicker();
static void messageResponseMenu();
static void homeBaseMenu();
+ static void textMessageBaseMenu();
static void systemBaseMenu();
static void favoriteBaseMenu();
static void positionBaseMenu();
diff --git a/src/graphics/draw/NotificationRenderer.cpp b/src/graphics/draw/NotificationRenderer.cpp
index 7350c204f..d9cf280ac 100644
--- a/src/graphics/draw/NotificationRenderer.cpp
+++ b/src/graphics/draw/NotificationRenderer.cpp
@@ -156,7 +156,7 @@ void NotificationRenderer::drawNumberPicker(OLEDDisplay *display, OLEDDisplayUiS
resetBanner();
return;
}
- if (curSelected == numDigits) {
+ if (curSelected == static_cast(numDigits)) {
alertBannerCallback(currentNumber);
resetBanner();
return;
diff --git a/src/graphics/draw/UIRenderer.cpp b/src/graphics/draw/UIRenderer.cpp
index 9be8b04f4..71d92616f 100644
--- a/src/graphics/draw/UIRenderer.cpp
+++ b/src/graphics/draw/UIRenderer.cpp
@@ -24,6 +24,23 @@ extern graphics::Screen *screen;
namespace graphics
{
NodeNum UIRenderer::currentFavoriteNodeNum = 0;
+std::vector graphics::UIRenderer::favoritedNodes;
+
+void graphics::UIRenderer::rebuildFavoritedNodes()
+{
+ favoritedNodes.clear();
+ size_t total = nodeDB->getNumMeshNodes();
+ for (size_t i = 0; i < total; i++) {
+ meshtastic_NodeInfoLite *n = nodeDB->getMeshNodeByIndex(i);
+ if (!n || n->num == nodeDB->getNodeNum())
+ continue;
+ if (n->is_favorite)
+ favoritedNodes.push_back(n);
+ }
+
+ std::sort(favoritedNodes.begin(), favoritedNodes.end(),
+ [](const meshtastic_NodeInfoLite *a, const meshtastic_NodeInfoLite *b) { return a->num < b->num; });
+}
#if !MESHTASTIC_EXCLUDE_GPS
// GeoCoord object for coordinate conversions
@@ -201,27 +218,7 @@ void UIRenderer::drawNodes(OLEDDisplay *display, int16_t x, int16_t y, const mes
// **********************
void UIRenderer::drawNodeInfo(OLEDDisplay *display, const OLEDDisplayUiState *state, int16_t x, int16_t y)
{
- // --- Cache favorite nodes for the current frame only, to save computation ---
- static std::vector favoritedNodes;
- static int prevFrame = -1;
- // --- Only rebuild favorites list if we're on a new frame ---
- if (state->currentFrame != prevFrame) {
- prevFrame = state->currentFrame;
- favoritedNodes.clear();
- size_t total = nodeDB->getNumMeshNodes();
- for (size_t i = 0; i < total; i++) {
- meshtastic_NodeInfoLite *n = nodeDB->getMeshNodeByIndex(i);
- // Skip nulls and ourself
- if (!n || n->num == nodeDB->getNodeNum())
- continue;
- if (n->is_favorite)
- favoritedNodes.push_back(n);
- }
- // Keep a stable, consistent display order
- std::sort(favoritedNodes.begin(), favoritedNodes.end(),
- [](const meshtastic_NodeInfoLite *a, const meshtastic_NodeInfoLite *b) { return a->num < b->num; });
- }
if (favoritedNodes.empty())
return;
@@ -657,7 +654,7 @@ void UIRenderer::drawDeviceFocused(OLEDDisplay *display, OLEDDisplayUiState *sta
char combinedName[50];
snprintf(combinedName, sizeof(combinedName), "%s (%s)", longNameStr.empty() ? "" : longNameStr.c_str(), shortnameble);
- if (SCREEN_WIDTH - (display->getStringWidth(longName) + display->getStringWidth(shortnameble)) > 10) {
+ if (SCREEN_WIDTH - (display->getStringWidth(combinedName)) > 10) {
size_t len = strlen(combinedName);
if (len >= 3 && strcmp(combinedName + len - 3, " ()") == 0) {
combinedName[len - 3] = '\0'; // Remove the last three characters
@@ -668,7 +665,7 @@ void UIRenderer::drawDeviceFocused(OLEDDisplay *display, OLEDDisplayUiState *sta
nameX, ((rows == 4) ? getTextPositions(display)[line++] : getTextPositions(display)[line++]) + yOffset, combinedName);
} else {
// === LongName Centered ===
- textWidth = display->getStringWidth(longName);
+ textWidth = display->getStringWidth(longNameStr.c_str());
nameX = (SCREEN_WIDTH - textWidth) / 2;
display->drawString(nameX, getTextPositions(display)[line++], longNameStr.c_str());
diff --git a/src/graphics/draw/UIRenderer.h b/src/graphics/draw/UIRenderer.h
index 9e5e8c4b4..3c8e1dd9d 100644
--- a/src/graphics/draw/UIRenderer.h
+++ b/src/graphics/draw/UIRenderer.h
@@ -61,6 +61,8 @@ class UIRenderer
static void drawCompassAndLocationScreen(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y);
static NodeNum currentFavoriteNodeNum;
+ static std::vector favoritedNodes;
+ static void rebuildFavoritedNodes();
// OEM screens
#ifdef USERPREFS_OEM_TEXT
diff --git a/src/graphics/niche/InkHUD/PlatformioConfig.ini b/src/graphics/niche/InkHUD/PlatformioConfig.ini
index e5a0e67df..80984f399 100644
--- a/src/graphics/niche/InkHUD/PlatformioConfig.ini
+++ b/src/graphics/niche/InkHUD/PlatformioConfig.ini
@@ -1,7 +1,6 @@
[inkhud]
build_src_filter =
+; Include the nicheGraphics directory
- +<../variants/$PIOENV>; Include nicheGraphics.h from our variant folder
build_flags =
-D MESHTASTIC_INCLUDE_NICHE_GRAPHICS ; Use NicheGraphics
-D MESHTASTIC_INCLUDE_INKHUD ; Use InkHUD (a NicheGraphics UI)
diff --git a/src/input/ButtonThread.cpp b/src/input/ButtonThread.cpp
index ad667f003..233bbefe0 100644
--- a/src/input/ButtonThread.cpp
+++ b/src/input/ButtonThread.cpp
@@ -53,23 +53,21 @@ bool ButtonThread::initButton(const ButtonConfig &config)
},
this);
- if (config.longPress != INPUT_BROKER_NONE) {
- _longPress = config.longPress;
- userButton.attachLongPressStart(
- [](void *callerThread) -> void {
- ButtonThread *thread = (ButtonThread *)callerThread;
- // if (millis() > 30000) // hold off 30s after boot
- thread->btnEvent = BUTTON_EVENT_LONG_PRESSED;
- },
- this);
- userButton.attachLongPressStop(
- [](void *callerThread) -> void {
- ButtonThread *thread = (ButtonThread *)callerThread;
- // if (millis() > 30000) // hold off 30s after boot
- thread->btnEvent = BUTTON_EVENT_LONG_RELEASED;
- },
- this);
- }
+ _longPress = config.longPress;
+ userButton.attachLongPressStart(
+ [](void *callerThread) -> void {
+ ButtonThread *thread = (ButtonThread *)callerThread;
+ // if (millis() > 30000) // hold off 30s after boot
+ thread->btnEvent = BUTTON_EVENT_LONG_PRESSED;
+ },
+ this);
+ userButton.attachLongPressStop(
+ [](void *callerThread) -> void {
+ ButtonThread *thread = (ButtonThread *)callerThread;
+ // if (millis() > 30000) // hold off 30s after boot
+ thread->btnEvent = BUTTON_EVENT_LONG_RELEASED;
+ },
+ this);
if (config.doublePress != INPUT_BROKER_NONE) {
_doublePress = config.doublePress;
@@ -202,11 +200,11 @@ int32_t ButtonThread::runOnce()
break;
}
-
- // Forward long press to InputBroker (but NOT as DOWN/SELECT, just forward a "button long press" event)
- evt.inputEvent = _longPress;
- this->notifyObservers(&evt);
-
+ if (_longPress != INPUT_BROKER_NONE) {
+ // Forward long press to InputBroker (but NOT as DOWN/SELECT, just forward a "button long press" event)
+ evt.inputEvent = _longPress;
+ this->notifyObservers(&evt);
+ }
// Reset combination tracking
waitingForLongPress = false;
@@ -253,7 +251,7 @@ int32_t ButtonThread::runOnce()
// may wake the board immediatedly.
case BUTTON_EVENT_LONG_RELEASED: {
- LOG_INFO("LONG PRESS RELEASE");
+ LOG_INFO("LONG PRESS RELEASE AFTER %u MILLIS", millis() - buttonPressStartTime);
if (millis() > 30000 && _longLongPress != INPUT_BROKER_NONE &&
(millis() - buttonPressStartTime) >= _longLongPressTime) {
evt.inputEvent = _longLongPress;
diff --git a/src/input/ButtonThread.h b/src/input/ButtonThread.h
index 949048de1..bbc8da2a7 100644
--- a/src/input/ButtonThread.h
+++ b/src/input/ButtonThread.h
@@ -18,13 +18,13 @@ struct ButtonConfig {
uint16_t longPressTime = 500;
input_broker_event doublePress = INPUT_BROKER_NONE;
input_broker_event longLongPress = INPUT_BROKER_NONE;
- uint16_t longLongPressTime = 5000;
+ uint16_t longLongPressTime = 3900;
input_broker_event triplePress = INPUT_BROKER_NONE;
input_broker_event shortLong = INPUT_BROKER_NONE;
bool touchQuirk = false;
// Constructor to set required parameter
- ButtonConfig(uint8_t pin = 0) : pinNumber(pin) {}
+ explicit ButtonConfig(uint8_t pin = 0) : pinNumber(pin) {}
};
#ifndef BUTTON_CLICK_MS
@@ -62,7 +62,7 @@ class ButtonThread : public Observable, public concurrency::
BUTTON_EVENT_COMBO_SHORT_LONG,
};
- ButtonThread(const char *name);
+ explicit ButtonThread(const char *name);
int32_t runOnce() override;
OneButton userButton;
void attachButtonInterrupts();
diff --git a/src/input/ExpressLRSFiveWay.cpp b/src/input/ExpressLRSFiveWay.cpp
index 53bcedc63..77f9e9993 100644
--- a/src/input/ExpressLRSFiveWay.cpp
+++ b/src/input/ExpressLRSFiveWay.cpp
@@ -233,14 +233,7 @@ void ExpressLRSFiveWay::sendAdhocPing()
// Contained as one method for easier remapping of buttons by user
void ExpressLRSFiveWay::shutdown()
{
- LOG_INFO("Shutdown from long press");
- powerFSM.trigger(EVENT_PRESS);
- screen->startAlert("Shutting Down...");
- // Don't set alerting = true. We don't want to auto-dismiss this alert.
-
- playShutdownMelody(); // In case user adds a buzzer
-
- shutdownAtMsec = millis() + 3000;
+ sendKey(INPUT_BROKER_SHUTDOWN);
}
void ExpressLRSFiveWay::click()
diff --git a/src/input/TCA8418Keyboard.cpp b/src/input/TCA8418Keyboard.cpp
index d99379b23..bd8338acf 100644
--- a/src/input/TCA8418Keyboard.cpp
+++ b/src/input/TCA8418Keyboard.cpp
@@ -1,116 +1,18 @@
-// Based on the MPR121 Keyboard and Adafruit TCA8418 library
-
#include "TCA8418Keyboard.h"
-#include "configuration.h"
-
-#include
-
-// REGISTERS
-// #define _TCA8418_REG_RESERVED 0x00
-#define _TCA8418_REG_CFG 0x01 // Configuration register
-#define _TCA8418_REG_INT_STAT 0x02 // Interrupt status
-#define _TCA8418_REG_KEY_LCK_EC 0x03 // Key lock and event counter
-#define _TCA8418_REG_KEY_EVENT_A 0x04 // Key event register A
-#define _TCA8418_REG_KEY_EVENT_B 0x05 // Key event register B
-#define _TCA8418_REG_KEY_EVENT_C 0x06 // Key event register C
-#define _TCA8418_REG_KEY_EVENT_D 0x07 // Key event register D
-#define _TCA8418_REG_KEY_EVENT_E 0x08 // Key event register E
-#define _TCA8418_REG_KEY_EVENT_F 0x09 // Key event register F
-#define _TCA8418_REG_KEY_EVENT_G 0x0A // Key event register G
-#define _TCA8418_REG_KEY_EVENT_H 0x0B // Key event register H
-#define _TCA8418_REG_KEY_EVENT_I 0x0C // Key event register I
-#define _TCA8418_REG_KEY_EVENT_J 0x0D // Key event register J
-#define _TCA8418_REG_KP_LCK_TIMER 0x0E // Keypad lock1 to lock2 timer
-#define _TCA8418_REG_UNLOCK_1 0x0F // Unlock register 1
-#define _TCA8418_REG_UNLOCK_2 0x10 // Unlock register 2
-#define _TCA8418_REG_GPIO_INT_STAT_1 0x11 // GPIO interrupt status 1
-#define _TCA8418_REG_GPIO_INT_STAT_2 0x12 // GPIO interrupt status 2
-#define _TCA8418_REG_GPIO_INT_STAT_3 0x13 // GPIO interrupt status 3
-#define _TCA8418_REG_GPIO_DAT_STAT_1 0x14 // GPIO data status 1
-#define _TCA8418_REG_GPIO_DAT_STAT_2 0x15 // GPIO data status 2
-#define _TCA8418_REG_GPIO_DAT_STAT_3 0x16 // GPIO data status 3
-#define _TCA8418_REG_GPIO_DAT_OUT_1 0x17 // GPIO data out 1
-#define _TCA8418_REG_GPIO_DAT_OUT_2 0x18 // GPIO data out 2
-#define _TCA8418_REG_GPIO_DAT_OUT_3 0x19 // GPIO data out 3
-#define _TCA8418_REG_GPIO_INT_EN_1 0x1A // GPIO interrupt enable 1
-#define _TCA8418_REG_GPIO_INT_EN_2 0x1B // GPIO interrupt enable 2
-#define _TCA8418_REG_GPIO_INT_EN_3 0x1C // GPIO interrupt enable 3
-#define _TCA8418_REG_KP_GPIO_1 0x1D // Keypad/GPIO select 1
-#define _TCA8418_REG_KP_GPIO_2 0x1E // Keypad/GPIO select 2
-#define _TCA8418_REG_KP_GPIO_3 0x1F // Keypad/GPIO select 3
-#define _TCA8418_REG_GPI_EM_1 0x20 // GPI event mode 1
-#define _TCA8418_REG_GPI_EM_2 0x21 // GPI event mode 2
-#define _TCA8418_REG_GPI_EM_3 0x22 // GPI event mode 3
-#define _TCA8418_REG_GPIO_DIR_1 0x23 // GPIO data direction 1
-#define _TCA8418_REG_GPIO_DIR_2 0x24 // GPIO data direction 2
-#define _TCA8418_REG_GPIO_DIR_3 0x25 // GPIO data direction 3
-#define _TCA8418_REG_GPIO_INT_LVL_1 0x26 // GPIO edge/level detect 1
-#define _TCA8418_REG_GPIO_INT_LVL_2 0x27 // GPIO edge/level detect 2
-#define _TCA8418_REG_GPIO_INT_LVL_3 0x28 // GPIO edge/level detect 3
-#define _TCA8418_REG_DEBOUNCE_DIS_1 0x29 // Debounce disable 1
-#define _TCA8418_REG_DEBOUNCE_DIS_2 0x2A // Debounce disable 2
-#define _TCA8418_REG_DEBOUNCE_DIS_3 0x2B // Debounce disable 3
-#define _TCA8418_REG_GPIO_PULL_1 0x2C // GPIO pull-up disable 1
-#define _TCA8418_REG_GPIO_PULL_2 0x2D // GPIO pull-up disable 2
-#define _TCA8418_REG_GPIO_PULL_3 0x2E // GPIO pull-up disable 3
-// #define _TCA8418_REG_RESERVED 0x2F
-
-// FIELDS CONFIG REGISTER 1
-#define _TCA8418_REG_CFG_AI 0x80 // Auto-increment for read/write
-#define _TCA8418_REG_CFG_GPI_E_CGF 0x40 // Event mode config
-#define _TCA8418_REG_CFG_OVR_FLOW_M 0x20 // Overflow mode enable
-#define _TCA8418_REG_CFG_INT_CFG 0x10 // Interrupt config
-#define _TCA8418_REG_CFG_OVR_FLOW_IEN 0x08 // Overflow interrupt enable
-#define _TCA8418_REG_CFG_K_LCK_IEN 0x04 // Keypad lock interrupt enable
-#define _TCA8418_REG_CFG_GPI_IEN 0x02 // GPI interrupt enable
-#define _TCA8418_REG_CFG_KE_IEN 0x01 // Key events interrupt enable
-
-// FIELDS INT_STAT REGISTER 2
-#define _TCA8418_REG_STAT_CAD_INT 0x10 // Ctrl-alt-del seq status
-#define _TCA8418_REG_STAT_OVR_FLOW_INT 0x08 // Overflow interrupt status
-#define _TCA8418_REG_STAT_K_LCK_INT 0x04 // Key lock interrupt status
-#define _TCA8418_REG_STAT_GPI_INT 0x02 // GPI interrupt status
-#define _TCA8418_REG_STAT_K_INT 0x01 // Key events interrupt status
-
-// FIELDS KEY_LCK_EC REGISTER 3
-#define _TCA8418_REG_LCK_EC_K_LCK_EN 0x40 // Key lock enable
-#define _TCA8418_REG_LCK_EC_LCK_2 0x20 // Keypad lock status 2
-#define _TCA8418_REG_LCK_EC_LCK_1 0x10 // Keypad lock status 1
-#define _TCA8418_REG_LCK_EC_KLEC_3 0x08 // Key event count bit 3
-#define _TCA8418_REG_LCK_EC_KLEC_2 0x04 // Key event count bit 2
-#define _TCA8418_REG_LCK_EC_KLEC_1 0x02 // Key event count bit 1
-#define _TCA8418_REG_LCK_EC_KLEC_0 0x01 // Key event count bit 0
-
-// Pin IDs for matrix rows/columns
-enum {
- _TCA8418_ROW0, // Pin ID for row 0
- _TCA8418_ROW1, // Pin ID for row 1
- _TCA8418_ROW2, // Pin ID for row 2
- _TCA8418_ROW3, // Pin ID for row 3
- _TCA8418_ROW4, // Pin ID for row 4
- _TCA8418_ROW5, // Pin ID for row 5
- _TCA8418_ROW6, // Pin ID for row 6
- _TCA8418_ROW7, // Pin ID for row 7
- _TCA8418_COL0, // Pin ID for column 0
- _TCA8418_COL1, // Pin ID for column 1
- _TCA8418_COL2, // Pin ID for column 2
- _TCA8418_COL3, // Pin ID for column 3
- _TCA8418_COL4, // Pin ID for column 4
- _TCA8418_COL5, // Pin ID for column 5
- _TCA8418_COL6, // Pin ID for column 6
- _TCA8418_COL7, // Pin ID for column 7
- _TCA8418_COL8, // Pin ID for column 8
- _TCA8418_COL9 // Pin ID for column 9
-};
#define _TCA8418_COLS 3
#define _TCA8418_ROWS 4
#define _TCA8418_NUM_KEYS 12
-uint8_t TCA8418TapMod[_TCA8418_NUM_KEYS] = {13, 7, 7, 7, 7, 7,
- 9, 7, 9, 2, 2, 2}; // Num chars per key, Modulus for rotating through characters
+#define _TCA8418_LONG_PRESS_THRESHOLD 2000
+#define _TCA8418_MULTI_TAP_THRESHOLD 750
-unsigned char TCA8418TapMap[_TCA8418_NUM_KEYS][13] = {
+using Key = TCA8418KeyboardBase::TCA8418Key;
+
+// Num chars per key, Modulus for rotating through characters
+static uint8_t TCA8418TapMod[_TCA8418_NUM_KEYS] = {13, 7, 7, 7, 7, 7, 9, 7, 9, 2, 2, 2};
+
+static unsigned char TCA8418TapMap[_TCA8418_NUM_KEYS][13] = {
{'1', '.', ',', '?', '!', ':', ';', '-', '_', '\\', '/', '(', ')'}, // 1
{'2', 'a', 'b', 'c', 'A', 'B', 'C'}, // 2
{'3', 'd', 'e', 'f', 'D', 'E', 'F'}, // 3
@@ -125,176 +27,35 @@ unsigned char TCA8418TapMap[_TCA8418_NUM_KEYS][13] = {
{'#', '@'}, // #
};
-unsigned char TCA8418LongPressMap[_TCA8418_NUM_KEYS] = {
- _TCA8418_ESC, // 1
- _TCA8418_UP, // 2
- _TCA8418_NONE, // 3
- _TCA8418_LEFT, // 4
- _TCA8418_NONE, // 5
- _TCA8418_RIGHT, // 6
- _TCA8418_NONE, // 7
- _TCA8418_DOWN, // 8
- _TCA8418_NONE, // 9
- _TCA8418_BSP, // *
- _TCA8418_NONE, // 0
- _TCA8418_NONE, // #
+static unsigned char TCA8418LongPressMap[_TCA8418_NUM_KEYS] = {
+ Key::ESC, // 1
+ Key::UP, // 2
+ Key::NONE, // 3
+ Key::LEFT, // 4
+ Key::NONE, // 5
+ Key::RIGHT, // 6
+ Key::NONE, // 7
+ Key::DOWN, // 8
+ Key::NONE, // 9
+ Key::BSP, // *
+ Key::NONE, // 0
+ Key::NONE, // #
};
-#define _TCA8418_LONG_PRESS_THRESHOLD 2000
-#define _TCA8418_MULTI_TAP_THRESHOLD 750
-
-TCA8418Keyboard::TCA8418Keyboard() : m_wire(nullptr), m_addr(0), readCallback(nullptr), writeCallback(nullptr)
+TCA8418Keyboard::TCA8418Keyboard()
+ : TCA8418KeyboardBase(_TCA8418_ROWS, _TCA8418_COLS), last_key(-1), next_key(-1), last_tap(0L), char_idx(0), tap_interval(0),
+ should_backspace(false)
{
- state = Init;
- last_key = -1;
- should_backspace = false;
- last_tap = 0L;
- char_idx = 0;
- tap_interval = 0;
- backlight_on = true;
- queue = "";
-}
-
-void TCA8418Keyboard::begin(uint8_t addr, TwoWire *wire)
-{
- m_addr = addr;
- m_wire = wire;
-
- m_wire->begin();
-
- reset();
-}
-
-void TCA8418Keyboard::begin(i2c_com_fptr_t r, i2c_com_fptr_t w, uint8_t addr)
-{
- m_addr = addr;
- m_wire = nullptr;
- writeCallback = w;
- readCallback = r;
- reset();
}
void TCA8418Keyboard::reset()
{
- LOG_DEBUG("TCA8418 Reset");
- // GPIO
- // set default all GIO pins to INPUT
- writeRegister(_TCA8418_REG_GPIO_DIR_1, 0x00);
- writeRegister(_TCA8418_REG_GPIO_DIR_2, 0x00);
+ TCA8418KeyboardBase::reset();
+
// Set COL9 as GPIO output
- writeRegister(_TCA8418_REG_GPIO_DIR_3, 0x02);
+ writeRegister(TCA8418_REG_GPIO_DIR_3, 0x02);
// Switch off keyboard backlight (COL9 = LOW)
- writeRegister(_TCA8418_REG_GPIO_DAT_OUT_3, 0x00);
-
- // add all pins to key events
- writeRegister(_TCA8418_REG_GPI_EM_1, 0xFF);
- writeRegister(_TCA8418_REG_GPI_EM_2, 0xFF);
- writeRegister(_TCA8418_REG_GPI_EM_3, 0xFF);
-
- // set all pins to FALLING interrupts
- writeRegister(_TCA8418_REG_GPIO_INT_LVL_1, 0x00);
- writeRegister(_TCA8418_REG_GPIO_INT_LVL_2, 0x00);
- writeRegister(_TCA8418_REG_GPIO_INT_LVL_3, 0x00);
-
- // add all pins to interrupts
- writeRegister(_TCA8418_REG_GPIO_INT_EN_1, 0xFF);
- writeRegister(_TCA8418_REG_GPIO_INT_EN_2, 0xFF);
- writeRegister(_TCA8418_REG_GPIO_INT_EN_3, 0xFF);
-
- // Set keyboard matrix size
- matrix(_TCA8418_ROWS, _TCA8418_COLS);
- enableDebounce();
- flush();
- state = Idle;
-}
-
-bool TCA8418Keyboard::matrix(uint8_t rows, uint8_t columns)
-{
- if ((rows > 8) || (columns > 10))
- return false;
-
- // Skip zero size matrix
- if ((rows != 0) && (columns != 0)) {
- // Setup the keypad matrix.
- uint8_t mask = 0x00;
- for (int r = 0; r < rows; r++) {
- mask <<= 1;
- mask |= 1;
- }
- writeRegister(_TCA8418_REG_KP_GPIO_1, mask);
-
- mask = 0x00;
- for (int c = 0; c < columns && c < 8; c++) {
- mask <<= 1;
- mask |= 1;
- }
- writeRegister(_TCA8418_REG_KP_GPIO_2, mask);
-
- if (columns > 8) {
- if (columns == 9)
- mask = 0x01;
- else
- mask = 0x03;
- writeRegister(_TCA8418_REG_KP_GPIO_3, mask);
- }
- }
-
- return true;
-}
-
-uint8_t TCA8418Keyboard::keyCount() const
-{
- uint8_t eventCount = readRegister(_TCA8418_REG_KEY_LCK_EC);
- eventCount &= 0x0F; // lower 4 bits only
- return eventCount;
-}
-
-bool TCA8418Keyboard::hasEvent()
-{
- return queue.length() > 0;
-}
-
-void TCA8418Keyboard::queueEvent(char next)
-{
- if (next == _TCA8418_NONE) {
- return;
- }
- queue.concat(next);
-}
-
-char TCA8418Keyboard::dequeueEvent()
-{
- if (queue.length() < 1) {
- return _TCA8418_NONE;
- }
- char next = queue.charAt(0);
- queue.remove(0, 1);
- return next;
-}
-
-void TCA8418Keyboard::trigger()
-{
- if (keyCount() == 0) {
- return;
- }
- if (state != Init) {
- // Read the key register
- uint8_t k = readRegister(_TCA8418_REG_KEY_EVENT_A);
- uint8_t key = k & 0x7F;
- if (k & 0x80) {
- if (state == Idle)
- pressed(key);
- return;
- } else {
- if (state == Held) {
- released();
- }
- state = Idle;
- return;
- }
- } else {
- reset();
- }
+ writeRegister(TCA8418_REG_GPIO_DAT_OUT_3, 0x00);
}
void TCA8418Keyboard::pressed(uint8_t key)
@@ -354,7 +115,7 @@ void TCA8418Keyboard::released()
int32_t held_interval = now - last_tap;
last_tap = now;
if (tap_interval < _TCA8418_MULTI_TAP_THRESHOLD && should_backspace) {
- queueEvent(_TCA8418_BSP);
+ queueEvent(BSP);
}
if (held_interval > _TCA8418_LONG_PRESS_THRESHOLD) {
queueEvent(TCA8418LongPressMap[last_key]);
@@ -366,195 +127,11 @@ void TCA8418Keyboard::released()
}
}
-uint8_t TCA8418Keyboard::flush()
-{
- // Flush key events
- uint8_t count = 0;
- while (readRegister(_TCA8418_REG_KEY_EVENT_A) != 0)
- count++;
- // Flush gpio events
- readRegister(_TCA8418_REG_GPIO_INT_STAT_1);
- readRegister(_TCA8418_REG_GPIO_INT_STAT_2);
- readRegister(_TCA8418_REG_GPIO_INT_STAT_3);
- // Clear INT_STAT register
- writeRegister(_TCA8418_REG_INT_STAT, 3);
- return count;
-}
-
-uint8_t TCA8418Keyboard::digitalRead(uint8_t pinnum) const
-{
- if (pinnum > _TCA8418_COL9)
- return 0xFF;
-
- uint8_t reg = _TCA8418_REG_GPIO_DAT_STAT_1 + pinnum / 8;
- uint8_t mask = (1 << (pinnum % 8));
-
- // Level 0 = low other = high
- uint8_t value = readRegister(reg);
- if (value & mask)
- return HIGH;
- return LOW;
-}
-
-bool TCA8418Keyboard::digitalWrite(uint8_t pinnum, uint8_t level)
-{
- if (pinnum > _TCA8418_COL9)
- return false;
-
- uint8_t reg = _TCA8418_REG_GPIO_DAT_OUT_1 + pinnum / 8;
- uint8_t mask = (1 << (pinnum % 8));
-
- // Level 0 = low other = high
- uint8_t value = readRegister(reg);
- if (level == LOW)
- value &= ~mask;
- else
- value |= mask;
- writeRegister(reg, value);
- return true;
-}
-
-bool TCA8418Keyboard::pinMode(uint8_t pinnum, uint8_t mode)
-{
- if (pinnum > _TCA8418_COL9)
- return false;
-
- uint8_t idx = pinnum / 8;
- uint8_t reg = _TCA8418_REG_GPIO_DIR_1 + idx;
- uint8_t mask = (1 << (pinnum % 8));
-
- // Mode 0 = input 1 = output
- uint8_t value = readRegister(reg);
- if (mode == OUTPUT)
- value |= mask;
- else
- value &= ~mask;
- writeRegister(reg, value);
-
- // Pullup 0 = enabled 1 = disabled
- reg = _TCA8418_REG_GPIO_PULL_1 + idx;
- value = readRegister(reg);
- if (mode == INPUT_PULLUP)
- value &= ~mask;
- else
- value |= mask;
- writeRegister(reg, value);
-
- return true;
-}
-
-bool TCA8418Keyboard::pinIRQMode(uint8_t pinnum, uint8_t mode)
-{
- if (pinnum > _TCA8418_COL9)
- return false;
- if ((mode != RISING) && (mode != FALLING))
- return false;
-
- // Mode 0 = falling 1 = rising
- uint8_t idx = pinnum / 8;
- uint8_t reg = _TCA8418_REG_GPIO_INT_LVL_1 + idx;
- uint8_t mask = (1 << (pinnum % 8));
-
- uint8_t value = readRegister(reg);
- if (mode == RISING)
- value |= mask;
- else
- value &= ~mask;
- writeRegister(reg, value);
-
- // Enable interrupt
- reg = _TCA8418_REG_GPIO_INT_EN_1 + idx;
- value = readRegister(reg);
- value |= mask;
- writeRegister(reg, value);
-
- return true;
-}
-
-void TCA8418Keyboard::enableInterrupts()
-{
- uint8_t value = readRegister(_TCA8418_REG_CFG);
- value |= (_TCA8418_REG_CFG_GPI_IEN | _TCA8418_REG_CFG_KE_IEN);
- writeRegister(_TCA8418_REG_CFG, value);
-};
-
-void TCA8418Keyboard::disableInterrupts()
-{
- uint8_t value = readRegister(_TCA8418_REG_CFG);
- value &= ~(_TCA8418_REG_CFG_GPI_IEN | _TCA8418_REG_CFG_KE_IEN);
- writeRegister(_TCA8418_REG_CFG, value);
-};
-
-void TCA8418Keyboard::enableMatrixOverflow()
-{
- uint8_t value = readRegister(_TCA8418_REG_CFG);
- value |= _TCA8418_REG_CFG_OVR_FLOW_M;
- writeRegister(_TCA8418_REG_CFG, value);
-};
-
-void TCA8418Keyboard::disableMatrixOverflow()
-{
- uint8_t value = readRegister(_TCA8418_REG_CFG);
- value &= ~_TCA8418_REG_CFG_OVR_FLOW_M;
- writeRegister(_TCA8418_REG_CFG, value);
-};
-
-void TCA8418Keyboard::enableDebounce()
-{
- writeRegister(_TCA8418_REG_DEBOUNCE_DIS_1, 0x00);
- writeRegister(_TCA8418_REG_DEBOUNCE_DIS_2, 0x00);
- writeRegister(_TCA8418_REG_DEBOUNCE_DIS_3, 0x00);
-}
-
-void TCA8418Keyboard::disableDebounce()
-{
- writeRegister(_TCA8418_REG_DEBOUNCE_DIS_1, 0xFF);
- writeRegister(_TCA8418_REG_DEBOUNCE_DIS_2, 0xFF);
- writeRegister(_TCA8418_REG_DEBOUNCE_DIS_3, 0xFF);
-}
-
void TCA8418Keyboard::setBacklight(bool on)
{
if (on) {
- digitalWrite(_TCA8418_COL9, HIGH);
+ digitalWrite(TCA8418_COL9, HIGH);
} else {
- digitalWrite(_TCA8418_COL9, LOW);
+ digitalWrite(TCA8418_COL9, LOW);
}
}
-
-uint8_t TCA8418Keyboard::readRegister(uint8_t reg) const
-{
- if (m_wire) {
- m_wire->beginTransmission(m_addr);
- m_wire->write(reg);
- m_wire->endTransmission();
-
- m_wire->requestFrom(m_addr, (uint8_t)1);
- if (m_wire->available() < 1)
- return 0;
-
- return m_wire->read();
- }
- if (readCallback) {
- uint8_t data;
- readCallback(m_addr, reg, &data, 1);
- return data;
- }
- return 0;
-}
-
-void TCA8418Keyboard::writeRegister(uint8_t reg, uint8_t value)
-{
- uint8_t data[2];
- data[0] = reg;
- data[1] = value;
-
- if (m_wire) {
- m_wire->beginTransmission(m_addr);
- m_wire->write(data, sizeof(uint8_t) * 2);
- m_wire->endTransmission();
- }
- if (writeCallback) {
- writeCallback(m_addr, data[0], &(data[1]), 1);
- }
-}
\ No newline at end of file
diff --git a/src/input/TCA8418Keyboard.h b/src/input/TCA8418Keyboard.h
index 5c53452a4..b76916643 100644
--- a/src/input/TCA8418Keyboard.h
+++ b/src/input/TCA8418Keyboard.h
@@ -1,82 +1,23 @@
-// Based on the MPR121 Keyboard and Adafruit TCA8418 library
-#include "configuration.h"
-#include
+#include "TCA8418KeyboardBase.h"
-#define _TCA8418_NONE 0x00
-#define _TCA8418_REBOOT 0x90
-#define _TCA8418_LEFT 0xb4
-#define _TCA8418_UP 0xb5
-#define _TCA8418_DOWN 0xb6
-#define _TCA8418_RIGHT 0xb7
-#define _TCA8418_ESC 0x1b
-#define _TCA8418_BSP 0x08
-#define _TCA8418_SELECT 0x0d
-
-class TCA8418Keyboard
+/**
+ * @brief 3x4 keypad with 3 columns and 4 rows
+ */
+class TCA8418Keyboard : public TCA8418KeyboardBase
{
public:
- typedef uint8_t (*i2c_com_fptr_t)(uint8_t dev_addr, uint8_t reg_addr, uint8_t *data, uint8_t len);
+ TCA8418Keyboard();
+ void reset(void) override;
+ void setBacklight(bool on) override;
- enum KeyState { Init = 0, Idle, Held, Busy };
+ protected:
+ void pressed(uint8_t key) override;
+ void released(void) override;
- KeyState state;
int8_t last_key;
- bool should_backspace;
+ int8_t next_key;
uint32_t last_tap;
uint8_t char_idx;
int32_t tap_interval;
- bool backlight_on;
-
- String queue;
-
- TCA8418Keyboard();
-
- void begin(uint8_t addr = XPOWERS_AXP192_AXP2101_ADDRESS, TwoWire *wire = &Wire);
- void begin(i2c_com_fptr_t r, i2c_com_fptr_t w, uint8_t addr = XPOWERS_AXP192_AXP2101_ADDRESS);
-
- void reset(void);
- // Configure the size of the keypad.
- // All other rows and columns are set as inputs.
- bool matrix(uint8_t rows, uint8_t columns);
-
- // Flush all events in the FIFO buffer + GPIO events.
- uint8_t flush(void);
-
- // Key events available in the internal FIFO buffer.
- uint8_t keyCount(void) const;
-
- void trigger(void);
- void pressed(uint8_t key);
- void released(void);
- bool hasEvent(void);
- char dequeueEvent(void);
- void queueEvent(char);
-
- uint8_t digitalRead(uint8_t pinnum) const;
- bool digitalWrite(uint8_t pinnum, uint8_t level);
- bool pinMode(uint8_t pinnum, uint8_t mode);
- bool pinIRQMode(uint8_t pinnum, uint8_t mode); // MODE FALLING or RISING
-
- // enable / disable interrupts for matrix and GPI pins
- void enableInterrupts();
- void disableInterrupts();
-
- // ignore key events when FIFO buffer is full or not.
- void enableMatrixOverflow();
- void disableMatrixOverflow();
-
- // debounce keys.
- void enableDebounce();
- void disableDebounce();
-
- void setBacklight(bool on);
-
- uint8_t readRegister(uint8_t reg) const;
- void writeRegister(uint8_t reg, uint8_t value);
-
- private:
- TwoWire *m_wire;
- uint8_t m_addr;
- i2c_com_fptr_t readCallback;
- i2c_com_fptr_t writeCallback;
+ bool should_backspace;
};
diff --git a/src/input/TCA8418KeyboardBase.cpp b/src/input/TCA8418KeyboardBase.cpp
new file mode 100644
index 000000000..aafc4c36c
--- /dev/null
+++ b/src/input/TCA8418KeyboardBase.cpp
@@ -0,0 +1,372 @@
+// Based on the MPR121 Keyboard and Adafruit TCA8418 library
+
+#include "TCA8418KeyboardBase.h"
+#include "configuration.h"
+
+#include
+
+// FIELDS CONFIG REGISTER 1
+#define _TCA8418_REG_CFG_AI 0x80 // Auto-increment for read/write
+#define _TCA8418_REG_CFG_GPI_E_CGF 0x40 // Event mode config
+#define _TCA8418_REG_CFG_OVR_FLOW_M 0x20 // Overflow mode enable
+#define _TCA8418_REG_CFG_INT_CFG 0x10 // Interrupt config
+#define _TCA8418_REG_CFG_OVR_FLOW_IEN 0x08 // Overflow interrupt enable
+#define _TCA8418_REG_CFG_K_LCK_IEN 0x04 // Keypad lock interrupt enable
+#define _TCA8418_REG_CFG_GPI_IEN 0x02 // GPI interrupt enable
+#define _TCA8418_REG_CFG_KE_IEN 0x01 // Key events interrupt enable
+
+// FIELDS INT_STAT REGISTER 2
+#define _TCA8418_REG_STAT_CAD_INT 0x10 // Ctrl-alt-del seq status
+#define _TCA8418_REG_STAT_OVR_FLOW_INT 0x08 // Overflow interrupt status
+#define _TCA8418_REG_STAT_K_LCK_INT 0x04 // Key lock interrupt status
+#define _TCA8418_REG_STAT_GPI_INT 0x02 // GPI interrupt status
+#define _TCA8418_REG_STAT_K_INT 0x01 // Key events interrupt status
+
+// FIELDS KEY_LCK_EC REGISTER 3
+#define _TCA8418_REG_LCK_EC_K_LCK_EN 0x40 // Key lock enable
+#define _TCA8418_REG_LCK_EC_LCK_2 0x20 // Keypad lock status 2
+#define _TCA8418_REG_LCK_EC_LCK_1 0x10 // Keypad lock status 1
+#define _TCA8418_REG_LCK_EC_KLEC_3 0x08 // Key event count bit 3
+#define _TCA8418_REG_LCK_EC_KLEC_2 0x04 // Key event count bit 2
+#define _TCA8418_REG_LCK_EC_KLEC_1 0x02 // Key event count bit 1
+#define _TCA8418_REG_LCK_EC_KLEC_0 0x01 // Key event count bit 0
+
+TCA8418KeyboardBase::TCA8418KeyboardBase(uint8_t rows, uint8_t columns)
+ : rows(rows), columns(columns), state(Init), queue(""), m_wire(nullptr), m_addr(0), readCallback(nullptr),
+ writeCallback(nullptr)
+{
+}
+
+void TCA8418KeyboardBase::begin(uint8_t addr, TwoWire *wire)
+{
+ m_addr = addr;
+ m_wire = wire;
+ m_wire->begin();
+ reset();
+}
+
+void TCA8418KeyboardBase::begin(i2c_com_fptr_t r, i2c_com_fptr_t w, uint8_t addr)
+{
+ m_addr = addr;
+ m_wire = nullptr;
+ writeCallback = w;
+ readCallback = r;
+ reset();
+}
+
+void TCA8418KeyboardBase::reset()
+{
+ LOG_DEBUG("TCA8418 Reset");
+ // GPIO
+ // set default all GIO pins to INPUT
+ writeRegister(TCA8418_REG_GPIO_DIR_1, 0x00);
+ writeRegister(TCA8418_REG_GPIO_DIR_2, 0x00);
+ writeRegister(TCA8418_REG_GPIO_DIR_3, 0x00);
+
+ // add all pins to key events
+ writeRegister(TCA8418_REG_GPI_EM_1, 0xFF);
+ writeRegister(TCA8418_REG_GPI_EM_2, 0xFF);
+ writeRegister(TCA8418_REG_GPI_EM_3, 0xFF);
+
+ // set all pins to FALLING interrupts
+ writeRegister(TCA8418_REG_GPIO_INT_LVL_1, 0x00);
+ writeRegister(TCA8418_REG_GPIO_INT_LVL_2, 0x00);
+ writeRegister(TCA8418_REG_GPIO_INT_LVL_3, 0x00);
+
+ // add all pins to interrupts
+ writeRegister(TCA8418_REG_GPIO_INT_EN_1, 0xFF);
+ writeRegister(TCA8418_REG_GPIO_INT_EN_2, 0xFF);
+ writeRegister(TCA8418_REG_GPIO_INT_EN_3, 0xFF);
+
+ // Set keyboard matrix size
+ matrix(rows, columns);
+ enableDebounce();
+ flush();
+ state = Idle;
+}
+
+bool TCA8418KeyboardBase::matrix(uint8_t rows, uint8_t columns)
+{
+ if (rows < 1 || rows > 8 || columns < 1 || columns > 10)
+ return false;
+
+ // Setup the keypad matrix.
+ uint8_t mask = 0x00;
+ for (int r = 0; r < rows; r++) {
+ mask <<= 1;
+ mask |= 1;
+ }
+ writeRegister(TCA8418_REG_KP_GPIO_1, mask);
+
+ mask = 0x00;
+ for (int c = 0; c < columns && c < 8; c++) {
+ mask <<= 1;
+ mask |= 1;
+ }
+ writeRegister(TCA8418_REG_KP_GPIO_2, mask);
+
+ if (columns > 8) {
+ if (columns == 9)
+ mask = 0x01;
+ else
+ mask = 0x03;
+ writeRegister(TCA8418_REG_KP_GPIO_3, mask);
+ }
+
+ return true;
+}
+
+uint8_t TCA8418KeyboardBase::keyCount() const
+{
+ uint8_t eventCount = readRegister(TCA8418_REG_KEY_LCK_EC);
+ eventCount &= 0x0F; // lower 4 bits only
+ return eventCount;
+}
+
+bool TCA8418KeyboardBase::hasEvent() const
+{
+ return queue.length() > 0;
+}
+
+void TCA8418KeyboardBase::queueEvent(char next)
+{
+ if (next == NONE) {
+ return;
+ }
+ queue.concat(next);
+}
+
+char TCA8418KeyboardBase::dequeueEvent()
+{
+ if (queue.length() < 1) {
+ return NONE;
+ }
+ char next = queue.charAt(0);
+ queue.remove(0, 1);
+ return next;
+}
+
+void TCA8418KeyboardBase::trigger()
+{
+ if (keyCount() == 0) {
+ return;
+ }
+ if (state != Init) {
+ // Read the key register
+ uint8_t k = readRegister(TCA8418_REG_KEY_EVENT_A);
+ uint8_t key = k & 0x7F;
+ if (k & 0x80) {
+ if (state == Idle)
+ pressed(key);
+ return;
+ } else {
+ if (state == Held) {
+ released();
+ }
+ state = Idle;
+ return;
+ }
+ } else {
+ reset();
+ }
+}
+
+void TCA8418KeyboardBase::pressed(uint8_t key)
+{
+ // must be defined in derived class
+ LOG_ERROR("pressed() not implemented in derived class");
+}
+
+void TCA8418KeyboardBase::released()
+{
+ // must be defined in derived class
+ LOG_ERROR("released() not implemented in derived class");
+}
+
+uint8_t TCA8418KeyboardBase::flush()
+{
+ // Flush key events
+ uint8_t count = 0;
+ while (readRegister(TCA8418_REG_KEY_EVENT_A) != 0)
+ count++;
+
+ // Flush gpio events
+ readRegister(TCA8418_REG_GPIO_INT_STAT_1);
+ readRegister(TCA8418_REG_GPIO_INT_STAT_2);
+ readRegister(TCA8418_REG_GPIO_INT_STAT_3);
+
+ // Clear INT_STAT register
+ writeRegister(TCA8418_REG_INT_STAT, 3);
+ return count;
+}
+
+uint8_t TCA8418KeyboardBase::digitalRead(uint8_t pinnum) const
+{
+ if (pinnum > TCA8418_COL9)
+ return 0xFF;
+
+ uint8_t reg = TCA8418_REG_GPIO_DAT_STAT_1 + pinnum / 8;
+ uint8_t mask = (1 << (pinnum % 8));
+
+ // Level 0 = low other = high
+ uint8_t value = readRegister(reg);
+ if (value & mask)
+ return HIGH;
+ return LOW;
+}
+
+bool TCA8418KeyboardBase::digitalWrite(uint8_t pinnum, uint8_t level)
+{
+ if (pinnum > TCA8418_COL9)
+ return false;
+
+ uint8_t reg = TCA8418_REG_GPIO_DAT_OUT_1 + pinnum / 8;
+ uint8_t mask = (1 << (pinnum % 8));
+
+ // Level 0 = low other = high
+ uint8_t value = readRegister(reg);
+ if (level == LOW)
+ value &= ~mask;
+ else
+ value |= mask;
+ writeRegister(reg, value);
+ return true;
+}
+
+bool TCA8418KeyboardBase::pinMode(uint8_t pinnum, uint8_t mode)
+{
+ if (pinnum > TCA8418_COL9)
+ return false;
+
+ uint8_t idx = pinnum / 8;
+ uint8_t reg = TCA8418_REG_GPIO_DIR_1 + idx;
+ uint8_t mask = (1 << (pinnum % 8));
+
+ // Mode 0 = input 1 = output
+ uint8_t value = readRegister(reg);
+ if (mode == OUTPUT)
+ value |= mask;
+ else
+ value &= ~mask;
+ writeRegister(reg, value);
+
+ // Pullup 0 = enabled 1 = disabled
+ reg = TCA8418_REG_GPIO_PULL_1 + idx;
+ value = readRegister(reg);
+ if (mode == INPUT_PULLUP)
+ value &= ~mask;
+ else
+ value |= mask;
+ writeRegister(reg, value);
+
+ return true;
+}
+
+bool TCA8418KeyboardBase::pinIRQMode(uint8_t pinnum, uint8_t mode)
+{
+ if (pinnum > TCA8418_COL9)
+ return false;
+ if ((mode != RISING) && (mode != FALLING))
+ return false;
+
+ // Mode 0 = falling 1 = rising
+ uint8_t idx = pinnum / 8;
+ uint8_t reg = TCA8418_REG_GPIO_INT_LVL_1 + idx;
+ uint8_t mask = (1 << (pinnum % 8));
+
+ uint8_t value = readRegister(reg);
+ if (mode == RISING)
+ value |= mask;
+ else
+ value &= ~mask;
+ writeRegister(reg, value);
+
+ // Enable interrupt
+ reg = TCA8418_REG_GPIO_INT_EN_1 + idx;
+ value = readRegister(reg);
+ value |= mask;
+ writeRegister(reg, value);
+
+ return true;
+}
+
+void TCA8418KeyboardBase::enableInterrupts()
+{
+ uint8_t value = readRegister(TCA8418_REG_CFG);
+ value |= (_TCA8418_REG_CFG_GPI_IEN | _TCA8418_REG_CFG_KE_IEN);
+ writeRegister(TCA8418_REG_CFG, value);
+};
+
+void TCA8418KeyboardBase::disableInterrupts()
+{
+ uint8_t value = readRegister(TCA8418_REG_CFG);
+ value &= ~(_TCA8418_REG_CFG_GPI_IEN | _TCA8418_REG_CFG_KE_IEN);
+ writeRegister(TCA8418_REG_CFG, value);
+};
+
+void TCA8418KeyboardBase::enableMatrixOverflow()
+{
+ uint8_t value = readRegister(TCA8418_REG_CFG);
+ value |= _TCA8418_REG_CFG_OVR_FLOW_M;
+ writeRegister(TCA8418_REG_CFG, value);
+};
+
+void TCA8418KeyboardBase::disableMatrixOverflow()
+{
+ uint8_t value = readRegister(TCA8418_REG_CFG);
+ value &= ~_TCA8418_REG_CFG_OVR_FLOW_M;
+ writeRegister(TCA8418_REG_CFG, value);
+};
+
+void TCA8418KeyboardBase::enableDebounce()
+{
+ writeRegister(TCA8418_REG_DEBOUNCE_DIS_1, 0x00);
+ writeRegister(TCA8418_REG_DEBOUNCE_DIS_2, 0x00);
+ writeRegister(TCA8418_REG_DEBOUNCE_DIS_3, 0x00);
+}
+
+void TCA8418KeyboardBase::disableDebounce()
+{
+ writeRegister(TCA8418_REG_DEBOUNCE_DIS_1, 0xFF);
+ writeRegister(TCA8418_REG_DEBOUNCE_DIS_2, 0xFF);
+ writeRegister(TCA8418_REG_DEBOUNCE_DIS_3, 0xFF);
+}
+
+void TCA8418KeyboardBase::setBacklight(bool on) {}
+
+uint8_t TCA8418KeyboardBase::readRegister(uint8_t reg) const
+{
+ if (m_wire) {
+ m_wire->beginTransmission(m_addr);
+ m_wire->write(reg);
+ m_wire->endTransmission();
+
+ m_wire->requestFrom(m_addr, (uint8_t)1);
+ if (m_wire->available() < 1)
+ return 0;
+
+ return m_wire->read();
+ }
+ if (readCallback) {
+ uint8_t data;
+ readCallback(m_addr, reg, &data, 1);
+ return data;
+ }
+ return 0;
+}
+
+void TCA8418KeyboardBase::writeRegister(uint8_t reg, uint8_t value)
+{
+ uint8_t data[2];
+ data[0] = reg;
+ data[1] = value;
+
+ if (m_wire) {
+ m_wire->beginTransmission(m_addr);
+ m_wire->write(data, sizeof(uint8_t) * 2);
+ m_wire->endTransmission();
+ }
+ if (writeCallback) {
+ writeCallback(m_addr, data[0], &(data[1]), 1);
+ }
+}
\ No newline at end of file
diff --git a/src/input/TCA8418KeyboardBase.h b/src/input/TCA8418KeyboardBase.h
new file mode 100644
index 000000000..5d6c4f7e9
--- /dev/null
+++ b/src/input/TCA8418KeyboardBase.h
@@ -0,0 +1,170 @@
+// Based on the MPR121 Keyboard and Adafruit TCA8418 library
+#include "configuration.h"
+#include
+
+/**
+ * @brief TCA8418KeyboardBase is the base class for TCA8418 keyboard handling.
+ * It provides basic functionality for reading key events, managing the keyboard matrix,
+ * and handling key states. It is designed to be extended for specific keyboard implementations.
+ * It supports both I2C communication and function pointers for custom I2C operations.
+ */
+class TCA8418KeyboardBase
+{
+ public:
+ enum TCA8418Key : uint8_t {
+ NONE = 0x00,
+ BSP = 0x08,
+ TAB = 0x09,
+ SELECT = 0x0d,
+ ESC = 0x1b,
+ REBOOT = 0x90,
+ LEFT = 0xb4,
+ UP = 0xb5,
+ DOWN = 0xb6,
+ RIGHT = 0xb7,
+ BT_TOGGLE = 0xAA,
+ GPS_TOGGLE = 0x9E,
+ MUTE_TOGGLE = 0xAC,
+ SEND_PING = 0xAF,
+ BL_TOGGLE = 0xAB
+ };
+
+ typedef uint8_t (*i2c_com_fptr_t)(uint8_t dev_addr, uint8_t reg_addr, uint8_t *data, uint8_t len);
+
+ TCA8418KeyboardBase(uint8_t rows, uint8_t columns);
+
+ virtual void begin(uint8_t addr = TCA8418_KB_ADDR, TwoWire *wire = &Wire);
+ virtual void begin(i2c_com_fptr_t r, i2c_com_fptr_t w, uint8_t addr = TCA8418_KB_ADDR);
+
+ virtual void reset(void);
+ virtual void trigger(void);
+
+ virtual void setBacklight(bool on);
+
+ // Key events available
+ virtual bool hasEvent(void) const;
+ virtual char dequeueEvent(void);
+
+ protected:
+ enum KeyState { Init, Idle, Held, Busy };
+
+ enum TCA8418Register : uint8_t {
+ TCA8418_REG_RESERVED = 0x00,
+ TCA8418_REG_CFG = 0x01,
+ TCA8418_REG_INT_STAT = 0x02,
+ TCA8418_REG_KEY_LCK_EC = 0x03,
+ TCA8418_REG_KEY_EVENT_A = 0x04,
+ TCA8418_REG_KEY_EVENT_B = 0x05,
+ TCA8418_REG_KEY_EVENT_C = 0x06,
+ TCA8418_REG_KEY_EVENT_D = 0x07,
+ TCA8418_REG_KEY_EVENT_E = 0x08,
+ TCA8418_REG_KEY_EVENT_F = 0x09,
+ TCA8418_REG_KEY_EVENT_G = 0x0A,
+ TCA8418_REG_KEY_EVENT_H = 0x0B,
+ TCA8418_REG_KEY_EVENT_I = 0x0C,
+ TCA8418_REG_KEY_EVENT_J = 0x0D,
+ TCA8418_REG_KP_LCK_TIMER = 0x0E,
+ TCA8418_REG_UNLOCK_1 = 0x0F,
+ TCA8418_REG_UNLOCK_2 = 0x10,
+ TCA8418_REG_GPIO_INT_STAT_1 = 0x11,
+ TCA8418_REG_GPIO_INT_STAT_2 = 0x12,
+ TCA8418_REG_GPIO_INT_STAT_3 = 0x13,
+ TCA8418_REG_GPIO_DAT_STAT_1 = 0x14,
+ TCA8418_REG_GPIO_DAT_STAT_2 = 0x15,
+ TCA8418_REG_GPIO_DAT_STAT_3 = 0x16,
+ TCA8418_REG_GPIO_DAT_OUT_1 = 0x17,
+ TCA8418_REG_GPIO_DAT_OUT_2 = 0x18,
+ TCA8418_REG_GPIO_DAT_OUT_3 = 0x19,
+ TCA8418_REG_GPIO_INT_EN_1 = 0x1A,
+ TCA8418_REG_GPIO_INT_EN_2 = 0x1B,
+ TCA8418_REG_GPIO_INT_EN_3 = 0x1C,
+ TCA8418_REG_KP_GPIO_1 = 0x1D,
+ TCA8418_REG_KP_GPIO_2 = 0x1E,
+ TCA8418_REG_KP_GPIO_3 = 0x1F,
+ TCA8418_REG_GPI_EM_1 = 0x20,
+ TCA8418_REG_GPI_EM_2 = 0x21,
+ TCA8418_REG_GPI_EM_3 = 0x22,
+ TCA8418_REG_GPIO_DIR_1 = 0x23,
+ TCA8418_REG_GPIO_DIR_2 = 0x24,
+ TCA8418_REG_GPIO_DIR_3 = 0x25,
+ TCA8418_REG_GPIO_INT_LVL_1 = 0x26,
+ TCA8418_REG_GPIO_INT_LVL_2 = 0x27,
+ TCA8418_REG_GPIO_INT_LVL_3 = 0x28,
+ TCA8418_REG_DEBOUNCE_DIS_1 = 0x29,
+ TCA8418_REG_DEBOUNCE_DIS_2 = 0x2A,
+ TCA8418_REG_DEBOUNCE_DIS_3 = 0x2B,
+ TCA8418_REG_GPIO_PULL_1 = 0x2C,
+ TCA8418_REG_GPIO_PULL_2 = 0x2D,
+ TCA8418_REG_GPIO_PULL_3 = 0x2E
+ };
+
+ // Pin IDs for matrix rows/columns
+ enum TCA8418PinId : uint8_t {
+ TCA8418_ROW0, // Pin ID for row 0
+ TCA8418_ROW1, // Pin ID for row 1
+ TCA8418_ROW2, // Pin ID for row 2
+ TCA8418_ROW3, // Pin ID for row 3
+ TCA8418_ROW4, // Pin ID for row 4
+ TCA8418_ROW5, // Pin ID for row 5
+ TCA8418_ROW6, // Pin ID for row 6
+ TCA8418_ROW7, // Pin ID for row 7
+ TCA8418_COL0, // Pin ID for column 0
+ TCA8418_COL1, // Pin ID for column 1
+ TCA8418_COL2, // Pin ID for column 2
+ TCA8418_COL3, // Pin ID for column 3
+ TCA8418_COL4, // Pin ID for column 4
+ TCA8418_COL5, // Pin ID for column 5
+ TCA8418_COL6, // Pin ID for column 6
+ TCA8418_COL7, // Pin ID for column 7
+ TCA8418_COL8, // Pin ID for column 8
+ TCA8418_COL9 // Pin ID for column 9
+ };
+
+ virtual void pressed(uint8_t key);
+ virtual void released(void);
+
+ virtual void queueEvent(char);
+
+ virtual ~TCA8418KeyboardBase() {}
+
+ protected:
+ // Set the size of the keypad matrix
+ // All other rows and columns are set as inputs.
+ bool matrix(uint8_t rows, uint8_t columns);
+
+ uint8_t keyCount(void) const;
+
+ // Flush all events in the FIFO buffer + GPIO events.
+ uint8_t flush(void);
+
+ // debounce keys.
+ void enableDebounce();
+ void disableDebounce();
+
+ // enable / disable interrupts for matrix and GPI pins
+ void enableInterrupts();
+ void disableInterrupts();
+
+ // ignore key events when FIFO buffer is full or not.
+ void enableMatrixOverflow();
+ void disableMatrixOverflow();
+
+ uint8_t digitalRead(uint8_t pinnum) const;
+ bool digitalWrite(uint8_t pinnum, uint8_t level);
+ bool pinMode(uint8_t pinnum, uint8_t mode);
+ bool pinIRQMode(uint8_t pinnum, uint8_t mode); // MODE FALLING or RISING
+ uint8_t readRegister(uint8_t reg) const;
+ void writeRegister(uint8_t reg, uint8_t value);
+
+ protected:
+ uint8_t rows;
+ uint8_t columns;
+ KeyState state;
+ String queue;
+
+ private:
+ TwoWire *m_wire;
+ uint8_t m_addr;
+ i2c_com_fptr_t readCallback;
+ i2c_com_fptr_t writeCallback;
+};
diff --git a/src/input/TDeckProKeyboard.cpp b/src/input/TDeckProKeyboard.cpp
new file mode 100644
index 000000000..098e0804a
--- /dev/null
+++ b/src/input/TDeckProKeyboard.cpp
@@ -0,0 +1,196 @@
+#if defined(T_DECK_PRO)
+
+#include "TDeckProKeyboard.h"
+
+#define _TCA8418_COLS 10
+#define _TCA8418_ROWS 4
+#define _TCA8418_NUM_KEYS 35
+
+#define _TCA8418_MULTI_TAP_THRESHOLD 1500
+
+using Key = TCA8418KeyboardBase::TCA8418Key;
+
+constexpr uint8_t modifierRightShiftKey = 31 - 1; // keynum -1
+constexpr uint8_t modifierRightShift = 0b0001;
+constexpr uint8_t modifierLeftShiftKey = 35 - 1;
+constexpr uint8_t modifierLeftShift = 0b0001;
+constexpr uint8_t modifierSymKey = 32 - 1;
+constexpr uint8_t modifierSym = 0b0010;
+constexpr uint8_t modifierAltKey = 30 - 1;
+constexpr uint8_t modifierAlt = 0b0100;
+
+// Num chars per key, Modulus for rotating through characters
+static uint8_t TDeckProTapMod[_TCA8418_NUM_KEYS] = {5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5};
+
+static unsigned char TDeckProTapMap[_TCA8418_NUM_KEYS][5] = {
+ {'p', 'P', '@', 0x00, Key::SEND_PING},
+ {'o', 'O', '+'},
+ {'i', 'I', '-'},
+ {'u', 'U', '_'},
+ {'y', 'Y', ')'},
+ {'t', 'T', '(', 0x00, Key::TAB},
+ {'r', 'R', '3'},
+ {'e', 'E', '2', 0x00, Key::UP},
+ {'w', 'W', '1'},
+ {'q', 'Q', '#', 0x00, Key::ESC}, // p, o, i, u, y, t, r, e, w, q
+ {Key::BSP, 0x00, 0x00},
+ {'l', 'L', '"'},
+ {'k', 'K', '\''},
+ {'j', 'J', ';'},
+ {'h', 'H', ':'},
+ {'g', 'G', '/', 0x00, Key::GPS_TOGGLE},
+ {'f', 'F', '6', 0x00, Key::RIGHT},
+ {'d', 'D', '5'},
+ {'s', 'S', '4', 0x00, Key::LEFT},
+ {'a', 'A', '*'}, // bsp, l, k, j, h, g, f, d, s, a
+ {0x0d, 0x00, 0x00},
+ {'$', 0x00, 0x00},
+ {'m', 'M', '.', 0x00, Key::MUTE_TOGGLE},
+ {'n', 'N', ','},
+ {'b', 'B', '!', 0x00, Key::BL_TOGGLE},
+ {'v', 'V', '?'},
+ {'c', 'C', '9'},
+ {'x', 'X', '8', 0x00, Key::DOWN},
+ {'z', 'Z', '7'},
+ {0x00, 0x00, 0x00}, // Ent, $, m, n, b, v, c, x, z, alt
+ {0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00},
+ {0x20, 0x00, 0x00},
+ {0x00, 0x00, 0x00},
+ {0x00, 0x00, 0x00} // R_Shift, sym, space, mic, L_Shift
+};
+
+TDeckProKeyboard::TDeckProKeyboard()
+ : TCA8418KeyboardBase(_TCA8418_ROWS, _TCA8418_COLS), modifierFlag(0), last_modifier_time(0), last_key(-1), next_key(-1),
+ last_tap(0L), char_idx(0), tap_interval(0)
+{
+}
+
+void TDeckProKeyboard::reset()
+{
+ TCA8418KeyboardBase::reset();
+ pinMode(KB_BL_PIN, OUTPUT);
+ setBacklight(false);
+}
+
+// handle multi-key presses (shift and alt)
+void TDeckProKeyboard::trigger()
+{
+ uint8_t count = keyCount();
+ if (count == 0)
+ return;
+ for (uint8_t i = 0; i < count; ++i) {
+ uint8_t k = readRegister(TCA8418_REG_KEY_EVENT_A + i);
+ uint8_t key = k & 0x7F;
+ if (k & 0x80) {
+ pressed(key);
+ } else {
+ released();
+ state = Idle;
+ }
+ }
+}
+
+void TDeckProKeyboard::pressed(uint8_t key)
+{
+ if (state == Init || state == Busy) {
+ return;
+ }
+ if (modifierFlag && (millis() - last_modifier_time > _TCA8418_MULTI_TAP_THRESHOLD)) {
+ modifierFlag = 0;
+ }
+
+ uint8_t next_key = 0;
+ int row = (key - 1) / 10;
+ int col = (key - 1) % 10;
+
+ if (row >= _TCA8418_ROWS || col >= _TCA8418_COLS) {
+ return; // Invalid key
+ }
+
+ next_key = row * _TCA8418_COLS + col;
+ state = Held;
+
+ uint32_t now = millis();
+ tap_interval = now - last_tap;
+
+ updateModifierFlag(next_key);
+ if (isModifierKey(next_key)) {
+ last_modifier_time = now;
+ }
+
+ if (tap_interval < 0) {
+ last_tap = 0;
+ state = Busy;
+ return;
+ }
+
+ if (next_key != last_key || tap_interval > _TCA8418_MULTI_TAP_THRESHOLD) {
+ char_idx = 0;
+ } else {
+ char_idx += 1;
+ }
+
+ last_key = next_key;
+ last_tap = now;
+}
+
+void TDeckProKeyboard::released()
+{
+ if (state != Held) {
+ return;
+ }
+
+ if (last_key < 0 || last_key >= _TCA8418_NUM_KEYS) {
+ last_key = -1;
+ state = Idle;
+ return;
+ }
+
+ uint32_t now = millis();
+ last_tap = now;
+
+ if (TDeckProTapMap[last_key][modifierFlag % TDeckProTapMod[last_key]] == Key::BL_TOGGLE) {
+ toggleBacklight();
+ return;
+ }
+
+ queueEvent(TDeckProTapMap[last_key][modifierFlag % TDeckProTapMod[last_key]]);
+ if (isModifierKey(last_key) == false)
+ modifierFlag = 0;
+}
+
+void TDeckProKeyboard::setBacklight(bool on)
+{
+ if (on) {
+ digitalWrite(KB_BL_PIN, HIGH);
+ } else {
+ digitalWrite(KB_BL_PIN, LOW);
+ }
+}
+
+void TDeckProKeyboard::toggleBacklight(void)
+{
+ digitalWrite(KB_BL_PIN, !digitalRead(KB_BL_PIN));
+}
+
+void TDeckProKeyboard::updateModifierFlag(uint8_t key)
+{
+ if (key == modifierRightShiftKey) {
+ modifierFlag ^= modifierRightShift;
+ } else if (key == modifierLeftShiftKey) {
+ modifierFlag ^= modifierLeftShift;
+ } else if (key == modifierSymKey) {
+ modifierFlag ^= modifierSym;
+ } else if (key == modifierAltKey) {
+ modifierFlag ^= modifierAlt;
+ }
+}
+
+bool TDeckProKeyboard::isModifierKey(uint8_t key)
+{
+ return (key == modifierRightShiftKey || key == modifierLeftShiftKey || key == modifierAltKey || key == modifierSymKey);
+}
+
+#endif // T_DECK_PRO
\ No newline at end of file
diff --git a/src/input/TDeckProKeyboard.h b/src/input/TDeckProKeyboard.h
new file mode 100644
index 000000000..617f3f20b
--- /dev/null
+++ b/src/input/TDeckProKeyboard.h
@@ -0,0 +1,27 @@
+#include "TCA8418KeyboardBase.h"
+
+class TDeckProKeyboard : public TCA8418KeyboardBase
+{
+ public:
+ TDeckProKeyboard();
+ void reset(void) override;
+ void trigger(void) override;
+ void setBacklight(bool on) override;
+
+ protected:
+ void pressed(uint8_t key) override;
+ void released(void) override;
+
+ void updateModifierFlag(uint8_t key);
+ bool isModifierKey(uint8_t key);
+ void toggleBacklight(void);
+
+ private:
+ uint8_t modifierFlag; // Flag to indicate if a modifier key is pressed
+ uint32_t last_modifier_time; // Timestamp of the last modifier key press
+ int8_t last_key;
+ int8_t next_key;
+ uint32_t last_tap;
+ uint8_t char_idx;
+ int32_t tap_interval;
+};
diff --git a/src/input/TLoraPagerKeyboard.h b/src/input/TLoraPagerKeyboard.h
new file mode 100644
index 000000000..d31b05978
--- /dev/null
+++ b/src/input/TLoraPagerKeyboard.h
@@ -0,0 +1,12 @@
+#include "TCA8418KeyboardBase.h"
+
+class TLoraPagerKeyboard : public TCA8418KeyboardBase
+{
+ public:
+ TLoraPagerKeyboard();
+ void setBacklight(bool on) override{};
+
+ protected:
+ void pressed(uint8_t key) override{};
+ void released(void) override{};
+};
diff --git a/src/input/cardKbI2cImpl.cpp b/src/input/cardKbI2cImpl.cpp
index 21ecf381a..fcbdd0a3f 100644
--- a/src/input/cardKbI2cImpl.cpp
+++ b/src/input/cardKbI2cImpl.cpp
@@ -67,4 +67,5 @@ void CardKbI2cImpl::init()
}
#endif
inputBroker->registerSource(this);
+ kb_found = true;
}
\ No newline at end of file
diff --git a/src/input/kbI2cBase.cpp b/src/input/kbI2cBase.cpp
index 5cc069816..5db1e39a9 100644
--- a/src/input/kbI2cBase.cpp
+++ b/src/input/kbI2cBase.cpp
@@ -3,10 +3,26 @@
#include "detect/ScanI2C.h"
#include "detect/ScanI2CTwoWire.h"
+#if defined(T_DECK_PRO)
+#include "TDeckProKeyboard.h"
+#elif defined(T_LORA_PAGER)
+#include "TLoraPagerKeyboard.h"
+#else
+#include "TCA8418Keyboard.h"
+#endif
+
extern ScanI2C::DeviceAddress cardkb_found;
extern uint8_t kb_model;
-KbI2cBase::KbI2cBase(const char *name) : concurrency::OSThread(name)
+KbI2cBase::KbI2cBase(const char *name)
+ : concurrency::OSThread(name),
+#if defined(T_DECK_PRO)
+ TCAKeyboard(*(new TDeckProKeyboard()))
+#elif defined(T_LORA_PAGER)
+ TCAKeyboard(*(new TLoraPagerKeyboard()))
+#else
+ TCAKeyboard(*(new TCA8418Keyboard()))
+#endif
{
this->_originName = name;
}
@@ -43,8 +59,8 @@ int32_t KbI2cBase::runOnce()
if (cardkb_found.address == MPR121_KB_ADDR) {
MPRkeyboard.begin(MPR121_KB_ADDR, &Wire1);
}
- if (cardkb_found.address == XPOWERS_AXP192_AXP2101_ADDRESS) {
- TCAKeyboard.begin(XPOWERS_AXP192_AXP2101_ADDRESS, &Wire1);
+ if (cardkb_found.address == TCA8418_KB_ADDR) {
+ TCAKeyboard.begin(TCA8418_KB_ADDR, &Wire1);
}
break;
#endif
@@ -58,8 +74,8 @@ int32_t KbI2cBase::runOnce()
if (cardkb_found.address == MPR121_KB_ADDR) {
MPRkeyboard.begin(MPR121_KB_ADDR, &Wire);
}
- if (cardkb_found.address == XPOWERS_AXP192_AXP2101_ADDRESS) {
- TCAKeyboard.begin(XPOWERS_AXP192_AXP2101_ADDRESS, &Wire);
+ if (cardkb_found.address == TCA8418_KB_ADDR) {
+ TCAKeyboard.begin(TCA8418_KB_ADDR, &Wire);
}
break;
case ScanI2C::NO_I2C:
@@ -241,41 +257,65 @@ int32_t KbI2cBase::runOnce()
e.kbchar = 0x00;
e.source = this->_originName;
switch (nextEvent) {
- case _TCA8418_NONE:
+ case TCA8418KeyboardBase::NONE:
e.inputEvent = INPUT_BROKER_NONE;
e.kbchar = 0x00;
break;
- case _TCA8418_REBOOT:
+ case TCA8418KeyboardBase::REBOOT:
e.inputEvent = INPUT_BROKER_ANYKEY;
e.kbchar = INPUT_BROKER_MSG_REBOOT;
break;
- case _TCA8418_LEFT:
+ case TCA8418KeyboardBase::LEFT:
e.inputEvent = INPUT_BROKER_LEFT;
e.kbchar = 0x00;
break;
- case _TCA8418_UP:
+ case TCA8418KeyboardBase::UP:
e.inputEvent = INPUT_BROKER_UP;
e.kbchar = 0x00;
break;
- case _TCA8418_DOWN:
+ case TCA8418KeyboardBase::DOWN:
e.inputEvent = INPUT_BROKER_DOWN;
e.kbchar = 0x00;
break;
- case _TCA8418_RIGHT:
+ case TCA8418KeyboardBase::RIGHT:
e.inputEvent = INPUT_BROKER_RIGHT;
e.kbchar = 0x00;
break;
- case _TCA8418_BSP:
+ case TCA8418KeyboardBase::BSP:
e.inputEvent = INPUT_BROKER_BACK;
e.kbchar = 0x08;
break;
- case _TCA8418_SELECT:
+ case TCA8418KeyboardBase::SELECT:
e.inputEvent = INPUT_BROKER_SELECT;
e.kbchar = 0x00;
break;
- case _TCA8418_ESC:
+ case TCA8418KeyboardBase::ESC:
e.inputEvent = INPUT_BROKER_CANCEL;
- e.kbchar = 0;
+ e.kbchar = 0x00;
+ break;
+ case TCA8418KeyboardBase::GPS_TOGGLE:
+ e.inputEvent = INPUT_BROKER_ANYKEY;
+ e.kbchar = INPUT_BROKER_GPS_TOGGLE;
+ break;
+ case TCA8418KeyboardBase::SEND_PING:
+ e.inputEvent = INPUT_BROKER_ANYKEY;
+ e.kbchar = INPUT_BROKER_SEND_PING;
+ break;
+ case TCA8418KeyboardBase::MUTE_TOGGLE:
+ e.inputEvent = INPUT_BROKER_ANYKEY;
+ e.kbchar = INPUT_BROKER_MSG_MUTE_TOGGLE;
+ break;
+ case TCA8418KeyboardBase::BT_TOGGLE:
+ e.inputEvent = INPUT_BROKER_ANYKEY;
+ e.kbchar = INPUT_BROKER_MSG_BLUETOOTH_TOGGLE;
+ break;
+ case TCA8418KeyboardBase::BL_TOGGLE:
+ e.inputEvent = INPUT_BROKER_ANYKEY;
+ e.kbchar = INPUT_BROKER_MSG_BLUETOOTH_TOGGLE;
+ break;
+ case TCA8418KeyboardBase::TAB:
+ e.inputEvent = INPUT_BROKER_ANYKEY;
+ e.kbchar = INPUT_BROKER_MSG_TAB;
break;
default:
if (nextEvent > 127) {
@@ -291,6 +331,7 @@ int32_t KbI2cBase::runOnce()
LOG_DEBUG("TCA8418 Notifying: %i Char: %c", e.inputEvent, e.kbchar);
this->notifyObservers(&e);
}
+ TCAKeyboard.trigger();
}
break;
}
diff --git a/src/input/kbI2cBase.h b/src/input/kbI2cBase.h
index 8193433fe..af7602979 100644
--- a/src/input/kbI2cBase.h
+++ b/src/input/kbI2cBase.h
@@ -3,10 +3,11 @@
#include "BBQ10Keyboard.h"
#include "InputBroker.h"
#include "MPR121Keyboard.h"
-#include "TCA8418Keyboard.h"
#include "Wire.h"
#include "concurrency/OSThread.h"
+class TCA8418KeyboardBase;
+
class KbI2cBase : public Observable, public concurrency::OSThread
{
public:
@@ -22,6 +23,6 @@ class KbI2cBase : public Observable, public concurrency::OST
BBQ10Keyboard Q10keyboard;
MPR121Keyboard MPRkeyboard;
- TCA8418Keyboard TCAKeyboard;
+ TCA8418KeyboardBase &TCAKeyboard;
bool is_sym = false;
};
\ No newline at end of file
diff --git a/src/main.cpp b/src/main.cpp
index 773145951..c3e7c2a33 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -286,7 +286,7 @@ void lateInitVariant() {}
*/
void printInfo()
{
- LOG_INFO("S:B:%d,%s", HW_VENDOR, optstr(APP_VERSION));
+ LOG_INFO("S:B:%d,%s,%s,%s", HW_VENDOR, optstr(APP_VERSION), optstr(APP_ENV), optstr(APP_REPO));
}
#ifndef PIO_UNIT_TESTING
void setup()
@@ -335,6 +335,15 @@ void setup()
pinMode(TFT_CS, OUTPUT);
digitalWrite(TFT_CS, HIGH);
delay(100);
+#elif defined(T_DECK_PRO)
+ pinMode(LORA_EN, OUTPUT);
+ digitalWrite(LORA_EN, HIGH);
+ pinMode(LORA_CS, OUTPUT);
+ digitalWrite(LORA_CS, HIGH);
+ pinMode(SDCARD_CS, OUTPUT);
+ digitalWrite(SDCARD_CS, HIGH);
+ pinMode(PIN_EINK_CS, OUTPUT);
+ digitalWrite(PIN_EINK_CS, HIGH);
#endif
concurrency::hasBeenSetup = true;
@@ -515,25 +524,11 @@ void setup()
LOG_INFO("Scan for i2c devices");
#endif
-#if defined(I2C_SDA1) && defined(ARCH_RP2040)
- Wire1.setSDA(I2C_SDA1);
- Wire1.setSCL(I2C_SCL1);
- Wire1.begin();
- i2cScanner->scanPort(ScanI2C::I2CPort::WIRE1);
-#elif defined(I2C_SDA1) && !defined(ARCH_RP2040)
- Wire1.begin(I2C_SDA1, I2C_SCL1);
- i2cScanner->scanPort(ScanI2C::I2CPort::WIRE1);
-#elif defined(NRF52840_XXAA) && (WIRE_INTERFACES_COUNT == 2)
+#if defined(I2C_SDA1) || (defined(NRF52840_XXAA) && (WIRE_INTERFACES_COUNT == 2))
i2cScanner->scanPort(ScanI2C::I2CPort::WIRE1);
#endif
-#if defined(I2C_SDA) && defined(ARCH_RP2040)
- Wire.setSDA(I2C_SDA);
- Wire.setSCL(I2C_SCL);
- Wire.begin();
- i2cScanner->scanPort(ScanI2C::I2CPort::WIRE);
-#elif defined(I2C_SDA) && !defined(ARCH_RP2040)
- Wire.begin(I2C_SDA, I2C_SCL);
+#if defined(I2C_SDA)
i2cScanner->scanPort(ScanI2C::I2CPort::WIRE);
#elif defined(ARCH_PORTDUINO)
if (settingsStrings[i2cdev] != "") {
@@ -1056,8 +1051,9 @@ void setup()
mainDelay.interruptFromISR(&higherWake);
};
userConfigNoScreen.singlePress = INPUT_BROKER_USER_PRESS;
- userConfigNoScreen.longPress = INPUT_BROKER_SHUTDOWN;
- userConfigNoScreen.longPressTime = 5000;
+ userConfigNoScreen.longPress = INPUT_BROKER_NONE;
+ userConfigNoScreen.longPressTime = 500;
+ userConfigNoScreen.longLongPress = INPUT_BROKER_SHUTDOWN;
userConfigNoScreen.doublePress = INPUT_BROKER_SEND_PING;
userConfigNoScreen.triplePress = INPUT_BROKER_GPS_TOGGLE;
UserButtonThread->initButton(userConfigNoScreen);
diff --git a/src/memGet.cpp b/src/memGet.cpp
index ef1102f1e..e8cd177dd 100644
--- a/src/memGet.cpp
+++ b/src/memGet.cpp
@@ -10,6 +10,10 @@
#include "memGet.h"
#include "configuration.h"
+#ifdef ARCH_STM32WL
+#include
+#endif
+
MemGet memGet;
/**
@@ -24,6 +28,9 @@ uint32_t MemGet::getFreeHeap()
return dbgHeapFree();
#elif defined(ARCH_RP2040)
return rp2040.getFreeHeap();
+#elif defined(ARCH_STM32WL)
+ struct mallinfo m = mallinfo();
+ return m.fordblks; // Total free space (bytes)
#else
// this platform does not have heap management function implemented
return UINT32_MAX;
@@ -42,6 +49,9 @@ uint32_t MemGet::getHeapSize()
return dbgHeapTotal();
#elif defined(ARCH_RP2040)
return rp2040.getTotalHeap();
+#elif defined(ARCH_STM32WL)
+ struct mallinfo m = mallinfo();
+ return m.arena; // Non-mmapped space allocated (bytes)
#else
// this platform does not have heap management function implemented
return UINT32_MAX;
diff --git a/src/mesh/MeshPacketQueue.cpp b/src/mesh/MeshPacketQueue.cpp
index f8af81321..a64678a7f 100644
--- a/src/mesh/MeshPacketQueue.cpp
+++ b/src/mesh/MeshPacketQueue.cpp
@@ -121,7 +121,7 @@ meshtastic_MeshPacket *MeshPacketQueue::remove(NodeNum from, PacketId id, bool t
bool MeshPacketQueue::find(const NodeNum from, const PacketId id)
{
for (auto it = queue.begin(); it != queue.end(); it++) {
- const auto p = (*it);
+ const auto *p = *it;
if (getFrom(p) == from && p->id == id) {
return true;
}
diff --git a/src/mesh/MeshService.cpp b/src/mesh/MeshService.cpp
index 297c7b2ed..2cc4197c1 100644
--- a/src/mesh/MeshService.cpp
+++ b/src/mesh/MeshService.cpp
@@ -16,6 +16,7 @@
#include "meshUtils.h"
#include "modules/NodeInfoModule.h"
#include "modules/PositionModule.h"
+#include "modules/RoutingModule.h"
#include "power.h"
#include
#include
@@ -333,6 +334,21 @@ void MeshService::sendMqttMessageToClientProxy(meshtastic_MqttClientProxyMessage
fromNum++;
}
+void MeshService::sendRoutingErrorResponse(meshtastic_Routing_Error error, const meshtastic_MeshPacket *mp)
+{
+ if (!mp) {
+ LOG_WARN("Cannot send routing error response: null packet");
+ return;
+ }
+
+ // Use the routing module to send the error response
+ if (routingModule) {
+ routingModule->sendAckNak(error, mp->from, mp->id, mp->channel);
+ } else {
+ LOG_ERROR("Cannot send routing error response: no routing module");
+ }
+}
+
void MeshService::sendClientNotification(meshtastic_ClientNotification *n)
{
LOG_DEBUG("Send client notification to phone");
diff --git a/src/mesh/MeshService.h b/src/mesh/MeshService.h
index e2e430c03..89d3b15d0 100644
--- a/src/mesh/MeshService.h
+++ b/src/mesh/MeshService.h
@@ -148,6 +148,9 @@ class MeshService
/// Send a ClientNotification to the phone
void sendClientNotification(meshtastic_ClientNotification *cn);
+ /// Send an error response to the phone
+ void sendRoutingErrorResponse(meshtastic_Routing_Error error, const meshtastic_MeshPacket *mp);
+
bool isToPhoneQueueEmpty();
ErrorCode sendQueueStatusToPhone(const meshtastic_QueueStatus &qs, ErrorCode res, uint32_t mesh_packet_id);
diff --git a/src/mesh/NodeDB.cpp b/src/mesh/NodeDB.cpp
index 185ea0744..38e213167 100644
--- a/src/mesh/NodeDB.cpp
+++ b/src/mesh/NodeDB.cpp
@@ -735,7 +735,6 @@ void NodeDB::installDefaultConfig(bool preserveKey = false)
config.display.screen_on_secs = 30;
config.display.wake_on_tap_or_motion = true;
#endif
-
#if defined(ARCH_ESP32) && !MESHTASTIC_EXCLUDE_WIFI
if (WiFiOTA::isUpdated()) {
WiFiOTA::recoverConfig(&config.network);
@@ -796,6 +795,13 @@ void NodeDB::installDefaultModuleConfig()
moduleConfig.external_notification.alert_message_buzzer = true;
moduleConfig.external_notification.nag_timeout = default_ringtone_nag_secs;
#endif
+#if defined(PIN_VIBRATION)
+ moduleConfig.external_notification.enabled = true;
+ moduleConfig.external_notification.output_vibra = PIN_VIBRATION;
+ moduleConfig.external_notification.alert_message_vibra = true;
+ moduleConfig.external_notification.output_ms = 500;
+ moduleConfig.external_notification.nag_timeout = 2;
+#endif
#if defined(RAK4630) || defined(RAK11310) || defined(RAK3312)
// Default to RAK led pin 2 (blue)
moduleConfig.external_notification.enabled = true;
@@ -1868,7 +1874,7 @@ UserLicenseStatus NodeDB::getLicenseStatus(uint32_t nodeNum)
return info->user.is_licensed ? UserLicenseStatus::Licensed : UserLicenseStatus::NotLicensed;
}
-bool NodeDB::checkLowEntropyPublicKey(const meshtastic_Config_SecurityConfig_public_key_t keyToTest)
+bool NodeDB::checkLowEntropyPublicKey(const meshtastic_Config_SecurityConfig_public_key_t &keyToTest)
{
if (keyToTest.size == 32) {
uint8_t keyHash[32] = {0};
diff --git a/src/mesh/NodeDB.h b/src/mesh/NodeDB.h
index 845f42c76..19fb67b73 100644
--- a/src/mesh/NodeDB.h
+++ b/src/mesh/NodeDB.h
@@ -279,7 +279,7 @@ class NodeDB
bool hasValidPosition(const meshtastic_NodeInfoLite *n);
- bool checkLowEntropyPublicKey(const meshtastic_Config_SecurityConfig_public_key_t keyToTest);
+ bool checkLowEntropyPublicKey(const meshtastic_Config_SecurityConfig_public_key_t &keyToTest);
bool backupPreferences(meshtastic_AdminMessage_BackupLocation location);
bool restorePreferences(meshtastic_AdminMessage_BackupLocation location,
diff --git a/src/mesh/PacketHistory.cpp b/src/mesh/PacketHistory.cpp
index 8cac31a3e..3902c1057 100644
--- a/src/mesh/PacketHistory.cpp
+++ b/src/mesh/PacketHistory.cpp
@@ -181,7 +181,7 @@ PacketHistory::PacketRecord *PacketHistory::find(NodeNum sender, PacketId id)
}
/** Insert/Replace oldest PacketRecord in recentPackets. */
-void PacketHistory::insert(PacketRecord &r)
+void PacketHistory::insert(const PacketRecord &r)
{
uint32_t now_millis = millis(); // Should not jump with time changes
uint32_t OldtrxTimeMsec = 0;
@@ -308,7 +308,7 @@ bool PacketHistory::wasRelayer(const uint8_t relayer, const uint32_t id, const N
return false;
}
- PacketRecord *found = find(sender, id);
+ const PacketRecord *found = find(sender, id);
if (found == NULL) {
#if VERBOSE_PACKET_HISTORY
@@ -327,7 +327,7 @@ bool PacketHistory::wasRelayer(const uint8_t relayer, const uint32_t id, const N
/* Check if a certain node was a relayer of a packet in the history given iterator
* @return true if node was indeed a relayer, false if not */
-bool PacketHistory::wasRelayer(const uint8_t relayer, PacketRecord &r)
+bool PacketHistory::wasRelayer(const uint8_t relayer, const PacketRecord &r)
{
for (uint8_t i = 0; i < NUM_RELAYERS; i++) {
if (r.relayed_by[i] == relayer) {
diff --git a/src/mesh/PacketHistory.h b/src/mesh/PacketHistory.h
index d06c9bd2f..9f14a4cf0 100644
--- a/src/mesh/PacketHistory.h
+++ b/src/mesh/PacketHistory.h
@@ -31,11 +31,11 @@ class PacketHistory
/** Insert/Replace oldest PacketRecord in mx_recentPackets.
* @param r PacketRecord to insert or replace */
- void insert(PacketRecord &r); // Insert or replace a packet record in the history
+ void insert(const PacketRecord &r); // Insert or replace a packet record in the history
/* Check if a certain node was a relayer of a packet in the history given iterator
* @return true if node was indeed a relayer, false if not */
- bool wasRelayer(const uint8_t relayer, PacketRecord &r);
+ bool wasRelayer(const uint8_t relayer, const PacketRecord &r);
PacketHistory(const PacketHistory &); // non construction-copyable
PacketHistory &operator=(const PacketHistory &); // non copyable
diff --git a/src/mesh/PhoneAPI.cpp b/src/mesh/PhoneAPI.cpp
index 287de38fa..e0b81bedd 100644
--- a/src/mesh/PhoneAPI.cpp
+++ b/src/mesh/PhoneAPI.cpp
@@ -686,7 +686,8 @@ bool PhoneAPI::handleToRadioPacket(meshtastic_MeshPacket &p)
LOG_WARN("Rate limit portnum %d", p.decoded.portnum);
meshtastic_QueueStatus qs = router->getQueueStatus();
service->sendQueueStatusToPhone(qs, 0, p.id);
- sendNotification(meshtastic_LogRecord_Level_WARNING, p.id, "Text messages can only be sent once every 2 seconds");
+ service->sendRoutingErrorResponse(meshtastic_Routing_Error_RATE_LIMIT_EXCEEDED, &p);
+ // sendNotification(meshtastic_LogRecord_Level_WARNING, p.id, "Text messages can only be sent once every 2 seconds");
return false;
}
lastPortNumToRadio[p.decoded.portnum] = millis();
diff --git a/src/mesh/eth/ethClient.cpp b/src/mesh/eth/ethClient.cpp
index 9c92a6c27..2b4f63512 100644
--- a/src/mesh/eth/ethClient.cpp
+++ b/src/mesh/eth/ethClient.cpp
@@ -68,6 +68,11 @@ static int32_t reconnectETH()
initApiServer();
}
#endif
+#if HAS_UDP_MULTICAST
+ if (udpHandler && config.network.enabled_protocols & meshtastic_Config_NetworkConfig_ProtocolFlags_UDP_BROADCAST) {
+ udpHandler->start();
+ }
+#endif
ethStartupComplete = true;
}
diff --git a/src/mesh/eth/ethClient.h b/src/mesh/eth/ethClient.h
index 9e1745b9f..3adf481d2 100644
--- a/src/mesh/eth/ethClient.h
+++ b/src/mesh/eth/ethClient.h
@@ -2,7 +2,6 @@
#include "configuration.h"
#include
-#include
bool initEthernet();
bool isEthernetAvailable();
diff --git a/src/mesh/generated/meshtastic/admin.pb.h b/src/mesh/generated/meshtastic/admin.pb.h
index 071640b0d..bc0b780b9 100644
--- a/src/mesh/generated/meshtastic/admin.pb.h
+++ b/src/mesh/generated/meshtastic/admin.pb.h
@@ -7,9 +7,9 @@
#include "meshtastic/channel.pb.h"
#include "meshtastic/config.pb.h"
#include "meshtastic/connection_status.pb.h"
+#include "meshtastic/device_ui.pb.h"
#include "meshtastic/mesh.pb.h"
#include "meshtastic/module_config.pb.h"
-#include "meshtastic/device_ui.pb.h"
#if PB_PROTO_HEADER_VERSION != 40
#error Regenerate this file with the current version of nanopb generator.
diff --git a/src/mesh/generated/meshtastic/config.pb.h b/src/mesh/generated/meshtastic/config.pb.h
index f28daadbd..8a68197f0 100644
--- a/src/mesh/generated/meshtastic/config.pb.h
+++ b/src/mesh/generated/meshtastic/config.pb.h
@@ -102,7 +102,11 @@ typedef enum _meshtastic_Config_DeviceConfig_BuzzerMode {
meshtastic_Config_DeviceConfig_BuzzerMode_NOTIFICATIONS_ONLY = 2,
/* Non-notification system buzzer tones only.
Buzzer is enabled only for non-notification tones such as button presses, startup, shutdown, but not for alerts. */
- meshtastic_Config_DeviceConfig_BuzzerMode_SYSTEM_ONLY = 3
+ meshtastic_Config_DeviceConfig_BuzzerMode_SYSTEM_ONLY = 3,
+ /* Direct Message notifications only.
+ Buzzer is enabled only for direct messages and alerts, but not for button presses.
+ External notification config determines the specifics of the notification behavior. */
+ meshtastic_Config_DeviceConfig_BuzzerMode_DIRECT_MSG_ONLY = 4
} meshtastic_Config_DeviceConfig_BuzzerMode;
/* Bit field of boolean configuration options, indicating which optional
@@ -289,7 +293,11 @@ typedef enum _meshtastic_Config_LoRaConfig_RegionCode {
/* Kazakhstan 433MHz */
meshtastic_Config_LoRaConfig_RegionCode_KZ_433 = 23,
/* Kazakhstan 863MHz */
- meshtastic_Config_LoRaConfig_RegionCode_KZ_863 = 24
+ meshtastic_Config_LoRaConfig_RegionCode_KZ_863 = 24,
+ /* Nepal 865MHz */
+ meshtastic_Config_LoRaConfig_RegionCode_NP_865 = 25,
+ /* Brazil 902MHz */
+ meshtastic_Config_LoRaConfig_RegionCode_BR_902 = 26
} meshtastic_Config_LoRaConfig_RegionCode;
/* Standard predefined channel settings
@@ -476,7 +484,8 @@ typedef struct _meshtastic_Config_DisplayConfig {
/* Number of seconds the screen stays on after pressing the user button or receiving a message
0 for default of one minute MAXUINT for always on */
uint32_t screen_on_secs;
- /* How the GPS coordinates are formatted on the OLED screen. */
+ /* Deprecated in 2.7.4: Unused
+ How the GPS coordinates are formatted on the OLED screen. */
meshtastic_Config_DisplayConfig_GpsCoordinateFormat gps_format;
/* Automatically toggles to the next page on the screen like a carousel, based the specified interval in seconds.
Potentially useful for devices without user buttons. */
@@ -645,8 +654,8 @@ extern "C" {
#define _meshtastic_Config_DeviceConfig_RebroadcastMode_ARRAYSIZE ((meshtastic_Config_DeviceConfig_RebroadcastMode)(meshtastic_Config_DeviceConfig_RebroadcastMode_CORE_PORTNUMS_ONLY+1))
#define _meshtastic_Config_DeviceConfig_BuzzerMode_MIN meshtastic_Config_DeviceConfig_BuzzerMode_ALL_ENABLED
-#define _meshtastic_Config_DeviceConfig_BuzzerMode_MAX meshtastic_Config_DeviceConfig_BuzzerMode_SYSTEM_ONLY
-#define _meshtastic_Config_DeviceConfig_BuzzerMode_ARRAYSIZE ((meshtastic_Config_DeviceConfig_BuzzerMode)(meshtastic_Config_DeviceConfig_BuzzerMode_SYSTEM_ONLY+1))
+#define _meshtastic_Config_DeviceConfig_BuzzerMode_MAX meshtastic_Config_DeviceConfig_BuzzerMode_DIRECT_MSG_ONLY
+#define _meshtastic_Config_DeviceConfig_BuzzerMode_ARRAYSIZE ((meshtastic_Config_DeviceConfig_BuzzerMode)(meshtastic_Config_DeviceConfig_BuzzerMode_DIRECT_MSG_ONLY+1))
#define _meshtastic_Config_PositionConfig_PositionFlags_MIN meshtastic_Config_PositionConfig_PositionFlags_UNSET
#define _meshtastic_Config_PositionConfig_PositionFlags_MAX meshtastic_Config_PositionConfig_PositionFlags_SPEED
@@ -685,8 +694,8 @@ extern "C" {
#define _meshtastic_Config_DisplayConfig_CompassOrientation_ARRAYSIZE ((meshtastic_Config_DisplayConfig_CompassOrientation)(meshtastic_Config_DisplayConfig_CompassOrientation_DEGREES_270_INVERTED+1))
#define _meshtastic_Config_LoRaConfig_RegionCode_MIN meshtastic_Config_LoRaConfig_RegionCode_UNSET
-#define _meshtastic_Config_LoRaConfig_RegionCode_MAX meshtastic_Config_LoRaConfig_RegionCode_KZ_863
-#define _meshtastic_Config_LoRaConfig_RegionCode_ARRAYSIZE ((meshtastic_Config_LoRaConfig_RegionCode)(meshtastic_Config_LoRaConfig_RegionCode_KZ_863+1))
+#define _meshtastic_Config_LoRaConfig_RegionCode_MAX meshtastic_Config_LoRaConfig_RegionCode_BR_902
+#define _meshtastic_Config_LoRaConfig_RegionCode_ARRAYSIZE ((meshtastic_Config_LoRaConfig_RegionCode)(meshtastic_Config_LoRaConfig_RegionCode_BR_902+1))
#define _meshtastic_Config_LoRaConfig_ModemPreset_MIN meshtastic_Config_LoRaConfig_ModemPreset_LONG_FAST
#define _meshtastic_Config_LoRaConfig_ModemPreset_MAX meshtastic_Config_LoRaConfig_ModemPreset_SHORT_TURBO
diff --git a/src/mesh/generated/meshtastic/deviceonly.pb.h b/src/mesh/generated/meshtastic/deviceonly.pb.h
index f78689cb2..b02b2083d 100644
--- a/src/mesh/generated/meshtastic/deviceonly.pb.h
+++ b/src/mesh/generated/meshtastic/deviceonly.pb.h
@@ -6,10 +6,10 @@
#include
#include
#include "meshtastic/channel.pb.h"
-#include "meshtastic/mesh.pb.h"
-#include "meshtastic/telemetry.pb.h"
#include "meshtastic/config.pb.h"
#include "meshtastic/localonly.pb.h"
+#include "meshtastic/mesh.pb.h"
+#include "meshtastic/telemetry.pb.h"
#if PB_PROTO_HEADER_VERSION != 40
#error Regenerate this file with the current version of nanopb generator.
diff --git a/src/mesh/generated/meshtastic/mesh.pb.h b/src/mesh/generated/meshtastic/mesh.pb.h
index 9e0415198..d1a38b565 100644
--- a/src/mesh/generated/meshtastic/mesh.pb.h
+++ b/src/mesh/generated/meshtastic/mesh.pb.h
@@ -6,11 +6,11 @@
#include
#include "meshtastic/channel.pb.h"
#include "meshtastic/config.pb.h"
+#include "meshtastic/device_ui.pb.h"
#include "meshtastic/module_config.pb.h"
#include "meshtastic/portnums.pb.h"
#include "meshtastic/telemetry.pb.h"
#include "meshtastic/xmodem.pb.h"
-#include "meshtastic/device_ui.pb.h"
#if PB_PROTO_HEADER_VERSION != 40
#error Regenerate this file with the current version of nanopb generator.
@@ -247,32 +247,26 @@ typedef enum _meshtastic_HardwareModel {
meshtastic_HardwareModel_NOMADSTAR_METEOR_PRO = 96,
/* Elecrow CrowPanel Advance models, ESP32-S3 and TFT with SX1262 radio plugin */
meshtastic_HardwareModel_CROWPANEL = 97,
- /* *
- Lilygo LINK32 board with sensors */
+ /* Lilygo LINK32 board with sensors */
meshtastic_HardwareModel_LINK_32 = 98,
- /* *
- Seeed Tracker L1 */
+ /* Seeed Tracker L1 */
meshtastic_HardwareModel_SEEED_WIO_TRACKER_L1 = 99,
- /* *
- Seeed Tracker L1 EINK driver */
+ /* Seeed Tracker L1 EINK driver */
meshtastic_HardwareModel_SEEED_WIO_TRACKER_L1_EINK = 100,
/* Reserved ID for future and past use */
meshtastic_HardwareModel_QWANTZ_TINY_ARMS = 101,
- /* *
- Lilygo T-Deck Pro */
+ /* Lilygo T-Deck Pro */
meshtastic_HardwareModel_T_DECK_PRO = 102,
- /* *
- Lilygo TLora Pager */
+ /* Lilygo TLora Pager */
meshtastic_HardwareModel_T_LORA_PAGER = 103,
- /* *
- GAT562 Mesh Trial Tracker */
+ /* GAT562 Mesh Trial Tracker */
meshtastic_HardwareModel_GAT562_MESH_TRIAL_TRACKER = 104,
- /* *
- RAKwireless WisMesh Tag */
+ /* RAKwireless WisMesh Tag */
meshtastic_HardwareModel_WISMESH_TAG = 105,
- /* *
- RAKwireless WisBlock Core RAK3312 https://docs.rakwireless.com/product-categories/wisduo/rak3112-module/overview/ */
+ /* RAKwireless WisBlock Core RAK3312 https://docs.rakwireless.com/product-categories/wisduo/rak3112-module/overview/ */
meshtastic_HardwareModel_RAK3312 = 106,
+ /* Elecrow ThinkNode M5 https://www.elecrow.com/wiki/ThinkNode_M5_Meshtastic_LoRa_Signal_Transceiver_ESP32-S3.html */
+ meshtastic_HardwareModel_THINKNODE_M5 = 107,
/* ------------------------------------------------------------------------------------------------------------------------------------------
Reserved ID For developing private Ports. These will show up in live traffic sparsely, so we can use a high number. Keep it within 8 bits.
------------------------------------------------------------------------------------------------------------------------------------------ */
@@ -432,7 +426,10 @@ typedef enum _meshtastic_Routing_Error {
/* Admin packet otherwise checks out, but uses a bogus or expired session key */
meshtastic_Routing_Error_ADMIN_BAD_SESSION_KEY = 36,
/* Admin packet sent using PKC, but not from a public key on the admin key list */
- meshtastic_Routing_Error_ADMIN_PUBLIC_KEY_UNAUTHORIZED = 37
+ meshtastic_Routing_Error_ADMIN_PUBLIC_KEY_UNAUTHORIZED = 37,
+ /* Airtime fairness rate limit exceeded for a packet
+ This typically enforced per portnum and is used to prevent a single node from monopolizing airtime */
+ meshtastic_Routing_Error_RATE_LIMIT_EXCEEDED = 38
} meshtastic_Routing_Error;
/* The priority of this message for sending.
@@ -1228,8 +1225,8 @@ extern "C" {
#define _meshtastic_Position_AltSource_ARRAYSIZE ((meshtastic_Position_AltSource)(meshtastic_Position_AltSource_ALT_BAROMETRIC+1))
#define _meshtastic_Routing_Error_MIN meshtastic_Routing_Error_NONE
-#define _meshtastic_Routing_Error_MAX meshtastic_Routing_Error_ADMIN_PUBLIC_KEY_UNAUTHORIZED
-#define _meshtastic_Routing_Error_ARRAYSIZE ((meshtastic_Routing_Error)(meshtastic_Routing_Error_ADMIN_PUBLIC_KEY_UNAUTHORIZED+1))
+#define _meshtastic_Routing_Error_MAX meshtastic_Routing_Error_RATE_LIMIT_EXCEEDED
+#define _meshtastic_Routing_Error_ARRAYSIZE ((meshtastic_Routing_Error)(meshtastic_Routing_Error_RATE_LIMIT_EXCEEDED+1))
#define _meshtastic_MeshPacket_Priority_MIN meshtastic_MeshPacket_Priority_UNSET
#define _meshtastic_MeshPacket_Priority_MAX meshtastic_MeshPacket_Priority_MAX
diff --git a/src/mesh/generated/meshtastic/powermon.pb.h b/src/mesh/generated/meshtastic/powermon.pb.h
index 9d4d94193..3072b8ac5 100644
--- a/src/mesh/generated/meshtastic/powermon.pb.h
+++ b/src/mesh/generated/meshtastic/powermon.pb.h
@@ -11,7 +11,7 @@
/* Enum definitions */
/* Any significant power changing event in meshtastic should be tagged with a powermon state transition.
-If you are making new meshtastic features feel free to add new entries at the end of this definition. */
+ If you are making new meshtastic features feel free to add new entries at the end of this definition. */
typedef enum _meshtastic_PowerMon_State {
meshtastic_PowerMon_State_None = 0,
meshtastic_PowerMon_State_CPU_DeepSleep = 1,
@@ -34,13 +34,13 @@ something like "S:PM:C,0x00001234,REASON" where the hex number is the bitmask of
meshtastic_PowerMon_State_Screen_Drawing = 512,
meshtastic_PowerMon_State_Wifi_On = 1024,
/* GPS is actively trying to find our location
-See GPSPowerState for more details */
+ See GPSPowerState for more details */
meshtastic_PowerMon_State_GPS_Active = 2048
} meshtastic_PowerMon_State;
/* What operation would we like the UUT to perform.
-note: senders should probably set want_response in their request packets, so that they can know when the state
-machine has started processing their request */
+ note: senders should probably set want_response in their request packets, so that they can know when the state
+ machine has started processing their request */
typedef enum _meshtastic_PowerStressMessage_Opcode {
/* Unset/unused */
meshtastic_PowerStressMessage_Opcode_UNSET = 0,
@@ -67,7 +67,7 @@ typedef enum _meshtastic_PowerStressMessage_Opcode {
/* Struct definitions */
/* Note: There are no 'PowerMon' messages normally in use (PowerMons are sent only as structured logs - slogs).
-But we wrap our State enum in this message to effectively nest a namespace (without our linter yelling at us) */
+ But we wrap our State enum in this message to effectively nest a namespace (without our linter yelling at us) */
typedef struct _meshtastic_PowerMon {
char dummy_field;
} meshtastic_PowerMon;
diff --git a/src/mesh/generated/meshtastic/telemetry.pb.h b/src/mesh/generated/meshtastic/telemetry.pb.h
index 072a99a24..f758995c2 100644
--- a/src/mesh/generated/meshtastic/telemetry.pb.h
+++ b/src/mesh/generated/meshtastic/telemetry.pb.h
@@ -93,7 +93,13 @@ typedef enum _meshtastic_TelemetrySensorType {
/* PCT2075 Temperature Sensor */
meshtastic_TelemetrySensorType_PCT2075 = 39,
/* ADS1X15 ADC */
- meshtastic_TelemetrySensorType_ADS1X15 = 40
+ meshtastic_TelemetrySensorType_ADS1X15 = 40,
+ /* ADS1X15 ADC_ALT */
+ meshtastic_TelemetrySensorType_ADS1X15_ALT = 41,
+ /* Sensirion SFA30 Formaldehyde sensor */
+ meshtastic_TelemetrySensorType_SFA30 = 42,
+ /* SEN5X PM SENSORS */
+ meshtastic_TelemetrySensorType_SEN5X = 43
} meshtastic_TelemetrySensorType;
/* Struct definitions */
@@ -242,40 +248,40 @@ typedef struct _meshtastic_PowerMetrics {
/* Air quality metrics */
typedef struct _meshtastic_AirQualityMetrics {
- /* Concentration Units Standard PM1.0 */
+ /* Concentration Units Standard PM1.0 in ug/m3 */
bool has_pm10_standard;
uint32_t pm10_standard;
- /* Concentration Units Standard PM2.5 */
+ /* Concentration Units Standard PM2.5 in ug/m3 */
bool has_pm25_standard;
uint32_t pm25_standard;
- /* Concentration Units Standard PM10.0 */
+ /* Concentration Units Standard PM10.0 in ug/m3 */
bool has_pm100_standard;
uint32_t pm100_standard;
- /* Concentration Units Environmental PM1.0 */
+ /* Concentration Units Environmental PM1.0 in ug/m3 */
bool has_pm10_environmental;
uint32_t pm10_environmental;
- /* Concentration Units Environmental PM2.5 */
+ /* Concentration Units Environmental PM2.5 in ug/m3 */
bool has_pm25_environmental;
uint32_t pm25_environmental;
- /* Concentration Units Environmental PM10.0 */
+ /* Concentration Units Environmental PM10.0 in ug/m3 */
bool has_pm100_environmental;
uint32_t pm100_environmental;
- /* 0.3um Particle Count */
+ /* 0.3um Particle Count in #/0.1l */
bool has_particles_03um;
uint32_t particles_03um;
- /* 0.5um Particle Count */
+ /* 0.5um Particle Count in #/0.1l */
bool has_particles_05um;
uint32_t particles_05um;
- /* 1.0um Particle Count */
+ /* 1.0um Particle Count in #/0.1l */
bool has_particles_10um;
uint32_t particles_10um;
- /* 2.5um Particle Count */
+ /* 2.5um Particle Count in #/0.1l */
bool has_particles_25um;
uint32_t particles_25um;
- /* 5.0um Particle Count */
+ /* 5.0um Particle Count in #/0.1l */
bool has_particles_50um;
uint32_t particles_50um;
- /* 10.0um Particle Count */
+ /* 10.0um Particle Count in #/0.1l */
bool has_particles_100um;
uint32_t particles_100um;
/* CO2 concentration in ppm */
@@ -287,6 +293,36 @@ typedef struct _meshtastic_AirQualityMetrics {
/* CO2 sensor relative humidity in % */
bool has_co2_humidity;
float co2_humidity;
+ /* Formaldehyde sensor formaldehyde concentration in ppb */
+ bool has_form_formaldehyde;
+ float form_formaldehyde;
+ /* Formaldehyde sensor relative humidity in %RH */
+ bool has_form_humidity;
+ float form_humidity;
+ /* Formaldehyde sensor temperature in degrees Celsius */
+ bool has_form_temperature;
+ float form_temperature;
+ /* Concentration Units Standard PM4.0 in ug/m3 */
+ bool has_pm40_standard;
+ uint32_t pm40_standard;
+ /* 4.0um Particle Count in #/0.1l */
+ bool has_particles_40um;
+ uint32_t particles_40um;
+ /* PM Sensor Temperature */
+ bool has_pm_temperature;
+ float pm_temperature;
+ /* PM Sensor humidity */
+ bool has_pm_humidity;
+ float pm_humidity;
+ /* PM Sensor VOC Index */
+ bool has_pm_voc_idx;
+ float pm_voc_idx;
+ /* PM Sensor NOx Index */
+ bool has_pm_nox_idx;
+ float pm_nox_idx;
+ /* Typical Particle Size in um */
+ bool has_particles_tps;
+ float particles_tps;
} meshtastic_AirQualityMetrics;
/* Local device mesh statistics */
@@ -398,8 +434,8 @@ extern "C" {
/* Helper constants for enums */
#define _meshtastic_TelemetrySensorType_MIN meshtastic_TelemetrySensorType_SENSOR_UNSET
-#define _meshtastic_TelemetrySensorType_MAX meshtastic_TelemetrySensorType_ADS1X15
-#define _meshtastic_TelemetrySensorType_ARRAYSIZE ((meshtastic_TelemetrySensorType)(meshtastic_TelemetrySensorType_ADS1X15+1))
+#define _meshtastic_TelemetrySensorType_MAX meshtastic_TelemetrySensorType_SEN5X
+#define _meshtastic_TelemetrySensorType_ARRAYSIZE ((meshtastic_TelemetrySensorType)(meshtastic_TelemetrySensorType_SEN5X+1))
@@ -415,7 +451,7 @@ extern "C" {
#define meshtastic_DeviceMetrics_init_default {false, 0, false, 0, false, 0, false, 0, false, 0}
#define meshtastic_EnvironmentMetrics_init_default {false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0}
#define meshtastic_PowerMetrics_init_default {false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0}
-#define meshtastic_AirQualityMetrics_init_default {false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0}
+#define meshtastic_AirQualityMetrics_init_default {false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0}
#define meshtastic_LocalStats_init_default {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
#define meshtastic_HealthMetrics_init_default {false, 0, false, 0, false, 0}
#define meshtastic_HostMetrics_init_default {0, 0, 0, false, 0, false, 0, 0, 0, 0, false, ""}
@@ -424,7 +460,7 @@ extern "C" {
#define meshtastic_DeviceMetrics_init_zero {false, 0, false, 0, false, 0, false, 0, false, 0}
#define meshtastic_EnvironmentMetrics_init_zero {false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0}
#define meshtastic_PowerMetrics_init_zero {false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0}
-#define meshtastic_AirQualityMetrics_init_zero {false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0}
+#define meshtastic_AirQualityMetrics_init_zero {false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0}
#define meshtastic_LocalStats_init_zero {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
#define meshtastic_HealthMetrics_init_zero {false, 0, false, 0, false, 0}
#define meshtastic_HostMetrics_init_zero {0, 0, 0, false, 0, false, 0, 0, 0, 0, false, ""}
@@ -490,6 +526,16 @@ extern "C" {
#define meshtastic_AirQualityMetrics_co2_tag 13
#define meshtastic_AirQualityMetrics_co2_temperature_tag 14
#define meshtastic_AirQualityMetrics_co2_humidity_tag 15
+#define meshtastic_AirQualityMetrics_form_formaldehyde_tag 16
+#define meshtastic_AirQualityMetrics_form_humidity_tag 17
+#define meshtastic_AirQualityMetrics_form_temperature_tag 18
+#define meshtastic_AirQualityMetrics_pm40_standard_tag 19
+#define meshtastic_AirQualityMetrics_particles_40um_tag 20
+#define meshtastic_AirQualityMetrics_pm_temperature_tag 21
+#define meshtastic_AirQualityMetrics_pm_humidity_tag 22
+#define meshtastic_AirQualityMetrics_pm_voc_idx_tag 23
+#define meshtastic_AirQualityMetrics_pm_nox_idx_tag 24
+#define meshtastic_AirQualityMetrics_particles_tps_tag 25
#define meshtastic_LocalStats_uptime_seconds_tag 1
#define meshtastic_LocalStats_channel_utilization_tag 2
#define meshtastic_LocalStats_air_util_tx_tag 3
@@ -597,7 +643,17 @@ X(a, STATIC, OPTIONAL, UINT32, particles_50um, 11) \
X(a, STATIC, OPTIONAL, UINT32, particles_100um, 12) \
X(a, STATIC, OPTIONAL, UINT32, co2, 13) \
X(a, STATIC, OPTIONAL, FLOAT, co2_temperature, 14) \
-X(a, STATIC, OPTIONAL, FLOAT, co2_humidity, 15)
+X(a, STATIC, OPTIONAL, FLOAT, co2_humidity, 15) \
+X(a, STATIC, OPTIONAL, FLOAT, form_formaldehyde, 16) \
+X(a, STATIC, OPTIONAL, FLOAT, form_humidity, 17) \
+X(a, STATIC, OPTIONAL, FLOAT, form_temperature, 18) \
+X(a, STATIC, OPTIONAL, UINT32, pm40_standard, 19) \
+X(a, STATIC, OPTIONAL, UINT32, particles_40um, 20) \
+X(a, STATIC, OPTIONAL, FLOAT, pm_temperature, 21) \
+X(a, STATIC, OPTIONAL, FLOAT, pm_humidity, 22) \
+X(a, STATIC, OPTIONAL, FLOAT, pm_voc_idx, 23) \
+X(a, STATIC, OPTIONAL, FLOAT, pm_nox_idx, 24) \
+X(a, STATIC, OPTIONAL, FLOAT, particles_tps, 25)
#define meshtastic_AirQualityMetrics_CALLBACK NULL
#define meshtastic_AirQualityMetrics_DEFAULT NULL
@@ -686,7 +742,7 @@ extern const pb_msgdesc_t meshtastic_Nau7802Config_msg;
/* Maximum encoded size of messages (where known) */
#define MESHTASTIC_MESHTASTIC_TELEMETRY_PB_H_MAX_SIZE meshtastic_Telemetry_size
-#define meshtastic_AirQualityMetrics_size 88
+#define meshtastic_AirQualityMetrics_size 150
#define meshtastic_DeviceMetrics_size 27
#define meshtastic_EnvironmentMetrics_size 113
#define meshtastic_HealthMetrics_size 11
diff --git a/src/mesh/udp/UdpMulticastHandler.h b/src/mesh/udp/UdpMulticastHandler.h
index d1cc1065c..d4e0eaa8c 100644
--- a/src/mesh/udp/UdpMulticastHandler.h
+++ b/src/mesh/udp/UdpMulticastHandler.h
@@ -4,8 +4,13 @@
#include "main.h"
#include "mesh/Router.h"
-#include
+#if HAS_ETHERNET && defined(ARCH_NRF52)
+#include "mesh/eth/ethClient.h"
+#else
#include
+#endif
+
+#include
#if HAS_ETHERNET && defined(USE_WS5500)
#include
@@ -22,11 +27,11 @@ class UdpMulticastHandler final
void start()
{
if (udp.listenMulticast(udpIpAddress, UDP_MULTICAST_DEFAUL_PORT, 64)) {
-#ifndef ARCH_PORTDUINO
- // FIXME(PORTDUINO): arduino lacks IPAddress::toString()
- LOG_DEBUG("UDP Listening on IP: %s", WiFi.localIP().toString().c_str());
+#if defined(ARCH_NRF52) || defined(ARCH_PORTDUINO)
+ LOG_DEBUG("UDP Listening on IP: %u.%u.%u.%u:%u", udpIpAddress[0], udpIpAddress[1], udpIpAddress[2], udpIpAddress[3],
+ UDP_MULTICAST_DEFAUL_PORT);
#else
- LOG_DEBUG("UDP Listening");
+ LOG_DEBUG("UDP Listening on IP: %s", WiFi.localIP().toString().c_str());
#endif
udp.onPacket([this](AsyncUDPPacket packet) { onReceive(packet); });
} else {
@@ -37,7 +42,10 @@ class UdpMulticastHandler final
void onReceive(AsyncUDPPacket packet)
{
size_t packetLength = packet.length();
-#ifndef ARCH_PORTDUINO
+#if defined(ARCH_NRF52)
+ IPAddress ip = packet.remoteIP();
+ LOG_DEBUG("UDP broadcast from: %u.%u.%u.%u, len=%u", ip[0], ip[1], ip[2], ip[3], packetLength);
+#elif !defined(ARCH_PORTDUINO)
// FIXME(PORTDUINO): arduino lacks IPAddress::toString()
LOG_DEBUG("UDP broadcast from: %s, len=%u", packet.remoteIP().toString().c_str(), packetLength);
#endif
@@ -61,7 +69,11 @@ class UdpMulticastHandler final
if (!mp || !udp) {
return false;
}
-#ifndef ARCH_PORTDUINO
+#if defined(ARCH_NRF52)
+ if (!isEthernetAvailable()) {
+ return false;
+ }
+#elif !defined(ARCH_PORTDUINO)
if (WiFi.status() != WL_CONNECTED) {
return false;
}
diff --git a/src/modules/CannedMessageModule.cpp b/src/modules/CannedMessageModule.cpp
index a1b89e0f8..2a4f1cf4d 100644
--- a/src/modules/CannedMessageModule.cpp
+++ b/src/modules/CannedMessageModule.cpp
@@ -850,7 +850,13 @@ void CannedMessageModule::sendText(NodeNum dest, ChannelIndex channel, const cha
this->waitingForAck = true;
// Log outgoing message
- LOG_INFO("Send message id=%d, dest=%x, msg=%.*s", p->id, p->to, p->decoded.payload.size, p->decoded.payload.bytes);
+ LOG_INFO("Send message id=%u, dest=%x, msg=%.*s", p->id, p->to, p->decoded.payload.size, p->decoded.payload.bytes);
+
+ if (p->to != 0xffffffff) {
+ LOG_INFO("Proactively adding %x as favorite node", p->to);
+ nodeDB->set_favorite(true, p->to);
+ screen->setFrames(graphics::Screen::FOCUS_PRESERVE);
+ }
// Send to mesh and phone (even if no phone connected, to track ACKs)
service->sendToMesh(p, RX_SRC_LOCAL, true);
@@ -1441,7 +1447,7 @@ void CannedMessageModule::drawEmotePickerScreen(OLEDDisplay *display, OLEDDispla
int headerY = y;
int listTop = headerY + headerFontHeight + headerMargin;
- int visibleRows = (display->getHeight() - listTop - 2) / rowHeight;
+ int _visibleRows = (display->getHeight() - listTop - 2) / rowHeight;
int numEmotes = graphics::numEmotes;
// Clamp highlight index
@@ -1451,11 +1457,11 @@ void CannedMessageModule::drawEmotePickerScreen(OLEDDisplay *display, OLEDDispla
emotePickerIndex = numEmotes - 1;
// Determine which emote is at the top
- int topIndex = emotePickerIndex - visibleRows / 2;
+ int topIndex = emotePickerIndex - _visibleRows / 2;
if (topIndex < 0)
topIndex = 0;
- if (topIndex > numEmotes - visibleRows)
- topIndex = std::max(0, numEmotes - visibleRows);
+ if (topIndex > numEmotes - _visibleRows)
+ topIndex = std::max(0, numEmotes - _visibleRows);
// Draw header/title
display->setFont(FONT_SMALL);
@@ -1703,7 +1709,7 @@ void CannedMessageModule::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *st
} else {
// Text: split by words and wrap inside word if needed
String text = token.second;
- uint16_t pos = 0;
+ pos = 0;
while (pos < text.length()) {
// Find next space (or end)
int spacePos = text.indexOf(' ', pos);
@@ -1747,7 +1753,7 @@ void CannedMessageModule::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *st
int yLine = inputY;
for (auto &line : lines) {
int nextX = x;
- for (auto &token : line) {
+ for (const auto &token : line) {
if (token.first) {
const graphics::Emote *emote = nullptr;
for (int j = 0; j < graphics::numEmotes; j++) {
@@ -1783,19 +1789,20 @@ void CannedMessageModule::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *st
int topMsg;
std::vector rowHeights;
- int visibleRows;
+ int _visibleRows;
// Draw header (To: ...)
drawHeader(display, x, y, buffer);
// Shift message list upward by 3 pixels to reduce spacing between header and first message
const int listYOffset = y + FONT_HEIGHT_SMALL - 3;
- visibleRows = (display->getHeight() - listYOffset) / baseRowSpacing;
+ _visibleRows = (display->getHeight() - listYOffset) / baseRowSpacing;
// Figure out which messages are visible and their needed heights
- topMsg =
- (messagesCount > visibleRows && currentMessageIndex >= visibleRows - 1) ? currentMessageIndex - visibleRows + 2 : 0;
- int countRows = std::min(messagesCount, visibleRows);
+ topMsg = (messagesCount > _visibleRows && currentMessageIndex >= _visibleRows - 1)
+ ? currentMessageIndex - _visibleRows + 2
+ : 0;
+ int countRows = std::min(messagesCount, _visibleRows);
// --- Build per-row max height based on all emotes in line ---
for (int i = 0; i < countRows; i++) {
@@ -1822,7 +1829,7 @@ void CannedMessageModule::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *st
int lineY = yCursor;
const char *msg = getMessageByIndex(msgIdx);
int rowHeight = rowHeights[vis];
- bool highlight = (msgIdx == currentMessageIndex);
+ bool _highlight = (msgIdx == currentMessageIndex);
// --- Multi-emote tokenization ---
std::vector> tokens; // (isEmote, token)
@@ -1875,20 +1882,20 @@ void CannedMessageModule::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *st
int textYOffset = (rowHeight - FONT_HEIGHT_SMALL) / 2;
#ifdef USE_EINK
- int nextX = x + (highlight ? 12 : 0);
- if (highlight)
+ int nextX = x + (_highlight ? 12 : 0);
+ if (_highlight)
display->drawString(x + 0, lineY + textYOffset, ">");
#else
int scrollPadding = 8;
- if (highlight) {
+ if (_highlight) {
display->fillRect(x + 0, lineY, display->getWidth() - scrollPadding, rowHeight);
display->setColor(BLACK);
}
- int nextX = x + (highlight ? 2 : 0);
+ int nextX = x + (_highlight ? 2 : 0);
#endif
// Draw all tokens left to right
- for (auto &token : tokens) {
+ for (const auto &token : tokens) {
if (token.first) {
// Emote
const graphics::Emote *emote = nullptr;
@@ -1910,7 +1917,7 @@ void CannedMessageModule::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *st
}
}
#ifndef USE_EINK
- if (highlight)
+ if (_highlight)
display->setColor(WHITE);
#endif
@@ -1918,11 +1925,11 @@ void CannedMessageModule::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *st
}
// Scrollbar
- if (messagesCount > visibleRows) {
+ if (messagesCount > _visibleRows) {
int scrollHeight = display->getHeight() - listYOffset;
int scrollTrackX = display->getWidth() - 6;
display->drawRect(scrollTrackX, listYOffset, 4, scrollHeight);
- int barHeight = (scrollHeight * visibleRows) / messagesCount;
+ int barHeight = (scrollHeight * _visibleRows) / messagesCount;
int scrollPos = listYOffset + (scrollHeight * topMsg) / messagesCount;
display->fillRect(scrollTrackX, scrollPos, 4, barHeight);
}
diff --git a/src/modules/ExternalNotificationModule.cpp b/src/modules/ExternalNotificationModule.cpp
index 5d7233279..1f871f87e 100644
--- a/src/modules/ExternalNotificationModule.cpp
+++ b/src/modules/ExternalNotificationModule.cpp
@@ -126,9 +126,11 @@ int32_t ExternalNotificationModule::runOnce()
millis()) {
setExternalState(1, !getExternal(1));
}
- if (externalTurnedOn[2] + (moduleConfig.external_notification.output_ms ? moduleConfig.external_notification.output_ms
+ // Only toggle buzzer output if not using PWM mode (to avoid conflict with RTTTL)
+ if (!moduleConfig.external_notification.use_pwm &&
+ externalTurnedOn[2] + (moduleConfig.external_notification.output_ms ? moduleConfig.external_notification.output_ms
: EXT_NOTIFICATION_MODULE_OUTPUT_MS) <
- millis()) {
+ millis()) {
LOG_DEBUG("EXTERNAL 2 %d compared to %d", externalTurnedOn[2] + moduleConfig.external_notification.output_ms,
millis());
setExternalState(2, !getExternal(2));
@@ -247,7 +249,8 @@ void ExternalNotificationModule::setExternalState(uint8_t index, bool on)
digitalWrite(moduleConfig.external_notification.output_vibra, on);
break;
case 2:
- if (moduleConfig.external_notification.output_buzzer)
+ // Only control buzzer pin digitally if not using PWM mode
+ if (moduleConfig.external_notification.output_buzzer && !moduleConfig.external_notification.use_pwm)
digitalWrite(moduleConfig.external_notification.output_buzzer, on);
break;
default:
@@ -320,6 +323,11 @@ void ExternalNotificationModule::stopNow()
#endif
nagCycleCutoff = 1; // small value
isNagging = false;
+ // Turn off all outputs
+ for (int i = 0; i < 3; i++) {
+ setExternalState(i, false);
+ externalTurnedOn[i] = 0;
+ }
setIntervalFromNow(0);
#ifdef T_WATCH_S3
drv.stop();
@@ -478,14 +486,17 @@ ProcessMessage ExternalNotificationModule::handleReceived(const meshtastic_MeshP
if (containsBell) {
LOG_INFO("externalNotificationModule - Notification Bell (Buzzer)");
isNagging = true;
- if (!moduleConfig.external_notification.use_pwm) {
+ if (!moduleConfig.external_notification.use_pwm && !moduleConfig.external_notification.use_i2s_as_buzzer) {
setExternalState(2, true);
} else {
#ifdef HAS_I2S
- audioThread->beginRttl(rtttlConfig.ringtone, strlen_P(rtttlConfig.ringtone));
-#else
- rtttl::begin(config.device.buzzer_gpio, rtttlConfig.ringtone);
+ if (moduleConfig.external_notification.use_i2s_as_buzzer) {
+ audioThread->beginRttl(rtttlConfig.ringtone, strlen_P(rtttlConfig.ringtone));
+ } else
#endif
+ if (moduleConfig.external_notification.use_pwm) {
+ rtttl::begin(config.device.buzzer_gpio, rtttlConfig.ringtone);
+ }
}
if (moduleConfig.external_notification.nag_timeout) {
nagCycleCutoff = millis() + moduleConfig.external_notification.nag_timeout * 1000;
@@ -526,10 +537,11 @@ ProcessMessage ExternalNotificationModule::handleReceived(const meshtastic_MeshP
#ifdef HAS_I2S
if (moduleConfig.external_notification.use_i2s_as_buzzer) {
audioThread->beginRttl(rtttlConfig.ringtone, strlen_P(rtttlConfig.ringtone));
- }
-#else
- rtttl::begin(config.device.buzzer_gpio, rtttlConfig.ringtone);
+ } else
#endif
+ if (moduleConfig.external_notification.use_pwm) {
+ rtttl::begin(config.device.buzzer_gpio, rtttlConfig.ringtone);
+ }
}
if (moduleConfig.external_notification.nag_timeout) {
nagCycleCutoff = millis() + moduleConfig.external_notification.nag_timeout * 1000;
diff --git a/src/modules/NodeInfoModule.cpp b/src/modules/NodeInfoModule.cpp
index cf9940e25..b6fee7703 100644
--- a/src/modules/NodeInfoModule.cpp
+++ b/src/modules/NodeInfoModule.cpp
@@ -14,6 +14,11 @@ bool NodeInfoModule::handleReceivedProtobuf(const meshtastic_MeshPacket &mp, mes
{
auto p = *pptr;
+ if (p.is_licensed != owner.is_licensed) {
+ LOG_WARN("Invalid nodeInfo detected, is_licensed mismatch!");
+ return true;
+ }
+
// Coerce user.id to be derived from the node number
snprintf(p.id, sizeof(p.id), "!%08x", getFrom(&mp));
diff --git a/src/modules/PositionModule.cpp b/src/modules/PositionModule.cpp
index 93c65ecc1..8b6a9f19c 100644
--- a/src/modules/PositionModule.cpp
+++ b/src/modules/PositionModule.cpp
@@ -266,9 +266,11 @@ meshtastic_MeshPacket *PositionModule::allocPositionPacket()
LOG_INFO("Position packet: time=%i lat=%i lon=%i", p.time, p.latitude_i, p.longitude_i);
+#ifndef MESHTASTIC_EXCLUDE_ATAK
// TAK Tracker devices should send their position in a TAK packet over the ATAK port
if (config.device.role == meshtastic_Config_DeviceConfig_Role_TAK_TRACKER)
return allocAtakPli();
+#endif
return allocDataProtobuf(p);
}
diff --git a/src/modules/SystemCommandsModule.cpp b/src/modules/SystemCommandsModule.cpp
index ab9439b39..2d534bd67 100644
--- a/src/modules/SystemCommandsModule.cpp
+++ b/src/modules/SystemCommandsModule.cpp
@@ -107,11 +107,7 @@ int SystemCommandsModule::handleInputEvent(const InputEvent *event)
return true;
// Power control
case INPUT_BROKER_SHUTDOWN:
- LOG_ERROR("Shutting Down");
- IF_SCREEN(screen->showSimpleBanner("Shutting Down..."));
- nodeDB->saveToDisk();
- shutdownAtMsec = millis() + DEFAULT_SHUTDOWN_SECONDS * 1000;
- // runState = CANNED_MESSAGE_RUN_STATE_INACTIVE;
+ shutdownAtMsec = millis();
return true;
default:
diff --git a/src/mqtt/MQTT.cpp b/src/mqtt/MQTT.cpp
index 137c92056..091612827 100644
--- a/src/mqtt/MQTT.cpp
+++ b/src/mqtt/MQTT.cpp
@@ -559,10 +559,8 @@ void MQTT::sendSubscriptions()
int32_t MQTT::runOnce()
{
-#if HAS_NETWORKING
if (!moduleConfig.mqtt.enabled || !(moduleConfig.mqtt.map_reporting_enabled || channels.anyMqttEnabled()))
return disable();
-
bool wantConnection = wantsLink();
perhapsReportToMap();
@@ -572,7 +570,7 @@ int32_t MQTT::runOnce()
publishQueuedMessages();
return 200;
}
-
+#if HAS_NETWORKING
else if (!pubSub.loop()) {
if (!wantConnection)
return 5000; // If we don't want connection now, check again in 5 secs
@@ -596,8 +594,10 @@ int32_t MQTT::runOnce()
powerFSM.trigger(EVENT_CONTACT_FROM_PHONE); // Suppress entering light sleep (because that would turn off bluetooth)
return 20;
}
-#endif
+#else
+ // No networking available, return default interval
return 30000;
+#endif
}
bool MQTT::isValidConfig(const meshtastic_ModuleConfig_MQTTConfig &config, MQTTClient *client)
diff --git a/src/platform/esp32/architecture.h b/src/platform/esp32/architecture.h
index baefbc4eb..3168d9121 100644
--- a/src/platform/esp32/architecture.h
+++ b/src/platform/esp32/architecture.h
@@ -188,6 +188,8 @@
#define HW_VENDOR meshtastic_HardwareModel_RAK3312
#elif defined(LINK_32)
#define HW_VENDOR meshtastic_HardwareModel_LINK_32
+#elif defined(T_DECK_PRO)
+#define HW_VENDOR meshtastic_HardwareModel_T_DECK_PRO
#endif
// -----------------------------------------------------------------------------
diff --git a/src/platform/extra_variants/t_deck_pro/variant.cpp b/src/platform/extra_variants/t_deck_pro/variant.cpp
new file mode 100644
index 000000000..eae9335ce
--- /dev/null
+++ b/src/platform/extra_variants/t_deck_pro/variant.cpp
@@ -0,0 +1,28 @@
+#include "configuration.h"
+
+#ifdef T_DECK_PRO
+
+#include "input/TouchScreenImpl1.h"
+#include
+#include
+
+CSE_CST328 tsPanel = CSE_CST328(EINK_WIDTH, EINK_HEIGHT, &Wire, CST328_PIN_RST, CST328_PIN_INT);
+
+bool readTouch(int16_t *x, int16_t *y)
+{
+ if (tsPanel.getTouches()) {
+ *x = tsPanel.getPoint(0).x;
+ *y = tsPanel.getPoint(0).y;
+ return true;
+ }
+ return false;
+}
+
+// T-Deck Pro specific init
+void lateInitVariant()
+{
+ tsPanel.begin();
+ touchScreenImpl1 = new TouchScreenImpl1(EINK_WIDTH, EINK_HEIGHT, readTouch);
+ touchScreenImpl1->init();
+}
+#endif
\ No newline at end of file
diff --git a/src/platform/nrf52/AsyncUDP.cpp b/src/platform/nrf52/AsyncUDP.cpp
new file mode 100644
index 000000000..836fb1307
--- /dev/null
+++ b/src/platform/nrf52/AsyncUDP.cpp
@@ -0,0 +1,73 @@
+#include "AsyncUDP.h"
+
+#if HAS_ETHERNET
+
+AsyncUDP::AsyncUDP() : OSThread("AsyncUDP"), localPort(0) {}
+
+bool AsyncUDP::listenMulticast(IPAddress multicastIP, uint16_t port, uint8_t ttl)
+{
+ if (!isMulticast(multicastIP))
+ return false;
+ localPort = port;
+ udp.beginMulticast(multicastIP, port);
+ return true;
+}
+
+size_t AsyncUDP::write(uint8_t b)
+{
+ return udp.write(&b, 1);
+}
+
+size_t AsyncUDP::write(const uint8_t *data, size_t len)
+{
+ return udp.write(data, len);
+}
+
+void AsyncUDP::onPacket(const std::function &callback)
+{
+ _onPacket = callback;
+}
+
+bool AsyncUDP::writeTo(const uint8_t *data, size_t len, IPAddress ip, uint16_t port)
+{
+ if (!udp.beginPacket(ip, port))
+ return false;
+ udp.write(data, len);
+ return udp.endPacket();
+}
+
+// AsyncUDPPacket
+AsyncUDPPacket::AsyncUDPPacket(EthernetUDP &source) : _udp(source), _remoteIP(source.remoteIP()), _remotePort(source.remotePort())
+{
+ if (_udp.available() > 0) {
+ _readLength = _udp.read(_buffer, sizeof(_buffer));
+ } else {
+ _readLength = 0;
+ }
+}
+
+IPAddress AsyncUDPPacket::remoteIP()
+{
+ return _remoteIP;
+}
+
+uint16_t AsyncUDPPacket::length()
+{
+ return _readLength;
+}
+
+const uint8_t *AsyncUDPPacket::data()
+{
+ return _buffer;
+}
+
+int32_t AsyncUDP::runOnce()
+{
+ if (_onPacket && udp.parsePacket() > 0) {
+ AsyncUDPPacket packet(udp);
+ _onPacket(packet);
+ }
+ return 5; // check every 5ms
+}
+
+#endif // HAS_ETHERNET
\ No newline at end of file
diff --git a/src/platform/nrf52/AsyncUDP.h b/src/platform/nrf52/AsyncUDP.h
new file mode 100644
index 000000000..e2b406ba9
--- /dev/null
+++ b/src/platform/nrf52/AsyncUDP.h
@@ -0,0 +1,63 @@
+#ifndef ASYNC_UDP_H
+#define ASYNC_UDP_H
+
+#include "configuration.h"
+
+#if HAS_ETHERNET
+
+#include "concurrency/OSThread.h"
+#include
+#include
+#include
+#include
+#include
+
+class AsyncUDPPacket;
+
+class AsyncUDP : public Print, private concurrency::OSThread
+{
+ public:
+ AsyncUDP();
+ explicit operator bool() const { return localPort != 0; }
+
+ bool listenMulticast(IPAddress multicastIP, uint16_t port, uint8_t ttl = 64);
+ bool writeTo(const uint8_t *data, size_t len, IPAddress ip, uint16_t port);
+
+ size_t write(uint8_t b) override;
+ size_t write(const uint8_t *data, size_t len) override;
+ void onPacket(const std::function &callback);
+
+ private:
+ EthernetUDP udp;
+ uint16_t localPort;
+ std::function _onPacket;
+ virtual int32_t runOnce() override;
+};
+
+class AsyncUDPPacket
+{
+ public:
+ AsyncUDPPacket(EthernetUDP &source);
+
+ IPAddress remoteIP();
+ uint16_t length();
+ const uint8_t *data();
+
+ private:
+ EthernetUDP &_udp;
+ IPAddress _remoteIP;
+ uint16_t _remotePort;
+ size_t _readLength = 0;
+
+ static constexpr size_t BUF_SIZE = 512;
+ uint8_t _buffer[BUF_SIZE];
+};
+
+inline bool isMulticast(const IPAddress &ip)
+{
+ return (ip[0] & 0xF0) == 0xE0;
+}
+
+#endif // HAS_ETHERNET
+
+#endif // ASYNC_UDP_H
diff --git a/src/platform/nrf52/architecture.h b/src/platform/nrf52/architecture.h
index 684d20e84..1bbdd77e0 100644
--- a/src/platform/nrf52/architecture.h
+++ b/src/platform/nrf52/architecture.h
@@ -49,6 +49,8 @@
#define HW_VENDOR meshtastic_HardwareModel_RAK2560
#elif defined(WISMESH_TAP)
#define HW_VENDOR meshtastic_HardwareModel_WISMESH_TAP
+#elif defined(WISMESH_TAG)
+#define HW_VENDOR meshtastic_HardwareModel_WISMESH_TAG
#elif defined(GAT562_MESH_TRIAL_TRACKER)
#define HW_VENDOR meshtastic_HardwareModel_GAT562_MESH_TRIAL_TRACKER
#elif defined(RAK4630)
@@ -89,6 +91,8 @@
#define HW_VENDOR meshtastic_HardwareModel_HELTEC_MESH_POCKET
#elif defined(NOMADSTAR_METEOR_PRO)
#define HW_VENDOR meshtastic_HardwareModel_NOMADSTAR_METEOR_PRO
+#elif defined(SEEED_WIO_TRACKER_L1_EINK)
+#define HW_VENDOR meshtastic_HardwareModel_SEEED_WIO_TRACKER_L1_EINK
#elif defined(SEEED_WIO_TRACKER_L1)
#define HW_VENDOR meshtastic_HardwareModel_SEEED_WIO_TRACKER_L1
#else
diff --git a/src/power.h b/src/power.h
index c71f96c10..046980bd6 100644
--- a/src/power.h
+++ b/src/power.h
@@ -126,6 +126,8 @@ class Power : private concurrency::OSThread
bool analogInit();
/// Setup a Lipo battery level sensor
bool lipoInit();
+ /// Setup a Lipo charger
+ bool lipoChargerInit();
private:
// open circuit voltage lookup table
diff --git a/src/shutdown.h b/src/shutdown.h
index 7e2120149..973e388b1 100644
--- a/src/shutdown.h
+++ b/src/shutdown.h
@@ -40,21 +40,8 @@ void powerCommandsCheck()
#endif
}
-#if defined(ARCH_ESP32) || defined(ARCH_NRF52)
- if (shutdownAtMsec && screen) {
- screen->showSimpleBanner("Shutting Down...", 0); // stays on screen
- }
-#endif
-
if (shutdownAtMsec && millis() > shutdownAtMsec) {
- LOG_INFO("Shut down from admin command");
-#if defined(ARCH_NRF52) || defined(ARCH_ESP32) || defined(ARCH_RP2040)
- playShutdownMelody();
+ shutdownAtMsec = 0;
power->shutdown();
-#elif defined(ARCH_PORTDUINO)
- exit(EXIT_SUCCESS);
-#else
- LOG_WARN("FIXME implement shutdown for this platform");
-#endif
}
}
\ No newline at end of file
diff --git a/variants/diy/platformio.ini b/variants/diy/platformio.ini
deleted file mode 100644
index 1f0f6d126..000000000
--- a/variants/diy/platformio.ini
+++ /dev/null
@@ -1,156 +0,0 @@
-; Meshtastic DIY v1 by Nano VHF Schematic based on ESP32-WROOM-32 (38 pins) devkit & EBYTE E22 SX1262/SX1268 module
-[env:meshtastic-diy-v1]
-extends = esp32_base
-board = esp32doit-devkit-v1
-board_check = true
-build_flags =
- ${esp32_base.build_flags}
- -D DIY_V1
- -D EBYTE_E22
- -I variants/diy/v1
-
-; Meshtastic DIY v1.1 new schematic based on ESP32-WROOM-32 & SX1262/SX1268 modules
-[env:meshtastic-diy-v1_1]
-extends = esp32_base
-board = esp32doit-devkit-v1
-board_level = extra
-build_flags =
- ${esp32_base.build_flags}
- -D DIY_V1
- -D EBYTE_E22
- -I variants/diy/v1_1
-
-; Port to Disaster Radio's ESP32-v3 Dev Board
-[env:meshtastic-dr-dev]
-extends = esp32_base
-board = esp32doit-devkit-v1
-board_upload.maximum_size = 4194304
-board_upload.maximum_ram_size = 532480
-build_flags =
- ${esp32_base.build_flags}
- -D DR_DEV
- -D EBYTE_E22
- -I variants/diy/dr-dev
-
-; Hydra - Meshtastic DIY v1 hardware with some specific changes
-[env:hydra]
-extends = esp32_base
-board = esp32doit-devkit-v1
-build_flags =
- ${esp32_base.build_flags}
- -D DIY_V1
- -I variants/diy/hydra
-
-
-; Promicro + E22(0)-xxxMM / RA-01SH modules board variant - DIY - without TCXO
-[env:nrf52_promicro_diy_xtal]
-extends = nrf52840_base
-board = promicro-nrf52840
-board_level = extra
-build_flags = ${nrf52840_base.build_flags}
- -I variants/diy/nrf52_promicro_diy_xtal
- -D NRF52_PROMICRO_DIY
-build_src_filter = ${nrf52_base.build_src_filter} +<../variants/diy/nrf52_promicro_diy_xtal>
-lib_deps =
- ${nrf52840_base.lib_deps}
-debug_tool = jlink
-
-
-; Promicro + E22(0)-xxxM / HT-RA62 modules board variant - DIY - with TCXO
-[env:nrf52_promicro_diy_tcxo]
-extends = nrf52840_base
-board = promicro-nrf52840
-build_flags = ${nrf52840_base.build_flags}
- -I variants/diy/nrf52_promicro_diy_tcxo
- -D NRF52_PROMICRO_DIY
-build_src_filter = ${nrf52_base.build_src_filter} +<../variants/diy/nrf52_promicro_diy_tcxo>
-lib_deps =
- ${nrf52840_base.lib_deps}
-debug_tool = jlink
-
-; NRF52 ProMicro w/ E-Ink display
-[env:nrf52_promicro_diy-inkhud]
-board_level = extra
-extends = nrf52840_base, inkhud
-board = promicro-nrf52840
-build_flags =
- ${nrf52840_base.build_flags}
- ${inkhud.build_flags}
- -I variants/diy/nrf52_promicro_diy_tcxo
- -D NRF52_PROMICRO_DIY
-build_src_filter =
- ${nrf52_base.build_src_filter}
- ${inkhud.build_src_filter}
- +<../variants/diy/nrf52_promicro_diy_tcxo>
-lib_deps =
- ${inkhud.lib_deps} ; InkHUD libs first, so we get GFXRoot instead of AdafruitGFX
- ${nrf52840_base.lib_deps}
-extra_scripts =
- ${env.extra_scripts}
- variants/diy/nrf52_promicro_diy_tcxo/custom_build_tasks.py ; Add to PIO's Project Tasks pane: preset builds for common displays
-
-; Seeed Xiao BLE: https://www.digikey.com/en/products/detail/seeed-technology-co-ltd/102010448/16652893
-[env:xiao_ble]
-extends = env:seeed_xiao_nrf52840_kit
-board_level = extra
-build_flags = ${env:seeed_xiao_nrf52840_kit.build_flags} -D PRIVATE_HW -DXIAO_BLE_LEGACY_PINOUT -DEBYTE_E22 -DEBYTE_E22_900M30S
-build_unflags = -DGPS_L76K
-
-; Seeed XIAO nRF52840 + EBYTE E22-900M30S - Pinout matching Wio-SX1262 (SKU 113010003)
-[env:seeed_xiao_nrf52840_e22_900m30s]
-extends = env:seeed_xiao_nrf52840_kit
-board_level = extra
-build_flags = ${env:seeed_xiao_nrf52840_kit.build_flags} -D PRIVATE_HW -DEBYTE_E22 -DEBYTE_E22_900M30S
-build_unflags = -DGPS_L76K
-
-; Seeed XIAO nRF52840 + EBYTE E22-900M33S - Pinout matching Wio-SX1262 (SKU 113010003)
-[env:seeed_xiao_nrf52840_e22_900m33s]
-extends = env:seeed_xiao_nrf52840_kit
-board_level = extra
-build_flags = ${env:seeed_xiao_nrf52840_kit.build_flags} -D PRIVATE_HW -DEBYTE_E22 -DEBYTE_E22_900M33S
-build_unflags = -DGPS_L76K
-
-; Seeed XIAO nRF52840 + XIAO Wio SX1262 DIY
-[env:seeed-xiao-nrf52840-wio-sx1262]
-board = xiao_ble_sense
-extends = nrf52840_base
-board_level = extra
-build_flags = ${nrf52840_base.build_flags} -Ivariants/diy/seeed-xiao-nrf52840-wio-sx1262 -D PRIVATE_HW
- -Isrc/platform/nrf52/softdevice -Isrc/platform/nrf52/softdevice/nrf52
-board_build.ldscript = src/platform/nrf52/nrf52840_s140_v7.ld
-build_src_filter = ${nrf52_base.build_src_filter} +<../variants/diy/seeed-xiao-nrf52840-wio-sx1262>
-lib_deps =
- ${nrf52840_base.lib_deps}
-debug_tool = jlink
-
-; NanoVHF T-Energy-S3 + E22(0)-xxxM - DIY
-[env:t-energy-s3_e22]
-extends = esp32s3_base
-board = esp32-s3-devkitc-1
-board_build.partitions = default_16MB.csv
-board_level = extra
-board_upload.flash_size = 16MB ;Specify the FLASH capacity as 16MB
-board_build.arduino.memory_type = qio_opi ;Enable internal PSRAM
-build_unflags =
- ${esp32s3_base.build_unflags}
- -D ARDUINO_USB_MODE=1
-build_flags =
- ${esp32s3_base.build_flags}
- -D EBYTE_ESP32_S3
- -D BOARD_HAS_PSRAM
- -D ARDUINO_USB_MODE=0
- -D ARDUINO_USB_CDC_ON_BOOT=1
- -I variants/diy/t-energy-s3_e22
-
-; ESP32 C3 Super Mini Development Board
-; https://www.espboards.dev/esp32/esp32-c3-super-mini/
-[env:esp32c3_super_mini]
-extends = esp32c3_base
-board = esp32-c3-devkitm-1
-build_flags =
- ${esp32_base.build_flags}
- -D PRIVATE_HW
- -I variants/diy/esp32c3_super_mini
- -D ARDUINO_USB_MODE=1
- -D ARDUINO_USB_CDC_ON_BOOT=1
-board_level = extra
diff --git a/variants/betafpv_2400_tx_micro/platformio.ini b/variants/esp32/betafpv_2400_tx_micro/platformio.ini
similarity index 81%
rename from variants/betafpv_2400_tx_micro/platformio.ini
rename to variants/esp32/betafpv_2400_tx_micro/platformio.ini
index 531e8532d..4d163d834 100644
--- a/variants/betafpv_2400_tx_micro/platformio.ini
+++ b/variants/esp32/betafpv_2400_tx_micro/platformio.ini
@@ -8,11 +8,11 @@ build_flags =
-D VTABLES_IN_FLASH=1
-D CONFIG_DISABLE_HAL_LOCKS=1
-O2
- -I variants/betafpv_2400_tx_micro
+ -I variants/esp32/betafpv_2400_tx_micro
board_build.f_cpu = 240000000L
upload_protocol = esptool
;upload_port = /dev/ttyUSB0
upload_speed = 460800
lib_deps =
${esp32_base.lib_deps}
- adafruit/Adafruit NeoPixel @ ^1.12.0
\ No newline at end of file
+ adafruit/Adafruit NeoPixel @ ^1.12.0
diff --git a/variants/betafpv_2400_tx_micro/variant.h b/variants/esp32/betafpv_2400_tx_micro/variant.h
similarity index 100%
rename from variants/betafpv_2400_tx_micro/variant.h
rename to variants/esp32/betafpv_2400_tx_micro/variant.h
diff --git a/variants/betafpv_900_tx_nano/platformio.ini b/variants/esp32/betafpv_900_tx_nano/platformio.ini
similarity index 84%
rename from variants/betafpv_900_tx_nano/platformio.ini
rename to variants/esp32/betafpv_900_tx_nano/platformio.ini
index 3bea16f6b..7e01fd2fa 100644
--- a/variants/betafpv_900_tx_nano/platformio.ini
+++ b/variants/esp32/betafpv_900_tx_nano/platformio.ini
@@ -8,10 +8,10 @@ build_flags =
-D VTABLES_IN_FLASH=1
-D CONFIG_DISABLE_HAL_LOCKS=1
-O2
- -I variants/betafpv_900_tx_nano
+ -I variants/esp32/betafpv_900_tx_nano
board_build.f_cpu = 240000000L
upload_protocol = esptool
;upload_port = /dev/ttyUSB0
upload_speed = 460800
lib_deps =
- ${esp32_base.lib_deps}
\ No newline at end of file
+ ${esp32_base.lib_deps}
diff --git a/variants/betafpv_900_tx_nano/variant.h b/variants/esp32/betafpv_900_tx_nano/variant.h
similarity index 100%
rename from variants/betafpv_900_tx_nano/variant.h
rename to variants/esp32/betafpv_900_tx_nano/variant.h
diff --git a/variants/chatter2/platformio.ini b/variants/esp32/chatter2/platformio.ini
similarity index 91%
rename from variants/chatter2/platformio.ini
rename to variants/esp32/chatter2/platformio.ini
index 83e00d0c4..bf496bf26 100644
--- a/variants/chatter2/platformio.ini
+++ b/variants/esp32/chatter2/platformio.ini
@@ -5,7 +5,7 @@ board = esp32doit-devkit-v1
build_flags =
${esp32_base.build_flags}
-D CHATTER_2
- -I variants/chatter2
+ -I variants/esp32/chatter2
lib_deps =
${esp32_base.lib_deps}
diff --git a/variants/chatter2/variant.h b/variants/esp32/chatter2/variant.h
similarity index 100%
rename from variants/chatter2/variant.h
rename to variants/esp32/chatter2/variant.h
diff --git a/variants/esp32/diy/dr-dev/platformio.ini b/variants/esp32/diy/dr-dev/platformio.ini
new file mode 100644
index 000000000..5461d27b3
--- /dev/null
+++ b/variants/esp32/diy/dr-dev/platformio.ini
@@ -0,0 +1,11 @@
+; Port to Disaster Radio's ESP32-v3 Dev Board
+[env:meshtastic-dr-dev]
+extends = esp32_base
+board = esp32doit-devkit-v1
+board_upload.maximum_size = 4194304
+board_upload.maximum_ram_size = 532480
+build_flags =
+ ${esp32_base.build_flags}
+ -D DR_DEV
+ -D EBYTE_E22
+ -I variants/esp32/diy/dr-dev
diff --git a/variants/diy/dr-dev/variant.h b/variants/esp32/diy/dr-dev/variant.h
similarity index 100%
rename from variants/diy/dr-dev/variant.h
rename to variants/esp32/diy/dr-dev/variant.h
diff --git a/variants/esp32/diy/hydra/platformio.ini b/variants/esp32/diy/hydra/platformio.ini
new file mode 100644
index 000000000..a922ed874
--- /dev/null
+++ b/variants/esp32/diy/hydra/platformio.ini
@@ -0,0 +1,8 @@
+; Hydra - Meshtastic DIY v1 hardware with some specific changes
+[env:hydra]
+extends = esp32_base
+board = esp32doit-devkit-v1
+build_flags =
+ ${esp32_base.build_flags}
+ -D DIY_V1
+ -I variants/esp32/diy/hydra
diff --git a/variants/diy/hydra/variant.h b/variants/esp32/diy/hydra/variant.h
similarity index 100%
rename from variants/diy/hydra/variant.h
rename to variants/esp32/diy/hydra/variant.h
diff --git a/variants/esp32/diy/v1/platformio.ini b/variants/esp32/diy/v1/platformio.ini
new file mode 100644
index 000000000..bcbd57cfa
--- /dev/null
+++ b/variants/esp32/diy/v1/platformio.ini
@@ -0,0 +1,10 @@
+; Meshtastic DIY v1 by Nano VHF Schematic based on ESP32-WROOM-32 (38 pins) devkit & EBYTE E22 SX1262/SX1268 module
+[env:meshtastic-diy-v1]
+extends = esp32_base
+board = esp32doit-devkit-v1
+board_check = true
+build_flags =
+ ${esp32_base.build_flags}
+ -D DIY_V1
+ -D EBYTE_E22
+ -I variants/esp32/diy/v1
diff --git a/variants/diy/v1/variant.h b/variants/esp32/diy/v1/variant.h
similarity index 100%
rename from variants/diy/v1/variant.h
rename to variants/esp32/diy/v1/variant.h
diff --git a/variants/esp32/diy/v1_1/platformio.ini b/variants/esp32/diy/v1_1/platformio.ini
new file mode 100644
index 000000000..1431bd4c8
--- /dev/null
+++ b/variants/esp32/diy/v1_1/platformio.ini
@@ -0,0 +1,10 @@
+; Meshtastic DIY v1.1 new schematic based on ESP32-WROOM-32 & SX1262/SX1268 modules
+[env:meshtastic-diy-v1_1]
+extends = esp32_base
+board = esp32doit-devkit-v1
+board_level = extra
+build_flags =
+ ${esp32_base.build_flags}
+ -D DIY_V1
+ -D EBYTE_E22
+ -I variants/esp32/diy/v1_1
diff --git a/variants/diy/v1_1/variant.h b/variants/esp32/diy/v1_1/variant.h
similarity index 100%
rename from variants/diy/v1_1/variant.h
rename to variants/esp32/diy/v1_1/variant.h
diff --git a/variants/hackerboxes_esp32_io/platformio.ini b/variants/esp32/hackerboxes_esp32_io/platformio.ini
similarity index 85%
rename from variants/hackerboxes_esp32_io/platformio.ini
rename to variants/esp32/hackerboxes_esp32_io/platformio.ini
index f024dac3e..fc5f6701c 100644
--- a/variants/hackerboxes_esp32_io/platformio.ini
+++ b/variants/esp32/hackerboxes_esp32_io/platformio.ini
@@ -5,7 +5,7 @@ board_level = extra
build_flags =
${esp32_base.build_flags}
-D PRIVATE_HW
- -I variants/hackerboxes_esp32_io
+ -I variants/esp32/hackerboxes_esp32_io
monitor_speed = 115200
upload_protocol = esptool
;upload_port = /dev/ttyUSB0
diff --git a/variants/hackerboxes_esp32_io/variant.h b/variants/esp32/hackerboxes_esp32_io/variant.h
similarity index 100%
rename from variants/hackerboxes_esp32_io/variant.h
rename to variants/esp32/hackerboxes_esp32_io/variant.h
diff --git a/variants/heltec_v1/platformio.ini b/variants/esp32/heltec_v1/platformio.ini
similarity index 70%
rename from variants/heltec_v1/platformio.ini
rename to variants/esp32/heltec_v1/platformio.ini
index ee10ef0f6..4be3ba655 100644
--- a/variants/heltec_v1/platformio.ini
+++ b/variants/esp32/heltec_v1/platformio.ini
@@ -4,4 +4,6 @@ extends = esp32_base
board_level = extra
board = heltec_wifi_lora_32
build_flags =
- ${esp32_base.build_flags} -D HELTEC_V1 -I variants/heltec_v1
\ No newline at end of file
+ ${esp32_base.build_flags}
+ -D HELTEC_V1
+ -I variants/esp32/heltec_v1
diff --git a/variants/heltec_v1/variant.h b/variants/esp32/heltec_v1/variant.h
similarity index 100%
rename from variants/heltec_v1/variant.h
rename to variants/esp32/heltec_v1/variant.h
diff --git a/variants/heltec_v2.1/platformio.ini b/variants/esp32/heltec_v2.1/platformio.ini
similarity index 65%
rename from variants/heltec_v2.1/platformio.ini
rename to variants/esp32/heltec_v2.1/platformio.ini
index ea2281911..763f9764c 100644
--- a/variants/heltec_v2.1/platformio.ini
+++ b/variants/esp32/heltec_v2.1/platformio.ini
@@ -4,5 +4,7 @@ board_level = extra
extends = esp32_base
board = heltec_wifi_lora_32_V2
build_flags =
- ${esp32_base.build_flags} -D HELTEC_V2_1 -I variants/heltec_v2.1
- -DGPS_POWER_TOGGLE ; comment this line to disable triple press function on the user button to turn off gps entirely.
\ No newline at end of file
+ ${esp32_base.build_flags}
+ -D HELTEC_V2_1
+ -I variants/esp32/heltec_v2.1
+ -DGPS_POWER_TOGGLE ; comment this line to disable triple press function on the user button to turn off gps entirely.
diff --git a/variants/heltec_v2.1/variant.h b/variants/esp32/heltec_v2.1/variant.h
similarity index 100%
rename from variants/heltec_v2.1/variant.h
rename to variants/esp32/heltec_v2.1/variant.h
diff --git a/variants/heltec_v2/platformio.ini b/variants/esp32/heltec_v2/platformio.ini
similarity index 70%
rename from variants/heltec_v2/platformio.ini
rename to variants/esp32/heltec_v2/platformio.ini
index c81bca8ba..ed455616d 100644
--- a/variants/heltec_v2/platformio.ini
+++ b/variants/esp32/heltec_v2/platformio.ini
@@ -4,4 +4,6 @@ board_level = extra
extends = esp32_base
board = heltec_wifi_lora_32_V2
build_flags =
- ${esp32_base.build_flags} -D HELTEC_V2_0 -I variants/heltec_v2
\ No newline at end of file
+ ${esp32_base.build_flags}
+ -D HELTEC_V2_0
+ -I variants/esp32/heltec_v2
diff --git a/variants/heltec_v2/variant.h b/variants/esp32/heltec_v2/variant.h
similarity index 100%
rename from variants/heltec_v2/variant.h
rename to variants/esp32/heltec_v2/variant.h
diff --git a/variants/heltec_wireless_bridge/platformio.ini b/variants/esp32/heltec_wireless_bridge/platformio.ini
similarity index 94%
rename from variants/heltec_wireless_bridge/platformio.ini
rename to variants/esp32/heltec_wireless_bridge/platformio.ini
index ab30eb744..60e686f9e 100644
--- a/variants/heltec_wireless_bridge/platformio.ini
+++ b/variants/esp32/heltec_wireless_bridge/platformio.ini
@@ -4,7 +4,7 @@ extends = esp32_base
board = heltec_wifi_lora_32
build_flags =
${esp32_base.build_flags}
- -I variants/heltec_wireless_bridge
+ -I variants/esp32/heltec_wireless_bridge
-D HELTEC_WIRELESS_BRIDGE
-D BOARD_HAS_PSRAM
-D RADIOLIB_EXCLUDE_LR11X0=1
diff --git a/variants/heltec_wireless_bridge/variant.h b/variants/esp32/heltec_wireless_bridge/variant.h
similarity index 100%
rename from variants/heltec_wireless_bridge/variant.h
rename to variants/esp32/heltec_wireless_bridge/variant.h
diff --git a/variants/heltec_wsl_v2.1/platformio.ini b/variants/esp32/heltec_wsl_v2.1/platformio.ini
similarity index 56%
rename from variants/heltec_wsl_v2.1/platformio.ini
rename to variants/esp32/heltec_wsl_v2.1/platformio.ini
index f4fff9698..eb44c88d2 100644
--- a/variants/heltec_wsl_v2.1/platformio.ini
+++ b/variants/esp32/heltec_wsl_v2.1/platformio.ini
@@ -3,5 +3,7 @@ extends = esp32_base
board = heltec_wireless_stick_lite
board_level = extra
build_flags =
- ${esp32_base.build_flags} -D PRIVATE_HW -I variants/heltec_wsl_v2.1
- -DGPS_POWER_TOGGLE ; comment this line to disable triple press function on the user button to turn off gps entirely.
\ No newline at end of file
+ ${esp32_base.build_flags}
+ -D PRIVATE_HW
+ -I variants/esp32/heltec_wsl_v2.1
+ -DGPS_POWER_TOGGLE ; comment this line to disable triple press function on the user button to turn off gps entirely.
diff --git a/variants/heltec_wsl_v2.1/variant.h b/variants/esp32/heltec_wsl_v2.1/variant.h
similarity index 100%
rename from variants/heltec_wsl_v2.1/variant.h
rename to variants/esp32/heltec_wsl_v2.1/variant.h
diff --git a/variants/m5stack_core/pins_arduino.h b/variants/esp32/m5stack_core/pins_arduino.h
similarity index 100%
rename from variants/m5stack_core/pins_arduino.h
rename to variants/esp32/m5stack_core/pins_arduino.h
diff --git a/variants/m5stack_core/platformio.ini b/variants/esp32/m5stack_core/platformio.ini
similarity index 90%
rename from variants/m5stack_core/platformio.ini
rename to variants/esp32/m5stack_core/platformio.ini
index 7418d9e17..469d93f94 100644
--- a/variants/m5stack_core/platformio.ini
+++ b/variants/esp32/m5stack_core/platformio.ini
@@ -5,7 +5,8 @@ monitor_filters = esp32_exception_decoder
build_src_filter =
${esp32_base.build_src_filter}
build_flags =
- ${esp32_base.build_flags} -I variants/m5stack_core
+ ${esp32_base.build_flags}
+ -I variants/esp32/m5stack_core
-DILI9341_DRIVER
-DM5STACK
-DUSER_SETUP_LOADED
diff --git a/variants/m5stack_core/variant.h b/variants/esp32/m5stack_core/variant.h
similarity index 100%
rename from variants/m5stack_core/variant.h
rename to variants/esp32/m5stack_core/variant.h
diff --git a/variants/m5stack_coreink/pins_arduino.h b/variants/esp32/m5stack_coreink/pins_arduino.h
similarity index 100%
rename from variants/m5stack_coreink/pins_arduino.h
rename to variants/esp32/m5stack_coreink/pins_arduino.h
diff --git a/variants/m5stack_coreink/platformio.ini b/variants/esp32/m5stack_coreink/platformio.ini
similarity index 90%
rename from variants/m5stack_coreink/platformio.ini
rename to variants/esp32/m5stack_coreink/platformio.ini
index 70da53379..1a00788e3 100644
--- a/variants/m5stack_coreink/platformio.ini
+++ b/variants/esp32/m5stack_coreink/platformio.ini
@@ -5,7 +5,8 @@ board_check = true
build_src_filter =
${esp32_base.build_src_filter}
build_flags =
- ${esp32_base.build_flags} -I variants/m5stack_coreink
+ ${esp32_base.build_flags}
+ -I variants/esp32/m5stack_coreink
;-D RADIOLIB_VERBOSE
-Ofast
-D__MCUXPRESSO
diff --git a/variants/m5stack_coreink/variant.h b/variants/esp32/m5stack_coreink/variant.h
similarity index 100%
rename from variants/m5stack_coreink/variant.h
rename to variants/esp32/m5stack_coreink/variant.h
diff --git a/variants/nano-g1-explorer/platformio.ini b/variants/esp32/nano-g1-explorer/platformio.ini
similarity index 65%
rename from variants/nano-g1-explorer/platformio.ini
rename to variants/esp32/nano-g1-explorer/platformio.ini
index 22037cbc9..2ba1f49e9 100644
--- a/variants/nano-g1-explorer/platformio.ini
+++ b/variants/esp32/nano-g1-explorer/platformio.ini
@@ -5,4 +5,6 @@ board = ttgo-t-beam
lib_deps =
${esp32_base.lib_deps}
build_flags =
- ${esp32_base.build_flags} -D NANO_G1_EXPLORER -I variants/nano-g1-explorer
\ No newline at end of file
+ ${esp32_base.build_flags}
+ -D NANO_G1_EXPLORER
+ -I variants/esp32/nano-g1-explorer
diff --git a/variants/nano-g1-explorer/variant.h b/variants/esp32/nano-g1-explorer/variant.h
similarity index 100%
rename from variants/nano-g1-explorer/variant.h
rename to variants/esp32/nano-g1-explorer/variant.h
diff --git a/variants/nano-g1/platformio.ini b/variants/esp32/nano-g1/platformio.ini
similarity index 67%
rename from variants/nano-g1/platformio.ini
rename to variants/esp32/nano-g1/platformio.ini
index a3107423e..be8227de2 100644
--- a/variants/nano-g1/platformio.ini
+++ b/variants/esp32/nano-g1/platformio.ini
@@ -5,4 +5,6 @@ board = ttgo-t-beam
lib_deps =
${esp32_base.lib_deps}
build_flags =
- ${esp32_base.build_flags} -D NANO_G1 -I variants/nano-g1
\ No newline at end of file
+ ${esp32_base.build_flags}
+ -D NANO_G1
+ -I variants/esp32/nano-g1
diff --git a/variants/nano-g1/variant.h b/variants/esp32/nano-g1/variant.h
similarity index 100%
rename from variants/nano-g1/variant.h
rename to variants/esp32/nano-g1/variant.h
diff --git a/variants/radiomaster_900_bandit/platformio.ini b/variants/esp32/radiomaster_900_bandit/platformio.ini
similarity index 90%
rename from variants/radiomaster_900_bandit/platformio.ini
rename to variants/esp32/radiomaster_900_bandit/platformio.ini
index f87025937..d9eb78a57 100644
--- a/variants/radiomaster_900_bandit/platformio.ini
+++ b/variants/esp32/radiomaster_900_bandit/platformio.ini
@@ -8,7 +8,7 @@ build_flags =
-DCONFIG_DISABLE_HAL_LOCKS=1
-DHAS_STK8XXX=1
-O2
- -Ivariants/radiomaster_900_bandit
+ -I variants/esp32/radiomaster_900_bandit
board_build.f_cpu = 240000000L
upload_protocol = esptool
lib_deps =
diff --git a/variants/radiomaster_900_bandit/variant.h b/variants/esp32/radiomaster_900_bandit/variant.h
similarity index 100%
rename from variants/radiomaster_900_bandit/variant.h
rename to variants/esp32/radiomaster_900_bandit/variant.h
diff --git a/variants/radiomaster_900_bandit_micro/platformio.ini b/variants/esp32/radiomaster_900_bandit_micro/platformio.ini
similarity index 87%
rename from variants/radiomaster_900_bandit_micro/platformio.ini
rename to variants/esp32/radiomaster_900_bandit_micro/platformio.ini
index 9e54f5859..36a45787b 100644
--- a/variants/radiomaster_900_bandit_micro/platformio.ini
+++ b/variants/esp32/radiomaster_900_bandit_micro/platformio.ini
@@ -12,8 +12,8 @@ build_flags =
-DVTABLES_IN_FLASH=1
-DCONFIG_DISABLE_HAL_LOCKS=1
-O2
- -Ivariants/radiomaster_900_bandit_nano
+ -I variants/esp32/radiomaster_900_bandit_nano
board_build.f_cpu = 240000000L
upload_protocol = esptool
lib_deps =
- ${esp32_base.lib_deps}
\ No newline at end of file
+ ${esp32_base.lib_deps}
diff --git a/variants/radiomaster_900_bandit_nano/platformio.ini b/variants/esp32/radiomaster_900_bandit_nano/platformio.ini
similarity index 79%
rename from variants/radiomaster_900_bandit_nano/platformio.ini
rename to variants/esp32/radiomaster_900_bandit_nano/platformio.ini
index 0d43b8665..9a7fad83b 100644
--- a/variants/radiomaster_900_bandit_nano/platformio.ini
+++ b/variants/esp32/radiomaster_900_bandit_nano/platformio.ini
@@ -7,8 +7,8 @@ build_flags =
-DVTABLES_IN_FLASH=1
-DCONFIG_DISABLE_HAL_LOCKS=1
-O2
- -Ivariants/radiomaster_900_bandit_nano
+ -I variants/esp32/radiomaster_900_bandit_nano
board_build.f_cpu = 240000000L
upload_protocol = esptool
lib_deps =
- ${esp32_base.lib_deps}
\ No newline at end of file
+ ${esp32_base.lib_deps}
diff --git a/variants/radiomaster_900_bandit_nano/variant.h b/variants/esp32/radiomaster_900_bandit_nano/variant.h
similarity index 100%
rename from variants/radiomaster_900_bandit_nano/variant.h
rename to variants/esp32/radiomaster_900_bandit_nano/variant.h
diff --git a/variants/rak11200/pins_arduino.h b/variants/esp32/rak11200/pins_arduino.h
similarity index 100%
rename from variants/rak11200/pins_arduino.h
rename to variants/esp32/rak11200/pins_arduino.h
diff --git a/variants/rak11200/platformio.ini b/variants/esp32/rak11200/platformio.ini
similarity index 50%
rename from variants/rak11200/platformio.ini
rename to variants/esp32/rak11200/platformio.ini
index eddc3458e..6149333f6 100644
--- a/variants/rak11200/platformio.ini
+++ b/variants/esp32/rak11200/platformio.ini
@@ -3,5 +3,7 @@ extends = esp32_base
board = wiscore_rak11200
board_check = true
build_flags =
- ${esp32_base.build_flags} -D RAK_11200 -I variants/rak11200
-upload_speed = 115200
\ No newline at end of file
+ ${esp32_base.build_flags}
+ -D RAK_11200
+ -I variants/esp32/rak11200
+upload_speed = 115200
diff --git a/variants/rak11200/variant.h b/variants/esp32/rak11200/variant.h
similarity index 100%
rename from variants/rak11200/variant.h
rename to variants/esp32/rak11200/variant.h
diff --git a/variants/station-g1/platformio.ini b/variants/esp32/station-g1/platformio.ini
similarity index 66%
rename from variants/station-g1/platformio.ini
rename to variants/esp32/station-g1/platformio.ini
index a466414d0..693a41ae8 100644
--- a/variants/station-g1/platformio.ini
+++ b/variants/esp32/station-g1/platformio.ini
@@ -5,4 +5,6 @@ board = ttgo-t-beam
lib_deps =
${esp32_base.lib_deps}
build_flags =
- ${esp32_base.build_flags} -D STATION_G1 -I variants/station-g1
\ No newline at end of file
+ ${esp32_base.build_flags}
+ -D STATION_G1
+ -I variants/esp32/station-g1
diff --git a/variants/station-g1/variant.h b/variants/esp32/station-g1/variant.h
similarity index 100%
rename from variants/station-g1/variant.h
rename to variants/esp32/station-g1/variant.h
diff --git a/variants/tbeam/platformio.ini b/variants/esp32/tbeam/platformio.ini
similarity index 78%
rename from variants/tbeam/platformio.ini
rename to variants/esp32/tbeam/platformio.ini
index 9049836a3..084a981da 100644
--- a/variants/tbeam/platformio.ini
+++ b/variants/esp32/tbeam/platformio.ini
@@ -6,8 +6,10 @@ board_check = true
lib_deps =
${esp32_base.lib_deps}
build_flags =
- ${esp32_base.build_flags} -D TBEAM_V10 -I variants/tbeam
+ ${esp32_base.build_flags}
+ -D TBEAM_V10
+ -I variants/esp32/tbeam
-DGPS_POWER_TOGGLE ; comment this line to disable double press function on the user button to turn off gps entirely.
-DBOARD_HAS_PSRAM
-mfix-esp32-psram-cache-issue
-upload_speed = 921600
\ No newline at end of file
+upload_speed = 921600
diff --git a/variants/tbeam/variant.h b/variants/esp32/tbeam/variant.h
similarity index 100%
rename from variants/tbeam/variant.h
rename to variants/esp32/tbeam/variant.h
diff --git a/variants/tbeam_v07/platformio.ini b/variants/esp32/tbeam_v07/platformio.ini
similarity index 69%
rename from variants/tbeam_v07/platformio.ini
rename to variants/esp32/tbeam_v07/platformio.ini
index 0cba92400..1647d9fd7 100644
--- a/variants/tbeam_v07/platformio.ini
+++ b/variants/esp32/tbeam_v07/platformio.ini
@@ -4,4 +4,6 @@ board_level = extra
extends = esp32_base
board = ttgo-t-beam
build_flags =
- ${esp32_base.build_flags} -D TBEAM_V07 -I variants/tbeam_v07
\ No newline at end of file
+ ${esp32_base.build_flags}
+ -D TBEAM_V07
+ -I variants/esp32/tbeam_v07
diff --git a/variants/tbeam_v07/variant.h b/variants/esp32/tbeam_v07/variant.h
similarity index 100%
rename from variants/tbeam_v07/variant.h
rename to variants/esp32/tbeam_v07/variant.h
diff --git a/variants/tlora_v1/platformio.ini b/variants/esp32/tlora_v1/platformio.ini
similarity index 50%
rename from variants/tlora_v1/platformio.ini
rename to variants/esp32/tlora_v1/platformio.ini
index 17fc71d72..1d879b6b0 100644
--- a/variants/tlora_v1/platformio.ini
+++ b/variants/esp32/tlora_v1/platformio.ini
@@ -3,5 +3,7 @@ board_level = extra
extends = esp32_base
board = ttgo-lora32-v1
build_flags =
- ${esp32_base.build_flags} -D TLORA_V1 -I variants/tlora_v1
-upload_speed = 115200
\ No newline at end of file
+ ${esp32_base.build_flags}
+ -D TLORA_V1
+ -I variants/esp32/tlora_v1
+upload_speed = 115200
diff --git a/variants/tlora_v1/variant.h b/variants/esp32/tlora_v1/variant.h
similarity index 100%
rename from variants/tlora_v1/variant.h
rename to variants/esp32/tlora_v1/variant.h
diff --git a/variants/tlora_v1_3/platformio.ini b/variants/esp32/tlora_v1_3/platformio.ini
similarity index 50%
rename from variants/tlora_v1_3/platformio.ini
rename to variants/esp32/tlora_v1_3/platformio.ini
index c5eca589f..523c38a80 100644
--- a/variants/tlora_v1_3/platformio.ini
+++ b/variants/esp32/tlora_v1_3/platformio.ini
@@ -3,5 +3,5 @@ board_level = extra
extends = esp32_base
board = ttgo-lora32-v1
build_flags =
- ${esp32_base.build_flags} -D TLORA_V1_3 -I variants/tlora_v1_3
-upload_speed = 115200
\ No newline at end of file
+ ${esp32_base.build_flags} -D TLORA_V1_3 -I variants/esp32/tlora_v1_3
+upload_speed = 115200
diff --git a/variants/tlora_v1_3/variant.h b/variants/esp32/tlora_v1_3/variant.h
similarity index 100%
rename from variants/tlora_v1_3/variant.h
rename to variants/esp32/tlora_v1_3/variant.h
diff --git a/variants/tlora_v2/platformio.ini b/variants/esp32/tlora_v2/platformio.ini
similarity index 56%
rename from variants/tlora_v2/platformio.ini
rename to variants/esp32/tlora_v2/platformio.ini
index 8087a30e3..4a710ee34 100644
--- a/variants/tlora_v2/platformio.ini
+++ b/variants/esp32/tlora_v2/platformio.ini
@@ -3,4 +3,6 @@ board_level = extra
extends = esp32_base
board = ttgo-lora32-v1
build_flags =
- ${esp32_base.build_flags} -D TLORA_V2 -I variants/tlora_v2
\ No newline at end of file
+ ${esp32_base.build_flags}
+ -D TLORA_V2
+ -I variants/esp32/tlora_v2
diff --git a/variants/tlora_v2/variant.h b/variants/esp32/tlora_v2/variant.h
similarity index 100%
rename from variants/tlora_v2/variant.h
rename to variants/esp32/tlora_v2/variant.h
diff --git a/variants/tlora_v2_1_16/platformio.ini b/variants/esp32/tlora_v2_1_16/platformio.ini
similarity index 68%
rename from variants/tlora_v2_1_16/platformio.ini
rename to variants/esp32/tlora_v2_1_16/platformio.ini
index 4253cc6af..bd85aa847 100644
--- a/variants/tlora_v2_1_16/platformio.ini
+++ b/variants/esp32/tlora_v2_1_16/platformio.ini
@@ -3,6 +3,6 @@ extends = esp32_base
board = ttgo-lora32-v21
board_check = true
build_flags =
- ${esp32_base.build_flags} -D TLORA_V2_1_16 -I variants/tlora_v2_1_16
+ ${esp32_base.build_flags} -D TLORA_V2_1_16 -I variants/esp32/tlora_v2_1_16
-DGPS_POWER_TOGGLE ; comment this line to disable triple press function on the user button to turn off gps entirely.
-upload_speed = 115200
\ No newline at end of file
+upload_speed = 115200
diff --git a/variants/tlora_v2_1_16/variant.h b/variants/esp32/tlora_v2_1_16/variant.h
similarity index 100%
rename from variants/tlora_v2_1_16/variant.h
rename to variants/esp32/tlora_v2_1_16/variant.h
diff --git a/variants/tlora_v2_1_16_tcxo/platformio.ini b/variants/esp32/tlora_v2_1_16_tcxo/platformio.ini
similarity index 90%
rename from variants/tlora_v2_1_16_tcxo/platformio.ini
rename to variants/esp32/tlora_v2_1_16_tcxo/platformio.ini
index 5c7cb7eb3..9404faa02 100644
--- a/variants/tlora_v2_1_16_tcxo/platformio.ini
+++ b/variants/esp32/tlora_v2_1_16_tcxo/platformio.ini
@@ -5,7 +5,7 @@ board = ttgo-lora32-v21
build_flags =
${esp32_base.build_flags}
-D TLORA_V2_1_16
- -I variants/tlora_v2_1_16
+ -I variants/esp32/tlora_v2_1_16
-D GPS_POWER_TOGGLE ; comment this line to disable triple press function on the user button to turn off gps entirely.
-D LORA_TCXO_GPIO=33
upload_speed = 115200
\ No newline at end of file
diff --git a/variants/tlora_v2_1_18/platformio.ini b/variants/esp32/tlora_v2_1_18/platformio.ini
similarity index 55%
rename from variants/tlora_v2_1_18/platformio.ini
rename to variants/esp32/tlora_v2_1_18/platformio.ini
index 48a001ced..432117485 100644
--- a/variants/tlora_v2_1_18/platformio.ini
+++ b/variants/esp32/tlora_v2_1_18/platformio.ini
@@ -4,4 +4,6 @@ board_level = extra
board = ttgo-lora32-v21
build_flags =
- ${esp32_base.build_flags} -D TLORA_V2_1_18 -I variants/tlora_v2_1_18
\ No newline at end of file
+ ${esp32_base.build_flags}
+ -D TLORA_V2_1_18
+ -I variants/esp32/tlora_v2_1_18
diff --git a/variants/tlora_v2_1_18/variant.h b/variants/esp32/tlora_v2_1_18/variant.h
similarity index 100%
rename from variants/tlora_v2_1_18/variant.h
rename to variants/esp32/tlora_v2_1_18/variant.h
diff --git a/variants/tlora_v3_3_0_tcxo/platformio.ini b/variants/esp32/tlora_v3_3_0_tcxo/platformio.ini
similarity index 89%
rename from variants/tlora_v3_3_0_tcxo/platformio.ini
rename to variants/esp32/tlora_v3_3_0_tcxo/platformio.ini
index 8d060a087..f1110386e 100644
--- a/variants/tlora_v3_3_0_tcxo/platformio.ini
+++ b/variants/esp32/tlora_v3_3_0_tcxo/platformio.ini
@@ -4,7 +4,7 @@ board = ttgo-lora32-v21
build_flags =
${esp32_base.build_flags}
-D TLORA_V2_1_16
- -I variants/tlora_v2_1_16
+ -I variants/esp32/tlora_v2_1_16
-D GPS_POWER_TOGGLE ; comment this line to disable triple press function on the user button to turn off gps entirely.
-D LORA_TCXO_GPIO=12
-D BUTTON_PIN=0
\ No newline at end of file
diff --git a/variants/trackerd/platformio.ini b/variants/esp32/trackerd/platformio.ini
similarity index 56%
rename from variants/trackerd/platformio.ini
rename to variants/esp32/trackerd/platformio.ini
index 654534a15..3c2726a3c 100644
--- a/variants/trackerd/platformio.ini
+++ b/variants/esp32/trackerd/platformio.ini
@@ -4,5 +4,5 @@ board = pico32
board_build.f_flash = 80000000L
build_flags =
- ${esp32_base.build_flags} -D PRIVATE_HW -I variants/trackerd -D BSFILE=\"boards/dragino_lbt2.h\"
+ ${esp32_base.build_flags} -D PRIVATE_HW -I variants/esp32/trackerd -D BSFILE=\"boards/dragino_lbt2.h\"
;board_build.partitions = no_ota.csv
\ No newline at end of file
diff --git a/variants/trackerd/variant.h b/variants/esp32/trackerd/variant.h
similarity index 100%
rename from variants/trackerd/variant.h
rename to variants/esp32/trackerd/variant.h
diff --git a/variants/wiphone/pins_arduino.h b/variants/esp32/wiphone/pins_arduino.h
similarity index 100%
rename from variants/wiphone/pins_arduino.h
rename to variants/esp32/wiphone/pins_arduino.h
diff --git a/variants/wiphone/platformio.ini b/variants/esp32/wiphone/platformio.ini
similarity index 81%
rename from variants/wiphone/platformio.ini
rename to variants/esp32/wiphone/platformio.ini
index 362102731..5cce94b13 100644
--- a/variants/wiphone/platformio.ini
+++ b/variants/esp32/wiphone/platformio.ini
@@ -5,7 +5,9 @@ board_level = extra
monitor_filters = esp32_exception_decoder
board_build.partitions = default_16MB.csv
build_flags =
- ${esp32_base.build_flags} -D WIPHONE -I variants/wiphone
+ ${esp32_base.build_flags}
+ -D WIPHONE
+ -I variants/esp32/wiphone
lib_deps =
${esp32_base.lib_deps}
lovyan03/LovyanGFX@^1.2.0
diff --git a/variants/wiphone/variant.h b/variants/esp32/wiphone/variant.h
similarity index 100%
rename from variants/wiphone/variant.h
rename to variants/esp32/wiphone/variant.h
diff --git a/variants/ai-c3/platformio.ini b/variants/esp32c3/ai-c3/platformio.ini
similarity index 57%
rename from variants/ai-c3/platformio.ini
rename to variants/esp32c3/ai-c3/platformio.ini
index 2869ca580..a25c0cb19 100644
--- a/variants/ai-c3/platformio.ini
+++ b/variants/esp32c3/ai-c3/platformio.ini
@@ -2,7 +2,7 @@
extends = esp32c3_base
board = esp32-c3-devkitm-1
board_level = extra
-build_flags = ${esp32c3_base.build_flags}
+build_flags =
+ ${esp32c3_base.build_flags}
-D PRIVATE_HW
- -I variants/ai-c3
-
+ -I variants/esp32c3/ai-c3
diff --git a/variants/ai-c3/variant.h b/variants/esp32c3/ai-c3/variant.h
similarity index 100%
rename from variants/ai-c3/variant.h
rename to variants/esp32c3/ai-c3/variant.h
diff --git a/variants/diy/esp32c3_super_mini/pins_arduino.h b/variants/esp32c3/diy/esp32c3_super_mini/pins_arduino.h
similarity index 100%
rename from variants/diy/esp32c3_super_mini/pins_arduino.h
rename to variants/esp32c3/diy/esp32c3_super_mini/pins_arduino.h
diff --git a/variants/esp32c3/diy/esp32c3_super_mini/platformio.ini b/variants/esp32c3/diy/esp32c3_super_mini/platformio.ini
new file mode 100644
index 000000000..c87baa7bf
--- /dev/null
+++ b/variants/esp32c3/diy/esp32c3_super_mini/platformio.ini
@@ -0,0 +1,12 @@
+; ESP32 C3 Super Mini Development Board
+; https://www.espboards.dev/esp32/esp32-c3-super-mini/
+[env:esp32c3_super_mini]
+extends = esp32c3_base
+board = esp32-c3-devkitm-1
+build_flags =
+ ${esp32_base.build_flags}
+ -D PRIVATE_HW
+ -I variants/esp32c3/diy/esp32c3_super_mini
+ -D ARDUINO_USB_MODE=1
+ -D ARDUINO_USB_CDC_ON_BOOT=1
+board_level = extra
diff --git a/variants/diy/esp32c3_super_mini/variant.h b/variants/esp32c3/diy/esp32c3_super_mini/variant.h
similarity index 100%
rename from variants/diy/esp32c3_super_mini/variant.h
rename to variants/esp32c3/diy/esp32c3_super_mini/variant.h
diff --git a/variants/hackerboxes_esp32c3_oled/platformio.ini b/variants/esp32c3/hackerboxes_esp32c3_oled/platformio.ini
similarity index 80%
rename from variants/hackerboxes_esp32c3_oled/platformio.ini
rename to variants/esp32c3/hackerboxes_esp32c3_oled/platformio.ini
index 4fcbf2ade..5a72b9d74 100644
--- a/variants/hackerboxes_esp32c3_oled/platformio.ini
+++ b/variants/esp32c3/hackerboxes_esp32c3_oled/platformio.ini
@@ -7,8 +7,8 @@ build_flags =
-D PRIVATE_HW
-D ARDUINO_USB_MODE=1
-D ARDUINO_USB_CDC_ON_BOOT=1
- -I variants/hackerboxes_esp32c3_oled
+ -I variants/esp32c3/hackerboxes_esp32c3_oled
monitor_speed = 115200
upload_protocol = esptool
;upload_port = /dev/ttyUSB0
-upload_speed = 921600
\ No newline at end of file
+upload_speed = 921600
diff --git a/variants/hackerboxes_esp32c3_oled/variant.h b/variants/esp32c3/hackerboxes_esp32c3_oled/variant.h
similarity index 100%
rename from variants/hackerboxes_esp32c3_oled/variant.h
rename to variants/esp32c3/hackerboxes_esp32c3_oled/variant.h
diff --git a/variants/heltec_esp32c3/pins_arduino.h b/variants/esp32c3/heltec_esp32c3/pins_arduino.h
similarity index 100%
rename from variants/heltec_esp32c3/pins_arduino.h
rename to variants/esp32c3/heltec_esp32c3/pins_arduino.h
diff --git a/variants/heltec_esp32c3/platformio.ini b/variants/esp32c3/heltec_esp32c3/platformio.ini
similarity index 78%
rename from variants/heltec_esp32c3/platformio.ini
rename to variants/esp32c3/heltec_esp32c3/platformio.ini
index 6fe5c3c69..d21d64d2a 100644
--- a/variants/heltec_esp32c3/platformio.ini
+++ b/variants/esp32c3/heltec_esp32c3/platformio.ini
@@ -4,8 +4,8 @@ board = esp32-c3-devkitm-1
build_flags =
${esp32_base.build_flags}
-D HELTEC_HT62
- -I variants/heltec_esp32c3
+ -I variants/esp32c3/heltec_esp32c3
monitor_speed = 115200
upload_protocol = esptool
;upload_port = /dev/ttyUSB0
-upload_speed = 921600
\ No newline at end of file
+upload_speed = 921600
diff --git a/variants/heltec_esp32c3/variant.h b/variants/esp32c3/heltec_esp32c3/variant.h
similarity index 100%
rename from variants/heltec_esp32c3/variant.h
rename to variants/esp32c3/heltec_esp32c3/variant.h
diff --git a/variants/heltec_hru_3601/pins_arduino.h b/variants/esp32c3/heltec_hru_3601/pins_arduino.h
similarity index 100%
rename from variants/heltec_hru_3601/pins_arduino.h
rename to variants/esp32c3/heltec_hru_3601/pins_arduino.h
diff --git a/variants/heltec_hru_3601/platformio.ini b/variants/esp32c3/heltec_hru_3601/platformio.ini
similarity index 84%
rename from variants/heltec_hru_3601/platformio.ini
rename to variants/esp32c3/heltec_hru_3601/platformio.ini
index 3668e72b7..b5ff63eae 100644
--- a/variants/heltec_hru_3601/platformio.ini
+++ b/variants/esp32c3/heltec_hru_3601/platformio.ini
@@ -4,6 +4,6 @@ board = adafruit_qtpy_esp32c3
build_flags =
${esp32_base.build_flags}
-D HELTEC_HRU_3601
- -I variants/heltec_hru_3601
+ -I variants/esp32c3/heltec_hru_3601
lib_deps = ${esp32c3_base.lib_deps}
adafruit/Adafruit NeoPixel @ ^1.12.0
diff --git a/variants/heltec_hru_3601/variant.h b/variants/esp32c3/heltec_hru_3601/variant.h
similarity index 100%
rename from variants/heltec_hru_3601/variant.h
rename to variants/esp32c3/heltec_hru_3601/variant.h
diff --git a/variants/m5stack-stamp-c3/pins_arduino.h b/variants/esp32c3/m5stack-stamp-c3/pins_arduino.h
similarity index 100%
rename from variants/m5stack-stamp-c3/pins_arduino.h
rename to variants/esp32c3/m5stack-stamp-c3/pins_arduino.h
diff --git a/variants/m5stack-stamp-c3/platformio.ini b/variants/esp32c3/m5stack-stamp-c3/platformio.ini
similarity index 86%
rename from variants/m5stack-stamp-c3/platformio.ini
rename to variants/esp32c3/m5stack-stamp-c3/platformio.ini
index bab65b621..1072df664 100644
--- a/variants/m5stack-stamp-c3/platformio.ini
+++ b/variants/esp32c3/m5stack-stamp-c3/platformio.ini
@@ -5,7 +5,7 @@ board_level = extra
build_flags =
${esp32_base.build_flags}
-D PRIVATE_HW
- -I variants/m5stack-stamp-c3
+ -I variants/esp32c3/m5stack-stamp-c3
monitor_speed = 115200
upload_protocol = esptool
;upload_port = /dev/ttyACM2
diff --git a/variants/m5stack-stamp-c3/variant.h b/variants/esp32c3/m5stack-stamp-c3/variant.h
similarity index 100%
rename from variants/m5stack-stamp-c3/variant.h
rename to variants/esp32c3/m5stack-stamp-c3/variant.h
diff --git a/variants/nugget_s2_lora/platformio.ini b/variants/esp32s2/nugget_s2_lora/platformio.ini
similarity index 54%
rename from variants/nugget_s2_lora/platformio.ini
rename to variants/esp32s2/nugget_s2_lora/platformio.ini
index 2a7ff1013..a091a705f 100644
--- a/variants/nugget_s2_lora/platformio.ini
+++ b/variants/esp32s2/nugget_s2_lora/platformio.ini
@@ -3,4 +3,6 @@ extends = esp32s2_base
board = lolin_s2_mini
board_level = extra
build_flags =
- ${esp32s2_base.build_flags} -D PRIVATE_HW -I variants/nugget_s2_lora
\ No newline at end of file
+ ${esp32s2_base.build_flags}
+ -D PRIVATE_HW
+ -I variants/esp32s2/nugget_s2_lora
diff --git a/variants/nugget_s2_lora/variant.h b/variants/esp32s2/nugget_s2_lora/variant.h
similarity index 100%
rename from variants/nugget_s2_lora/variant.h
rename to variants/esp32s2/nugget_s2_lora/variant.h
diff --git a/variants/CDEBYTE_EoRa-S3/pins_arduino.h b/variants/esp32s3/CDEBYTE_EoRa-S3/pins_arduino.h
similarity index 100%
rename from variants/CDEBYTE_EoRa-S3/pins_arduino.h
rename to variants/esp32s3/CDEBYTE_EoRa-S3/pins_arduino.h
diff --git a/variants/CDEBYTE_EoRa-S3/platformio.ini b/variants/esp32s3/CDEBYTE_EoRa-S3/platformio.ini
similarity index 69%
rename from variants/CDEBYTE_EoRa-S3/platformio.ini
rename to variants/esp32s3/CDEBYTE_EoRa-S3/platformio.ini
index a1642ff97..dbd420f04 100644
--- a/variants/CDEBYTE_EoRa-S3/platformio.ini
+++ b/variants/esp32s3/CDEBYTE_EoRa-S3/platformio.ini
@@ -4,5 +4,5 @@ board = CDEBYTE_EoRa-S3
build_flags =
${esp32s3_base.build_flags}
-D CDEBYTE_EORA_S3
- -I variants/CDEBYTE_EoRa-S3
- -D GPS_POWER_TOGGLE
\ No newline at end of file
+ -I variants/esp32s3/CDEBYTE_EoRa-S3
+ -D GPS_POWER_TOGGLE
diff --git a/variants/CDEBYTE_EoRa-S3/variant.h b/variants/esp32s3/CDEBYTE_EoRa-S3/variant.h
similarity index 100%
rename from variants/CDEBYTE_EoRa-S3/variant.h
rename to variants/esp32s3/CDEBYTE_EoRa-S3/variant.h
diff --git a/variants/EBYTE_ESP32-S3/pins_arduino.h b/variants/esp32s3/EBYTE_ESP32-S3/pins_arduino.h
similarity index 100%
rename from variants/EBYTE_ESP32-S3/pins_arduino.h
rename to variants/esp32s3/EBYTE_ESP32-S3/pins_arduino.h
diff --git a/variants/EBYTE_ESP32-S3/platformio.ini b/variants/esp32s3/EBYTE_ESP32-S3/platformio.ini
similarity index 86%
rename from variants/EBYTE_ESP32-S3/platformio.ini
rename to variants/esp32s3/EBYTE_ESP32-S3/platformio.ini
index 10de91386..507a19588 100644
--- a/variants/EBYTE_ESP32-S3/platformio.ini
+++ b/variants/esp32s3/EBYTE_ESP32-S3/platformio.ini
@@ -6,4 +6,4 @@ board_level = extra
build_flags =
${esp32s3_base.build_flags}
-D EBYTE_ESP32_S3
- -I variants/EBYTE_ESP32-S3
+ -I variants/esp32s3/EBYTE_ESP32-S3
diff --git a/variants/EBYTE_ESP32-S3/variant.h b/variants/esp32s3/EBYTE_ESP32-S3/variant.h
similarity index 100%
rename from variants/EBYTE_ESP32-S3/variant.h
rename to variants/esp32s3/EBYTE_ESP32-S3/variant.h
diff --git a/variants/ELECROW-ThinkNode-M2/pins_arduino.h b/variants/esp32s3/ELECROW-ThinkNode-M2/pins_arduino.h
similarity index 100%
rename from variants/ELECROW-ThinkNode-M2/pins_arduino.h
rename to variants/esp32s3/ELECROW-ThinkNode-M2/pins_arduino.h
diff --git a/variants/ELECROW-ThinkNode-M2/platformio.ini b/variants/esp32s3/ELECROW-ThinkNode-M2/platformio.ini
similarity index 76%
rename from variants/ELECROW-ThinkNode-M2/platformio.ini
rename to variants/esp32s3/ELECROW-ThinkNode-M2/platformio.ini
index c08c94a71..01e82184b 100644
--- a/variants/ELECROW-ThinkNode-M2/platformio.ini
+++ b/variants/esp32s3/ELECROW-ThinkNode-M2/platformio.ini
@@ -4,4 +4,4 @@ board = ESP32-S3-WROOM-1-N4
build_flags =
${esp32s3_base.build_flags}
-D ELECROW_ThinkNode_M2
- -I variants/ELECROW-ThinkNode-M2
+ -I variants/esp32s3/ELECROW-ThinkNode-M2
diff --git a/variants/ELECROW-ThinkNode-M2/variant.h b/variants/esp32s3/ELECROW-ThinkNode-M2/variant.h
similarity index 100%
rename from variants/ELECROW-ThinkNode-M2/variant.h
rename to variants/esp32s3/ELECROW-ThinkNode-M2/variant.h
diff --git a/variants/bpi_picow_esp32_s3/pins_arduino.h b/variants/esp32s3/bpi_picow_esp32_s3/pins_arduino.h
similarity index 100%
rename from variants/bpi_picow_esp32_s3/pins_arduino.h
rename to variants/esp32s3/bpi_picow_esp32_s3/pins_arduino.h
diff --git a/variants/bpi_picow_esp32_s3/platformio.ini b/variants/esp32s3/bpi_picow_esp32_s3/platformio.ini
similarity index 77%
rename from variants/bpi_picow_esp32_s3/platformio.ini
rename to variants/esp32s3/bpi_picow_esp32_s3/platformio.ini
index 7e94cc97e..57af0da82 100644
--- a/variants/bpi_picow_esp32_s3/platformio.ini
+++ b/variants/esp32s3/bpi_picow_esp32_s3/platformio.ini
@@ -11,4 +11,6 @@ lib_deps =
${esp32_base.lib_deps}
caveman99/ESP32 Codec2@^1.0.1
build_flags =
- ${esp32_base.build_flags} -D PRIVATE_HW -I variants/bpi_picow_esp32_s3
\ No newline at end of file
+ ${esp32_base.build_flags}
+ -D PRIVATE_HW
+ -I variants/esp32s3/bpi_picow_esp32_s3
diff --git a/variants/bpi_picow_esp32_s3/variant.h b/variants/esp32s3/bpi_picow_esp32_s3/variant.h
similarity index 100%
rename from variants/bpi_picow_esp32_s3/variant.h
rename to variants/esp32s3/bpi_picow_esp32_s3/variant.h
diff --git a/variants/crowpanel-esp32s3-5-epaper/pins_arduino.h b/variants/esp32s3/crowpanel-esp32s3-5-epaper/pins_arduino.h
similarity index 100%
rename from variants/crowpanel-esp32s3-5-epaper/pins_arduino.h
rename to variants/esp32s3/crowpanel-esp32s3-5-epaper/pins_arduino.h
diff --git a/variants/crowpanel-esp32s3-5-epaper/platformio.ini b/variants/esp32s3/crowpanel-esp32s3-5-epaper/platformio.ini
similarity index 89%
rename from variants/crowpanel-esp32s3-5-epaper/platformio.ini
rename to variants/esp32s3/crowpanel-esp32s3-5-epaper/platformio.ini
index ebf013f64..49e84bf4f 100644
--- a/variants/crowpanel-esp32s3-5-epaper/platformio.ini
+++ b/variants/esp32s3/crowpanel-esp32s3-5-epaper/platformio.ini
@@ -11,7 +11,9 @@ board = esp32-s3-devkitc-1
board_level = extra
upload_protocol = esptool
build_flags =
- ${esp32s3_base.build_flags} -D CROWPANEL_ESP32S3_5_EPAPER -I variants/crowpanel-esp32s3-5-epaper
+ ${esp32s3_base.build_flags}
+ -D CROWPANEL_ESP32S3_5_EPAPER
+ -I variants/esp32s3/crowpanel-esp32s3-5-epaper
-D PRIVATE_HW
-DBOARD_HAS_PSRAM
-DGPS_POWER_TOGGLE
@@ -39,7 +41,9 @@ board = esp32-s3-devkitc-1
board_level = extra
upload_protocol = esptool
build_flags =
- ${esp32s3_base.build_flags} -D CROWPANEL_ESP32S3_4_EPAPER -I variants/crowpanel-esp32s3-5-epaper
+ ${esp32s3_base.build_flags}
+ -D CROWPANEL_ESP32S3_4_EPAPER
+ -I variants/esp32s3/crowpanel-esp32s3-5-epaper
-D PRIVATE_HW
-DBOARD_HAS_PSRAM
-DGPS_POWER_TOGGLE
@@ -67,7 +71,9 @@ board = esp32-s3-devkitc-1
board_level = extra
upload_protocol = esptool
build_flags =
- ${esp32s3_base.build_flags} -D CROWPANEL_ESP32S3_2_EPAPER -I variants/crowpanel-esp32s3-5-epaper
+ ${esp32s3_base.build_flags}
+ -D CROWPANEL_ESP32S3_2_EPAPER
+ -I variants/esp32s3/crowpanel-esp32s3-5-epaper
-D PRIVATE_HW
-DBOARD_HAS_PSRAM
-DGPS_POWER_TOGGLE
diff --git a/variants/crowpanel-esp32s3-5-epaper/variant.h b/variants/esp32s3/crowpanel-esp32s3-5-epaper/variant.h
similarity index 100%
rename from variants/crowpanel-esp32s3-5-epaper/variant.h
rename to variants/esp32s3/crowpanel-esp32s3-5-epaper/variant.h
diff --git a/variants/my_esp32s3_diy_eink/pins_arduino.h b/variants/esp32s3/diy/my_esp32s3_diy_eink/pins_arduino.h
similarity index 100%
rename from variants/my_esp32s3_diy_eink/pins_arduino.h
rename to variants/esp32s3/diy/my_esp32s3_diy_eink/pins_arduino.h
diff --git a/variants/my_esp32s3_diy_eink/platformio.ini b/variants/esp32s3/diy/my_esp32s3_diy_eink/platformio.ini
similarity index 71%
rename from variants/my_esp32s3_diy_eink/platformio.ini
rename to variants/esp32s3/diy/my_esp32s3_diy_eink/platformio.ini
index 98613e4fb..267544c40 100644
--- a/variants/my_esp32s3_diy_eink/platformio.ini
+++ b/variants/esp32s3/diy/my_esp32s3_diy_eink/platformio.ini
@@ -8,8 +8,6 @@ board_build.f_cpu = 240000000L
upload_protocol = esptool
;upload_port = /dev/ttyACM1
upload_speed = 921600
-platform_packages =
- platformio/tool-esptoolpy@^1.40801.0
lib_deps =
${esp32_base.lib_deps}
zinggjm/GxEPD2@^1.6.2
@@ -18,12 +16,13 @@ build_unflags =
${esp32s3_base.build_unflags}
-DARDUINO_USB_MODE=1
build_flags =
- ;${esp32_base.build_flags} -D MY_ESP32S3_DIY -I variants/my_esp32s3_diy_eink
- ${esp32_base.build_flags} -D PRIVATE_HW -I variants/my_esp32s3_diy_eink
+ ${esp32_base.build_flags}
+ -D PRIVATE_HW
+ -I variants/esp32s3/diy/my_esp32s3_diy_eink
-Dmy
-DEINK_DISPLAY_MODEL=GxEPD2_290_T5D
-DEINK_WIDTH=296
-DEINK_HEIGHT=128
-DBOARD_HAS_PSRAM
-mfix-esp32-psram-cache-issue
- -DARDUINO_USB_MODE=0
\ No newline at end of file
+ -DARDUINO_USB_MODE=0
diff --git a/variants/my_esp32s3_diy_eink/variant.h b/variants/esp32s3/diy/my_esp32s3_diy_eink/variant.h
similarity index 100%
rename from variants/my_esp32s3_diy_eink/variant.h
rename to variants/esp32s3/diy/my_esp32s3_diy_eink/variant.h
diff --git a/variants/my_esp32s3_diy_oled/pins_arduino.h b/variants/esp32s3/diy/my_esp32s3_diy_oled/pins_arduino.h
similarity index 100%
rename from variants/my_esp32s3_diy_oled/pins_arduino.h
rename to variants/esp32s3/diy/my_esp32s3_diy_oled/pins_arduino.h
diff --git a/variants/my_esp32s3_diy_oled/platformio.ini b/variants/esp32s3/diy/my_esp32s3_diy_oled/platformio.ini
similarity index 67%
rename from variants/my_esp32s3_diy_oled/platformio.ini
rename to variants/esp32s3/diy/my_esp32s3_diy_oled/platformio.ini
index 346cc9cac..aa3e6e482 100644
--- a/variants/my_esp32s3_diy_oled/platformio.ini
+++ b/variants/esp32s3/diy/my_esp32s3_diy_oled/platformio.ini
@@ -8,8 +8,6 @@ board_build.f_cpu = 240000000L
upload_protocol = esptool
;upload_port = /dev/ttyACM0
upload_speed = 921600
-platform_packages =
- platformio/tool-esptoolpy@^1.40801.0
lib_deps =
${esp32_base.lib_deps}
adafruit/Adafruit NeoPixel @ ^1.12.0
@@ -17,8 +15,9 @@ build_unflags =
${esp32s3_base.build_unflags}
-DARDUINO_USB_MODE=1
build_flags =
- ;${esp32_base.build_flags} -D MY_ESP32S3_DIY -I variants/my_esp32s3_diy_oled
- ${esp32_base.build_flags} -D PRIVATE_HW -I variants/my_esp32s3_diy_oled
+ ${esp32_base.build_flags}
+ -D PRIVATE_HW
+ -I variants/esp32s3/diy/my_esp32s3_diy_oled
-DBOARD_HAS_PSRAM
-mfix-esp32-psram-cache-issue
- -DARDUINO_USB_MODE=0
\ No newline at end of file
+ -DARDUINO_USB_MODE=0
diff --git a/variants/my_esp32s3_diy_oled/variant.h b/variants/esp32s3/diy/my_esp32s3_diy_oled/variant.h
similarity index 100%
rename from variants/my_esp32s3_diy_oled/variant.h
rename to variants/esp32s3/diy/my_esp32s3_diy_oled/variant.h
diff --git a/variants/esp32s3/diy/t-energy-s3_e22/platformio.ini b/variants/esp32s3/diy/t-energy-s3_e22/platformio.ini
new file mode 100644
index 000000000..681ee6c45
--- /dev/null
+++ b/variants/esp32s3/diy/t-energy-s3_e22/platformio.ini
@@ -0,0 +1,18 @@
+; NanoVHF T-Energy-S3 + E22(0)-xxxM - DIY
+[env:t-energy-s3_e22]
+extends = esp32s3_base
+board = esp32-s3-devkitc-1
+board_build.partitions = default_16MB.csv
+board_level = extra
+board_upload.flash_size = 16MB ;Specify the FLASH capacity as 16MB
+board_build.arduino.memory_type = qio_opi ;Enable internal PSRAM
+build_unflags =
+ ${esp32s3_base.build_unflags}
+ -D ARDUINO_USB_MODE=1
+build_flags =
+ ${esp32s3_base.build_flags}
+ -D EBYTE_ESP32_S3
+ -D BOARD_HAS_PSRAM
+ -D ARDUINO_USB_MODE=0
+ -D ARDUINO_USB_CDC_ON_BOOT=1
+ -I variants/esp32s3/diy/t-energy-s3_e22
diff --git a/variants/diy/t-energy-s3_e22/variant.h b/variants/esp32s3/diy/t-energy-s3_e22/variant.h
similarity index 100%
rename from variants/diy/t-energy-s3_e22/variant.h
rename to variants/esp32s3/diy/t-energy-s3_e22/variant.h
diff --git a/variants/dreamcatcher/platformio.ini b/variants/esp32s3/dreamcatcher/platformio.ini
similarity index 89%
rename from variants/dreamcatcher/platformio.ini
rename to variants/esp32s3/dreamcatcher/platformio.ini
index 6527d89be..d088f2dac 100644
--- a/variants/dreamcatcher/platformio.ini
+++ b/variants/esp32s3/dreamcatcher/platformio.ini
@@ -8,7 +8,7 @@ build_flags =
${esp32s3_base.build_flags}
-D PRIVATE_HW
-D OTHERNET_DC_REV=2301
- -I variants/dreamcatcher
+ -I variants/esp32s3/dreamcatcher
-D ARDUINO_USB_CDC_ON_BOOT=1
lib_deps = ${esp32s3_base.lib_deps}
@@ -25,5 +25,5 @@ build_flags =
${esp32s3_base.build_flags}
-D PRIVATE_HW
-D OTHERNET_DC_REV=2206
- -I variants/dreamcatcher
+ -I variants/esp32s3/dreamcatcher
-D ARDUINO_USB_CDC_ON_BOOT=1
diff --git a/variants/dreamcatcher/rfswitch.h b/variants/esp32s3/dreamcatcher/rfswitch.h
similarity index 100%
rename from variants/dreamcatcher/rfswitch.h
rename to variants/esp32s3/dreamcatcher/rfswitch.h
diff --git a/variants/dreamcatcher/variant.h b/variants/esp32s3/dreamcatcher/variant.h
similarity index 100%
rename from variants/dreamcatcher/variant.h
rename to variants/esp32s3/dreamcatcher/variant.h
diff --git a/variants/elecrow_panel/pins_arduino.h b/variants/esp32s3/elecrow_panel/pins_arduino.h
similarity index 100%
rename from variants/elecrow_panel/pins_arduino.h
rename to variants/esp32s3/elecrow_panel/pins_arduino.h
diff --git a/variants/elecrow_panel/platformio.ini b/variants/esp32s3/elecrow_panel/platformio.ini
similarity index 99%
rename from variants/elecrow_panel/platformio.ini
rename to variants/esp32s3/elecrow_panel/platformio.ini
index de7f28a83..203a4c0d0 100644
--- a/variants/elecrow_panel/platformio.ini
+++ b/variants/esp32s3/elecrow_panel/platformio.ini
@@ -5,7 +5,7 @@ board_check = true
upload_protocol = esptool
board_build.partitions = default_16MB.csv ; must be here for some reason, board.json is not enough !?
build_flags = ${esp32s3_base.build_flags} -Os
- -I variants/elecrow_panel
+ -I variants/esp32s3/elecrow_panel
-D ELECROW_PANEL
-D CONFIG_ARDUHAL_LOG_COLORS
-D RADIOLIB_DEBUG_SPI=0
diff --git a/variants/elecrow_panel/variant.h b/variants/esp32s3/elecrow_panel/variant.h
similarity index 100%
rename from variants/elecrow_panel/variant.h
rename to variants/esp32s3/elecrow_panel/variant.h
diff --git a/variants/esp32-s3-pico/pins_arduino.h b/variants/esp32s3/esp32-s3-pico/pins_arduino.h
similarity index 100%
rename from variants/esp32-s3-pico/pins_arduino.h
rename to variants/esp32s3/esp32-s3-pico/pins_arduino.h
diff --git a/variants/esp32-s3-pico/platformio.ini b/variants/esp32s3/esp32-s3-pico/platformio.ini
similarity index 94%
rename from variants/esp32-s3-pico/platformio.ini
rename to variants/esp32s3/esp32-s3-pico/platformio.ini
index 69969c601..11bd4f5a3 100644
--- a/variants/esp32-s3-pico/platformio.ini
+++ b/variants/esp32s3/esp32-s3-pico/platformio.ini
@@ -15,7 +15,7 @@ board_upload.require_upload_port = yes
build_flags = ${esp32s3_base.build_flags}
-DESP32_S3_PICO
;-DPRIVATE_HW
- -Ivariants/esp32-s3-pico
+ -Ivariants/esp32s3/esp32-s3-pico
-DBOARD_HAS_PSRAM
-DEINK_DISPLAY_MODEL=GxEPD2_290_T94_V2
-DEINK_WIDTH=296
diff --git a/variants/esp32-s3-pico/variant.h b/variants/esp32s3/esp32-s3-pico/variant.h
similarity index 100%
rename from variants/esp32-s3-pico/variant.h
rename to variants/esp32s3/esp32-s3-pico/variant.h
diff --git a/variants/heltec_capsule_sensor_v3/platformio.ini b/variants/esp32s3/heltec_capsule_sensor_v3/platformio.ini
similarity index 82%
rename from variants/heltec_capsule_sensor_v3/platformio.ini
rename to variants/esp32s3/heltec_capsule_sensor_v3/platformio.ini
index 8d1c039c1..d43ffd0df 100644
--- a/variants/heltec_capsule_sensor_v3/platformio.ini
+++ b/variants/esp32s3/heltec_capsule_sensor_v3/platformio.ini
@@ -4,7 +4,7 @@ board = heltec_wifi_lora_32_V3
board_check = true
board_build.partitions = default_8MB.csv
build_flags =
- ${esp32s3_base.build_flags} -I variants/heltec_capsule_sensor_v3
+ ${esp32s3_base.build_flags} -I variants/esp32s3/heltec_capsule_sensor_v3
-D HELTEC_CAPSULE_SENSOR_V3
-D GPS_POWER_TOGGLE ; comment this line to disable triple press function on the user button to turn off gps entirely.
- ;-D DEBUG_DISABLED ; uncomment this line to disable DEBUG output
\ No newline at end of file
+ ;-D DEBUG_DISABLED ; uncomment this line to disable DEBUG output
diff --git a/variants/heltec_capsule_sensor_v3/variant.h b/variants/esp32s3/heltec_capsule_sensor_v3/variant.h
similarity index 100%
rename from variants/heltec_capsule_sensor_v3/variant.h
rename to variants/esp32s3/heltec_capsule_sensor_v3/variant.h
diff --git a/variants/heltec_sensor_hub/platformio.ini b/variants/esp32s3/heltec_sensor_hub/platformio.ini
similarity index 75%
rename from variants/heltec_sensor_hub/platformio.ini
rename to variants/esp32s3/heltec_sensor_hub/platformio.ini
index 53f84fab4..92b90d9b9 100644
--- a/variants/heltec_sensor_hub/platformio.ini
+++ b/variants/esp32s3/heltec_sensor_hub/platformio.ini
@@ -4,7 +4,8 @@ board = heltec_wifi_lora_32_V3
board_check = true
build_flags =
- ${esp32s3_base.build_flags} -I variants/heltec_sensor_hub
+ ${esp32s3_base.build_flags}
+ -I variants/esp32s3/heltec_sensor_hub
-D HELTEC_SENSOR_HUB
lib_deps = ${esp32s3_base.lib_deps}
diff --git a/variants/heltec_sensor_hub/variant.h b/variants/esp32s3/heltec_sensor_hub/variant.h
similarity index 100%
rename from variants/heltec_sensor_hub/variant.h
rename to variants/esp32s3/heltec_sensor_hub/variant.h
diff --git a/variants/heltec_v3/platformio.ini b/variants/esp32s3/heltec_v3/platformio.ini
similarity index 77%
rename from variants/heltec_v3/platformio.ini
rename to variants/esp32s3/heltec_v3/platformio.ini
index 4be96b019..8dda72ceb 100644
--- a/variants/heltec_v3/platformio.ini
+++ b/variants/esp32s3/heltec_v3/platformio.ini
@@ -4,5 +4,7 @@ board = heltec_wifi_lora_32_V3
board_check = true
board_build.partitions = default_8MB.csv
build_flags =
- ${esp32s3_base.build_flags} -D HELTEC_V3 -I variants/heltec_v3
+ ${esp32s3_base.build_flags}
+ -D HELTEC_V3
+ -I variants/esp32s3/heltec_v3
-D GPS_POWER_TOGGLE ; comment this line to disable triple press function on the user button to turn off gps entirely.
diff --git a/variants/heltec_v3/variant.h b/variants/esp32s3/heltec_v3/variant.h
similarity index 100%
rename from variants/heltec_v3/variant.h
rename to variants/esp32s3/heltec_v3/variant.h
diff --git a/variants/heltec_vision_master_e213/einkDetect.h b/variants/esp32s3/heltec_vision_master_e213/einkDetect.h
similarity index 100%
rename from variants/heltec_vision_master_e213/einkDetect.h
rename to variants/esp32s3/heltec_vision_master_e213/einkDetect.h
diff --git a/variants/heltec_vision_master_e213/nicheGraphics.h b/variants/esp32s3/heltec_vision_master_e213/nicheGraphics.h
similarity index 100%
rename from variants/heltec_vision_master_e213/nicheGraphics.h
rename to variants/esp32s3/heltec_vision_master_e213/nicheGraphics.h
diff --git a/variants/heltec_vision_master_e213/pins_arduino.h b/variants/esp32s3/heltec_vision_master_e213/pins_arduino.h
similarity index 100%
rename from variants/heltec_vision_master_e213/pins_arduino.h
rename to variants/esp32s3/heltec_vision_master_e213/pins_arduino.h
diff --git a/variants/heltec_vision_master_e213/platformio.ini b/variants/esp32s3/heltec_vision_master_e213/platformio.ini
similarity index 91%
rename from variants/heltec_vision_master_e213/platformio.ini
rename to variants/esp32s3/heltec_vision_master_e213/platformio.ini
index 028caaeff..2b4eebe64 100644
--- a/variants/heltec_vision_master_e213/platformio.ini
+++ b/variants/esp32s3/heltec_vision_master_e213/platformio.ini
@@ -4,7 +4,7 @@ board = heltec_vision_master_e213
board_build.partitions = default_8MB.csv
build_flags =
${esp32s3_base.build_flags}
- -Ivariants/heltec_vision_master_e213
+ -Ivariants/esp32s3/heltec_vision_master_e213
-DHELTEC_VISION_MASTER_E213
-DUSE_EINK
-DGXEPD2_DRIVER_0=GxEPD2_213_FC1
@@ -31,9 +31,9 @@ build_src_filter =
build_flags =
${esp32s3_base.build_flags}
${inkhud.build_flags}
- -I variants/heltec_vision_master_e213
+ -I variants/esp32s3/heltec_vision_master_e213
-D HELTEC_VISION_MASTER_E213
lib_deps =
${inkhud.lib_deps} ; InkHUD libs first, so we get GFXRoot instead of AdafruitGFX
${esp32s3_base.lib_deps}
-upload_speed = 921600
\ No newline at end of file
+upload_speed = 921600
diff --git a/variants/heltec_vision_master_e213/variant.h b/variants/esp32s3/heltec_vision_master_e213/variant.h
similarity index 100%
rename from variants/heltec_vision_master_e213/variant.h
rename to variants/esp32s3/heltec_vision_master_e213/variant.h
diff --git a/variants/heltec_vision_master_e290/nicheGraphics.h b/variants/esp32s3/heltec_vision_master_e290/nicheGraphics.h
similarity index 100%
rename from variants/heltec_vision_master_e290/nicheGraphics.h
rename to variants/esp32s3/heltec_vision_master_e290/nicheGraphics.h
diff --git a/variants/heltec_vision_master_e290/pins_arduino.h b/variants/esp32s3/heltec_vision_master_e290/pins_arduino.h
similarity index 100%
rename from variants/heltec_vision_master_e290/pins_arduino.h
rename to variants/esp32s3/heltec_vision_master_e290/pins_arduino.h
diff --git a/variants/heltec_vision_master_e290/platformio.ini b/variants/esp32s3/heltec_vision_master_e290/platformio.ini
similarity index 91%
rename from variants/heltec_vision_master_e290/platformio.ini
rename to variants/esp32s3/heltec_vision_master_e290/platformio.ini
index cda3fde00..08056b639 100644
--- a/variants/heltec_vision_master_e290/platformio.ini
+++ b/variants/esp32s3/heltec_vision_master_e290/platformio.ini
@@ -5,7 +5,7 @@ board = heltec_vision_master_e290
board_build.partitions = default_8MB.csv
build_flags =
${esp32s3_base.build_flags}
- -I variants/heltec_vision_master_e290
+ -I variants/esp32s3/heltec_vision_master_e290
-D DISPLAY_FLIP_SCREEN ; Orient so the LoRa antenna faces up
-D HELTEC_VISION_MASTER_E290
-D BUTTON_CLICK_MS=200
@@ -34,9 +34,9 @@ build_src_filter =
build_flags =
${esp32s3_base.build_flags}
${inkhud.build_flags}
- -I variants/heltec_vision_master_e290
+ -I variants/esp32s3/heltec_vision_master_e290
-D HELTEC_VISION_MASTER_E290
lib_deps =
${inkhud.lib_deps} ; InkHUD libs first, so we get GFXRoot instead of AdafruitGFX
${esp32s3_base.lib_deps}
-upload_speed = 921600
\ No newline at end of file
+upload_speed = 921600
diff --git a/variants/heltec_vision_master_e290/variant.h b/variants/esp32s3/heltec_vision_master_e290/variant.h
similarity index 100%
rename from variants/heltec_vision_master_e290/variant.h
rename to variants/esp32s3/heltec_vision_master_e290/variant.h
diff --git a/variants/heltec_vision_master_t190/pins_arduino.h b/variants/esp32s3/heltec_vision_master_t190/pins_arduino.h
similarity index 100%
rename from variants/heltec_vision_master_t190/pins_arduino.h
rename to variants/esp32s3/heltec_vision_master_t190/pins_arduino.h
diff --git a/variants/heltec_vision_master_t190/platformio.ini b/variants/esp32s3/heltec_vision_master_t190/platformio.ini
similarity index 77%
rename from variants/heltec_vision_master_t190/platformio.ini
rename to variants/esp32s3/heltec_vision_master_t190/platformio.ini
index 7f55a1be7..e7e7ff4e4 100644
--- a/variants/heltec_vision_master_t190/platformio.ini
+++ b/variants/esp32s3/heltec_vision_master_t190/platformio.ini
@@ -4,10 +4,10 @@ board = heltec_vision_master_t190
board_build.partitions = default_8MB.csv
build_flags =
${esp32s3_base.build_flags}
- -Ivariants/heltec_vision_master_t190
- -DHELTEC_VISION_MASTER_T190
+ -I variants/esp32s3/heltec_vision_master_t190
+ -D HELTEC_VISION_MASTER_T190
lib_deps =
${esp32s3_base.lib_deps}
lewisxhe/PCF8563_Library@^1.0.1
https://github.com/meshtastic/st7789/archive/bd33ea58ddfe4a5e4a66d53300ccbd38d66ac21f.zip
-upload_speed = 921600
\ No newline at end of file
+upload_speed = 921600
diff --git a/variants/heltec_vision_master_t190/variant.h b/variants/esp32s3/heltec_vision_master_t190/variant.h
similarity index 100%
rename from variants/heltec_vision_master_t190/variant.h
rename to variants/esp32s3/heltec_vision_master_t190/variant.h
diff --git a/variants/heltec_wireless_paper/einkDetect.h b/variants/esp32s3/heltec_wireless_paper/einkDetect.h
similarity index 100%
rename from variants/heltec_wireless_paper/einkDetect.h
rename to variants/esp32s3/heltec_wireless_paper/einkDetect.h
diff --git a/variants/heltec_wireless_paper/nicheGraphics.h b/variants/esp32s3/heltec_wireless_paper/nicheGraphics.h
similarity index 100%
rename from variants/heltec_wireless_paper/nicheGraphics.h
rename to variants/esp32s3/heltec_wireless_paper/nicheGraphics.h
diff --git a/variants/heltec_wireless_paper/pins_arduino.h b/variants/esp32s3/heltec_wireless_paper/pins_arduino.h
similarity index 100%
rename from variants/heltec_wireless_paper/pins_arduino.h
rename to variants/esp32s3/heltec_wireless_paper/pins_arduino.h
diff --git a/variants/heltec_wireless_paper/platformio.ini b/variants/esp32s3/heltec_wireless_paper/platformio.ini
similarity index 92%
rename from variants/heltec_wireless_paper/platformio.ini
rename to variants/esp32s3/heltec_wireless_paper/platformio.ini
index 790646056..f16dcd257 100644
--- a/variants/heltec_wireless_paper/platformio.ini
+++ b/variants/esp32s3/heltec_wireless_paper/platformio.ini
@@ -5,7 +5,7 @@ board = heltec_wifi_lora_32_V3
board_build.partitions = default_8MB.csv
build_flags =
${esp32s3_base.build_flags}
- -I variants/heltec_wireless_paper
+ -I variants/esp32s3/heltec_wireless_paper
-D HELTEC_WIRELESS_PAPER
-D GXEPD2_DRIVER_0=GxEPD2_213_FC1
-D GXEPD2_DRIVER_1=GxEPD2_213_E0213A367
@@ -32,9 +32,9 @@ build_src_filter =
build_flags =
${esp32s3_base.build_flags}
${inkhud.build_flags}
- -I variants/heltec_wireless_paper
+ -I variants/esp32s3/heltec_wireless_paper
-D HELTEC_WIRELESS_PAPER
lib_deps =
${inkhud.lib_deps} ; InkHUD libs first, so we get GFXRoot instead of AdafruitGFX
${esp32s3_base.lib_deps}
-upload_speed = 921600
\ No newline at end of file
+upload_speed = 921600
diff --git a/variants/heltec_wireless_paper/variant.h b/variants/esp32s3/heltec_wireless_paper/variant.h
similarity index 100%
rename from variants/heltec_wireless_paper/variant.h
rename to variants/esp32s3/heltec_wireless_paper/variant.h
diff --git a/variants/heltec_wireless_paper_v1/pins_arduino.h b/variants/esp32s3/heltec_wireless_paper_v1/pins_arduino.h
similarity index 100%
rename from variants/heltec_wireless_paper_v1/pins_arduino.h
rename to variants/esp32s3/heltec_wireless_paper_v1/pins_arduino.h
diff --git a/variants/heltec_wireless_paper_v1/platformio.ini b/variants/esp32s3/heltec_wireless_paper_v1/platformio.ini
similarity index 91%
rename from variants/heltec_wireless_paper_v1/platformio.ini
rename to variants/esp32s3/heltec_wireless_paper_v1/platformio.ini
index 44b0606af..99f2eddeb 100644
--- a/variants/heltec_wireless_paper_v1/platformio.ini
+++ b/variants/esp32s3/heltec_wireless_paper_v1/platformio.ini
@@ -5,7 +5,7 @@ board = heltec_wifi_lora_32_V3
board_build.partitions = default_8MB.csv
build_flags =
${esp32s3_base.build_flags}
- -I variants/heltec_wireless_paper_v1
+ -I variants/esp32s3/heltec_wireless_paper_v1
-D HELTEC_WIRELESS_PAPER_V1_0
-D EINK_DISPLAY_MODEL=GxEPD2_213_BN
-D EINK_WIDTH=250
@@ -17,4 +17,4 @@ lib_deps =
${esp32s3_base.lib_deps}
https://github.com/meshtastic/GxEPD2/archive/55f618961db45a23eff0233546430f1e5a80f63a.zip
lewisxhe/PCF8563_Library@^1.0.1
-upload_speed = 115200
\ No newline at end of file
+upload_speed = 115200
diff --git a/variants/heltec_wireless_paper_v1/variant.h b/variants/esp32s3/heltec_wireless_paper_v1/variant.h
similarity index 100%
rename from variants/heltec_wireless_paper_v1/variant.h
rename to variants/esp32s3/heltec_wireless_paper_v1/variant.h
diff --git a/variants/heltec_wireless_tracker/pins_arduino.h b/variants/esp32s3/heltec_wireless_tracker/pins_arduino.h
similarity index 100%
rename from variants/heltec_wireless_tracker/pins_arduino.h
rename to variants/esp32s3/heltec_wireless_tracker/pins_arduino.h
diff --git a/variants/heltec_wireless_tracker/platformio.ini b/variants/esp32s3/heltec_wireless_tracker/platformio.ini
similarity index 85%
rename from variants/heltec_wireless_tracker/platformio.ini
rename to variants/esp32s3/heltec_wireless_tracker/platformio.ini
index 5c19c37e6..2faba45a8 100644
--- a/variants/heltec_wireless_tracker/platformio.ini
+++ b/variants/esp32s3/heltec_wireless_tracker/platformio.ini
@@ -5,7 +5,8 @@ board_build.partitions = default_8MB.csv
upload_protocol = esptool
build_flags =
- ${esp32s3_base.build_flags} -I variants/heltec_wireless_tracker
+ ${esp32s3_base.build_flags}
+ -I variants/esp32s3/heltec_wireless_tracker
-D HELTEC_TRACKER_V1_1
-D GPS_POWER_TOGGLE ; comment this line to disable triple press function on the user button to turn off gps entirely.
;-D DEBUG_DISABLED ; uncomment this line to disable DEBUG output
diff --git a/variants/heltec_wireless_tracker/variant.h b/variants/esp32s3/heltec_wireless_tracker/variant.h
similarity index 100%
rename from variants/heltec_wireless_tracker/variant.h
rename to variants/esp32s3/heltec_wireless_tracker/variant.h
diff --git a/variants/heltec_wireless_tracker_V1_0/pins_arduino.h b/variants/esp32s3/heltec_wireless_tracker_V1_0/pins_arduino.h
similarity index 100%
rename from variants/heltec_wireless_tracker_V1_0/pins_arduino.h
rename to variants/esp32s3/heltec_wireless_tracker_V1_0/pins_arduino.h
diff --git a/variants/heltec_wireless_tracker_V1_0/platformio.ini b/variants/esp32s3/heltec_wireless_tracker_V1_0/platformio.ini
similarity index 85%
rename from variants/heltec_wireless_tracker_V1_0/platformio.ini
rename to variants/esp32s3/heltec_wireless_tracker_V1_0/platformio.ini
index 08b0ae95c..89fe4b385 100644
--- a/variants/heltec_wireless_tracker_V1_0/platformio.ini
+++ b/variants/esp32s3/heltec_wireless_tracker_V1_0/platformio.ini
@@ -5,7 +5,8 @@ board = heltec_wireless_tracker
board_build.partitions = default_8MB.csv
upload_protocol = esptool
build_flags =
- ${esp32s3_base.build_flags} -I variants/heltec_wireless_tracker_V1_0
+ ${esp32s3_base.build_flags}
+ -I variants/esp32s3/heltec_wireless_tracker_V1_0
-D HELTEC_TRACKER_V1_0
-D GPS_POWER_TOGGLE ; comment this line to disable triple press function on the user button to turn off gps entirely.
;-D DEBUG_DISABLED ; uncomment this line to disable DEBUG output
diff --git a/variants/heltec_wireless_tracker_V1_0/variant.h b/variants/esp32s3/heltec_wireless_tracker_V1_0/variant.h
similarity index 100%
rename from variants/heltec_wireless_tracker_V1_0/variant.h
rename to variants/esp32s3/heltec_wireless_tracker_V1_0/variant.h
diff --git a/variants/heltec_wsl_v3/platformio.ini b/variants/esp32s3/heltec_wsl_v3/platformio.ini
similarity index 78%
rename from variants/heltec_wsl_v3/platformio.ini
rename to variants/esp32s3/heltec_wsl_v3/platformio.ini
index bc3e6ada1..06cde2304 100644
--- a/variants/heltec_wsl_v3/platformio.ini
+++ b/variants/esp32s3/heltec_wsl_v3/platformio.ini
@@ -4,5 +4,7 @@ board = heltec_wifi_lora_32_V3
board_build.partitions = default_8MB.csv
# Temporary until espressif creates a release with this new target
build_flags =
- ${esp32s3_base.build_flags} -D HELTEC_WSL_V3 -I variants/heltec_wsl_v3
+ ${esp32s3_base.build_flags}
+ -D HELTEC_WSL_V3
+ -I variants/esp32s3/heltec_wsl_v3
-D GPS_POWER_TOGGLE ; comment this line to disable triple press function on the user button to turn off gps entirely.
diff --git a/variants/heltec_wsl_v3/variant.h b/variants/esp32s3/heltec_wsl_v3/variant.h
similarity index 100%
rename from variants/heltec_wsl_v3/variant.h
rename to variants/esp32s3/heltec_wsl_v3/variant.h
diff --git a/variants/icarus/pins_arduino.h b/variants/esp32s3/icarus/pins_arduino.h
similarity index 100%
rename from variants/icarus/pins_arduino.h
rename to variants/esp32s3/icarus/pins_arduino.h
diff --git a/variants/icarus/platformio.ini b/variants/esp32s3/icarus/platformio.ini
similarity index 84%
rename from variants/icarus/platformio.ini
rename to variants/esp32s3/icarus/platformio.ini
index b4ea125cf..de450da93 100644
--- a/variants/icarus/platformio.ini
+++ b/variants/esp32s3/icarus/platformio.ini
@@ -14,6 +14,8 @@ build_unflags =
${esp32s3_base.build_unflags}
-DARDUINO_USB_MODE=1
build_flags =
- ${esp32s3_base.build_flags} -D PRIVATE_HW -I variants/icarus
- -DBOARD_HAS_PSRAM
+ ${esp32s3_base.build_flags}
+ -D PRIVATE_HW
+ -I variants/esp32s3/icarus
+ -DBOARD_HAS_PSRAM
-DARDUINO_USB_MODE=0
diff --git a/variants/icarus/variant.h b/variants/esp32s3/icarus/variant.h
similarity index 100%
rename from variants/icarus/variant.h
rename to variants/esp32s3/icarus/variant.h
diff --git a/variants/link32_s3_v1/pins_arduino.h b/variants/esp32s3/link32_s3_v1/pins_arduino.h
similarity index 100%
rename from variants/link32_s3_v1/pins_arduino.h
rename to variants/esp32s3/link32_s3_v1/pins_arduino.h
diff --git a/variants/link32_s3_v1/platformio.ini b/variants/esp32s3/link32_s3_v1/platformio.ini
similarity index 81%
rename from variants/link32_s3_v1/platformio.ini
rename to variants/esp32s3/link32_s3_v1/platformio.ini
index 5a614a7af..c1b71b3b5 100644
--- a/variants/link32_s3_v1/platformio.ini
+++ b/variants/esp32s3/link32_s3_v1/platformio.ini
@@ -2,7 +2,9 @@
extends = esp32s3_base
board = esp32-s3-devkitc-1
build_flags =
- ${esp32_base.build_flags} -D LINK_32 -I variants/link32_s3_v1
+ ${esp32_base.build_flags}
+ -D LINK_32
+ -I variants/esp32s3/link32_s3_v1
-DGPS_POWER_TOGGLE ; comment this line to disable triple press function on the user button to turn off gps entirely.
-DARDUINO_USB_CDC_ON_BOOT
-DARDUINO_USB_MODE=1
diff --git a/variants/link32_s3_v1/variant.h b/variants/esp32s3/link32_s3_v1/variant.h
similarity index 100%
rename from variants/link32_s3_v1/variant.h
rename to variants/esp32s3/link32_s3_v1/variant.h
diff --git a/variants/m5stack_cores3/pins_arduino.h b/variants/esp32s3/m5stack_cores3/pins_arduino.h
similarity index 100%
rename from variants/m5stack_cores3/pins_arduino.h
rename to variants/esp32s3/m5stack_cores3/pins_arduino.h
diff --git a/variants/m5stack_cores3/platformio.ini b/variants/esp32s3/m5stack_cores3/platformio.ini
similarity index 53%
rename from variants/m5stack_cores3/platformio.ini
rename to variants/esp32s3/m5stack_cores3/platformio.ini
index 2253e75e2..9973abfce 100644
--- a/variants/m5stack_cores3/platformio.ini
+++ b/variants/esp32s3/m5stack_cores3/platformio.ini
@@ -5,11 +5,9 @@ board = m5stack-cores3
board_check = true
board_build.partitions = default_16MB.csv
upload_protocol = esptool
-
-build_flags = ${esp32_base.build_flags}
- -DPRIVATE_HW
- -DM5STACK_CORES3
- -Ivariants/m5stack_cores3
-
-lib_deps =
- ${esp32_base.lib_deps}
+build_flags =
+ ${esp32_base.build_flags}
+ -D PRIVATE_HW
+ -D M5STACK_CORES3
+ -I variants/esp32s3/m5stack_cores3
+lib_deps = ${esp32_base.lib_deps}
diff --git a/variants/m5stack_cores3/variant.h b/variants/esp32s3/m5stack_cores3/variant.h
similarity index 100%
rename from variants/m5stack_cores3/variant.h
rename to variants/esp32s3/m5stack_cores3/variant.h
diff --git a/variants/nibble_esp32/platformio.ini b/variants/esp32s3/nibble_esp32/platformio.ini
similarity index 55%
rename from variants/nibble_esp32/platformio.ini
rename to variants/esp32s3/nibble_esp32/platformio.ini
index 24d2ee2a5..2f6960d2e 100644
--- a/variants/nibble_esp32/platformio.ini
+++ b/variants/esp32s3/nibble_esp32/platformio.ini
@@ -3,4 +3,6 @@ extends = esp32s3_base
board = esp32-s3-zero
board_level = extra
build_flags =
- ${esp32_base.build_flags} -D PRIVATE_HW -I variants/nibble_esp32
\ No newline at end of file
+ ${esp32_base.build_flags}
+ -D PRIVATE_HW
+ -I variants/esp32s3/nibble_esp32
diff --git a/variants/nibble_esp32/variant.h b/variants/esp32s3/nibble_esp32/variant.h
similarity index 100%
rename from variants/nibble_esp32/variant.h
rename to variants/esp32s3/nibble_esp32/variant.h
diff --git a/variants/nugget_s3_lora/platformio.ini b/variants/esp32s3/nugget_s3_lora/platformio.ini
similarity index 78%
rename from variants/nugget_s3_lora/platformio.ini
rename to variants/esp32s3/nugget_s3_lora/platformio.ini
index 1085d633b..a0076a18b 100644
--- a/variants/nugget_s3_lora/platformio.ini
+++ b/variants/esp32s3/nugget_s3_lora/platformio.ini
@@ -3,4 +3,4 @@ extends = esp32s3_base
board = lolin_s3_mini
board_level = extra
build_flags =
- ${esp32s3_base.build_flags} -D ARDUINO_USB_CDC_ON_BOOT=1 -D PRIVATE_HW -I variants/nugget_s3_lora
+ ${esp32s3_base.build_flags} -D ARDUINO_USB_CDC_ON_BOOT=1 -D PRIVATE_HW -I variants/esp32s3/nugget_s3_lora
diff --git a/variants/nugget_s3_lora/variant.h b/variants/esp32s3/nugget_s3_lora/variant.h
similarity index 100%
rename from variants/nugget_s3_lora/variant.h
rename to variants/esp32s3/nugget_s3_lora/variant.h
diff --git a/variants/picomputer-s3/pins_arduino.h b/variants/esp32s3/picomputer-s3/pins_arduino.h
similarity index 100%
rename from variants/picomputer-s3/pins_arduino.h
rename to variants/esp32s3/picomputer-s3/pins_arduino.h
diff --git a/variants/picomputer-s3/platformio.ini b/variants/esp32s3/picomputer-s3/platformio.ini
similarity index 97%
rename from variants/picomputer-s3/platformio.ini
rename to variants/esp32s3/picomputer-s3/platformio.ini
index cb5e829b4..d5847959b 100644
--- a/variants/picomputer-s3/platformio.ini
+++ b/variants/esp32s3/picomputer-s3/platformio.ini
@@ -11,7 +11,7 @@ upload_protocol = esptool
build_flags =
${esp32s3_base.build_flags}
-DPICOMPUTER_S3
- -I variants/picomputer-s3
+ -I variants/esp32s3/picomputer-s3
lib_deps =
${esp32s3_base.lib_deps}
diff --git a/variants/picomputer-s3/variant.h b/variants/esp32s3/picomputer-s3/variant.h
similarity index 100%
rename from variants/picomputer-s3/variant.h
rename to variants/esp32s3/picomputer-s3/variant.h
diff --git a/variants/rak3312/pins_arduino.h b/variants/esp32s3/rak3312/pins_arduino.h
similarity index 100%
rename from variants/rak3312/pins_arduino.h
rename to variants/esp32s3/rak3312/pins_arduino.h
diff --git a/variants/rak3312/platformio.ini b/variants/esp32s3/rak3312/platformio.ini
similarity index 63%
rename from variants/rak3312/platformio.ini
rename to variants/esp32s3/rak3312/platformio.ini
index d2877b3f7..50b0c5020 100644
--- a/variants/rak3312/platformio.ini
+++ b/variants/esp32s3/rak3312/platformio.ini
@@ -5,4 +5,6 @@ board_check = true
upload_protocol = esptool
build_flags =
- ${esp32_base.build_flags} -D RAK3312 -I variants/rak3312
+ ${esp32_base.build_flags}
+ -D RAK3312
+ -I variants/esp32s3/rak3312
diff --git a/variants/rak3312/variant.h b/variants/esp32s3/rak3312/variant.h
similarity index 100%
rename from variants/rak3312/variant.h
rename to variants/esp32s3/rak3312/variant.h
diff --git a/variants/seeed-sensecap-indicator/pins_arduino.h b/variants/esp32s3/seeed-sensecap-indicator/pins_arduino.h
similarity index 100%
rename from variants/seeed-sensecap-indicator/pins_arduino.h
rename to variants/esp32s3/seeed-sensecap-indicator/pins_arduino.h
diff --git a/variants/seeed-sensecap-indicator/platformio.ini b/variants/esp32s3/seeed-sensecap-indicator/platformio.ini
similarity index 97%
rename from variants/seeed-sensecap-indicator/platformio.ini
rename to variants/esp32s3/seeed-sensecap-indicator/platformio.ini
index 63f814b57..1d55b31ca 100644
--- a/variants/seeed-sensecap-indicator/platformio.ini
+++ b/variants/esp32s3/seeed-sensecap-indicator/platformio.ini
@@ -10,7 +10,7 @@ board_build.partitions = default_8MB.csv
upload_protocol = esptool
build_flags = ${esp32_base.build_flags}
- -Ivariants/seeed-sensecap-indicator
+ -Ivariants/esp32s3/seeed-sensecap-indicator
-DSENSECAP_INDICATOR
-DCONFIG_ARDUHAL_LOG_COLORS
-DRADIOLIB_DEBUG_SPI=0
diff --git a/variants/seeed-sensecap-indicator/variant.h b/variants/esp32s3/seeed-sensecap-indicator/variant.h
similarity index 100%
rename from variants/seeed-sensecap-indicator/variant.h
rename to variants/esp32s3/seeed-sensecap-indicator/variant.h
diff --git a/variants/seeed_xiao_s3/pins_arduino.h b/variants/esp32s3/seeed_xiao_s3/pins_arduino.h
similarity index 100%
rename from variants/seeed_xiao_s3/pins_arduino.h
rename to variants/esp32s3/seeed_xiao_s3/pins_arduino.h
diff --git a/variants/seeed_xiao_s3/platformio.ini b/variants/esp32s3/seeed_xiao_s3/platformio.ini
similarity index 74%
rename from variants/seeed_xiao_s3/platformio.ini
rename to variants/esp32s3/seeed_xiao_s3/platformio.ini
index 9d935e2e0..ad09efabd 100644
--- a/variants/seeed_xiao_s3/platformio.ini
+++ b/variants/esp32s3/seeed_xiao_s3/platformio.ini
@@ -11,7 +11,8 @@ build_unflags =
${esp32s3_base.build_unflags}
-DARDUINO_USB_MODE=1
build_flags =
- ${esp32s3_base.build_flags} -DSEEED_XIAO_S3 -I variants/seeed_xiao_s3
+ ${esp32s3_base.build_flags}
+ -D SEEED_XIAO_S3
+ -I variants/esp32s3/seeed_xiao_s3
-DBOARD_HAS_PSRAM
-
- -DARDUINO_USB_MODE=0
\ No newline at end of file
+ -DARDUINO_USB_MODE=0
diff --git a/variants/seeed_xiao_s3/variant.h b/variants/esp32s3/seeed_xiao_s3/variant.h
similarity index 100%
rename from variants/seeed_xiao_s3/variant.h
rename to variants/esp32s3/seeed_xiao_s3/variant.h
diff --git a/variants/station-g2/pins_arduino.h b/variants/esp32s3/station-g2/pins_arduino.h
similarity index 100%
rename from variants/station-g2/pins_arduino.h
rename to variants/esp32s3/station-g2/pins_arduino.h
diff --git a/variants/station-g2/platformio.ini b/variants/esp32s3/station-g2/platformio.ini
similarity index 83%
rename from variants/station-g2/platformio.ini
rename to variants/esp32s3/station-g2/platformio.ini
index 4ddd28f1c..0aed5e7ce 100755
--- a/variants/station-g2/platformio.ini
+++ b/variants/esp32s3/station-g2/platformio.ini
@@ -13,7 +13,9 @@ build_unflags =
${esp32s3_base.build_unflags}
-DARDUINO_USB_MODE=1
build_flags =
- ${esp32s3_base.build_flags} -D STATION_G2 -I variants/station-g2
+ ${esp32s3_base.build_flags}
+ -D STATION_G2
+ -I variants/esp32s3/station-g2
-DBOARD_HAS_PSRAM
-DSTATION_G2
-DARDUINO_USB_MODE=0
diff --git a/variants/station-g2/variant.h b/variants/esp32s3/station-g2/variant.h
similarity index 100%
rename from variants/station-g2/variant.h
rename to variants/esp32s3/station-g2/variant.h
diff --git a/variants/esp32s3/t-deck-pro/pins_arduino.h b/variants/esp32s3/t-deck-pro/pins_arduino.h
new file mode 100644
index 000000000..af0ba80b3
--- /dev/null
+++ b/variants/esp32s3/t-deck-pro/pins_arduino.h
@@ -0,0 +1,19 @@
+#ifndef Pins_Arduino_h
+#define Pins_Arduino_h
+
+#include
+
+#define USB_VID 0x303a
+#define USB_PID 0x1001
+
+// used for keyboard, touch controller, beam sensor, and gyroscope
+static const uint8_t SDA = 13;
+static const uint8_t SCL = 14;
+
+// Default SPI will be mapped to Radio
+static const uint8_t SS = 3;
+static const uint8_t MOSI = 33;
+static const uint8_t MISO = 47;
+static const uint8_t SCK = 36;
+
+#endif /* Pins_Arduino_h */
diff --git a/variants/esp32s3/t-deck-pro/platformio.ini b/variants/esp32s3/t-deck-pro/platformio.ini
new file mode 100644
index 000000000..45c3ae4ea
--- /dev/null
+++ b/variants/esp32s3/t-deck-pro/platformio.ini
@@ -0,0 +1,24 @@
+[env:t-deck-pro]
+extends = esp32s3_base
+board = t-deck-pro
+board_check = true
+upload_protocol = esptool
+
+build_flags =
+ ${esp32_base.build_flags} -I variants/esp32s3/t-deck-pro
+ -D T_DECK_PRO
+ -D GPS_POWER_TOGGLE
+ -D USE_EINK
+ -D EINK_DISPLAY_MODEL=GxEPD2_310_GDEQ031T10
+ -D EINK_WIDTH=240
+ -D EINK_HEIGHT=320
+ ;-D USE_EINK_DYNAMICDISPLAY ; Enable Dynamic EInk
+ -D EINK_LIMIT_FASTREFRESH=10 ; How many consecutive fast-refreshes are permitted
+ -D EINK_LIMIT_GHOSTING_PX=2000 ; (Optional) How much image ghosting is tolerated
+
+lib_deps =
+ ${esp32s3_base.lib_deps}
+ https://github.com/ZinggJM/GxEPD2/archive/refs/tags/1.6.4.zip
+ https://github.com/CIRCUITSTATE/CSE_Touch/archive/b44f23b6f870b848f1fbe453c190879bc6cfaafa.zip
+ https://github.com/CIRCUITSTATE/CSE_CST328/archive/refs/tags/v0.0.4.zip
+ https://github.com/mverch67/BQ27220/archive/07d92be846abd8a0258a50c23198dac0858b22ed.zip
diff --git a/variants/esp32s3/t-deck-pro/variant.h b/variants/esp32s3/t-deck-pro/variant.h
new file mode 100644
index 000000000..b08d3f65f
--- /dev/null
+++ b/variants/esp32s3/t-deck-pro/variant.h
@@ -0,0 +1,94 @@
+// Display (E-Ink)
+#define PIN_EINK_CS 34
+#define PIN_EINK_BUSY 37
+#define PIN_EINK_DC 35
+#define PIN_EINK_RES -1
+#define PIN_EINK_SCLK 36
+#define PIN_EINK_MOSI 47
+
+#define I2C_SDA SDA
+#define I2C_SCL SCL
+
+// CST328 touch screen (implementation in src/platform/extra_variants/t_deck_pro/variant.cpp)
+#define HAS_TOUCHSCREEN 1
+#define CST328_PIN_INT 12
+#define CST328_PIN_RST 45
+
+#define USE_POWERSAVE
+#define SLEEP_TIME 120
+
+// GNNS
+#define HAS_GPS 1
+#define GPS_BAUDRATE 38400
+#define PIN_GPS_EN 15
+#define GPS_EN_ACTIVE 1
+#define GPS_RX_PIN 44
+#define GPS_TX_PIN 43
+#define PIN_GPS_PPS 1
+
+#define BUTTON_PIN 0
+
+// vibration motor
+#define PIN_VIBRATION 2
+
+// Have SPI interface SD card slot
+#define HAS_SDCARD
+#define SDCARD_USE_SPI1
+#define SPI_MOSI (33)
+#define SPI_SCK (36)
+#define SPI_MISO (47)
+#define SPI_CS (48)
+#define SDCARD_CS SPI_CS
+#define SD_SPI_FREQUENCY 75000000U
+
+// TCA8418 keyboard
+#define KB_BL_PIN 42
+#define CANNED_MESSAGE_MODULE_ENABLE 1
+
+// microphone PCM5102A
+#define PCM5102A_SCK 47
+#define PCM5102A_DIN 17
+#define PCM5102A_LRCK 18
+
+// LTR_553ALS light sensor
+#define HAS_LTR553ALS
+
+// gyroscope BHI260AP
+#define BOARD_1V8_EN 38
+#define HAS_BHI260AP
+
+// battery charger BQ25896
+#define HAS_PPM 1
+#define XPOWERS_CHIP_BQ25896
+
+// battery quality management BQ27220
+#define HAS_BQ27220 1
+#define BQ27220_I2C_SDA SDA
+#define BQ27220_I2C_SCL SCL
+#define BQ27220_DESIGN_CAPACITY 1400
+
+// LoRa
+#define USE_SX1262
+#define USE_SX1268
+
+#define LORA_EN 46 // LoRa enable pin
+#define LORA_SCK 36
+#define LORA_MISO 47
+#define LORA_MOSI 33
+#define LORA_CS 3
+
+#define LORA_DIO0 -1 // a No connect on the SX1262 module
+#define LORA_RESET 4
+#define LORA_DIO1 5 // SX1262 IRQ
+#define LORA_DIO2 6 // SX1262 BUSY
+#define LORA_DIO3 // Not connected on PCB, but internally on the TTGO SX1262, if DIO3 is high the TXCO is enabled
+
+#define SX126X_CS LORA_CS // FIXME - we really should define LORA_CS instead
+#define SX126X_DIO1 LORA_DIO1
+#define SX126X_BUSY LORA_DIO2
+#define SX126X_RESET LORA_RESET
+// Not really an E22 but TTGO seems to be trying to clone that
+#define SX126X_DIO2_AS_RF_SWITCH
+#define SX126X_DIO3_TCXO_VOLTAGE 2.4
+// Internally the TTGO module hooks the SX1262-DIO2 in to control the TX/RX switch (which is the default for the sx1262interface
+// code)
diff --git a/variants/t-deck/pins_arduino.h b/variants/esp32s3/t-deck/pins_arduino.h
similarity index 100%
rename from variants/t-deck/pins_arduino.h
rename to variants/esp32s3/t-deck/pins_arduino.h
diff --git a/variants/t-deck/platformio.ini b/variants/esp32s3/t-deck/platformio.ini
similarity index 95%
rename from variants/t-deck/platformio.ini
rename to variants/esp32s3/t-deck/platformio.ini
index c9bd64bc3..9d55ee365 100644
--- a/variants/t-deck/platformio.ini
+++ b/variants/esp32s3/t-deck/platformio.ini
@@ -7,17 +7,16 @@ board_build.partitions = default_16MB.csv
upload_protocol = esptool
build_flags = ${esp32s3_base.build_flags}
- -DT_DECK
- -DBOARD_HAS_PSRAM
- -DGPS_POWER_TOGGLE
- -Ivariants/t-deck
+ -D T_DECK
+ -D BOARD_HAS_PSRAM
+ -D GPS_POWER_TOGGLE
+ -I variants/esp32s3/t-deck
lib_deps = ${esp32s3_base.lib_deps}
lovyan03/LovyanGFX@^1.2.0
earlephilhower/ESP8266Audio@^1.9.9
earlephilhower/ESP8266SAM@^1.0.1
-
[env:t-deck-tft]
extends = env:t-deck
diff --git a/variants/t-deck/variant.h b/variants/esp32s3/t-deck/variant.h
similarity index 100%
rename from variants/t-deck/variant.h
rename to variants/esp32s3/t-deck/variant.h
diff --git a/variants/t-eth-elite/pins_arduino.h b/variants/esp32s3/t-eth-elite/pins_arduino.h
similarity index 100%
rename from variants/t-eth-elite/pins_arduino.h
rename to variants/esp32s3/t-eth-elite/pins_arduino.h
diff --git a/variants/t-eth-elite/platformio.ini b/variants/esp32s3/t-eth-elite/platformio.ini
similarity index 87%
rename from variants/t-eth-elite/platformio.ini
rename to variants/esp32s3/t-eth-elite/platformio.ini
index d6f415f3d..889270ceb 100644
--- a/variants/t-eth-elite/platformio.ini
+++ b/variants/esp32s3/t-eth-elite/platformio.ini
@@ -6,7 +6,8 @@ board_build.partitions = default_16MB.csv
build_flags =
${esp32s3_base.build_flags}
-D T_ETH_ELITE
- -I variants/t-eth-elite
+ -D HAS_UDP_MULTICAST=1
+ -I variants/esp32s3/t-eth-elite
-D GPS_POWER_TOGGLE ; comment this line to disable triple press function on the user button to turn off gps entirely.
lib_ignore =
diff --git a/variants/t-eth-elite/rfswitch.h b/variants/esp32s3/t-eth-elite/rfswitch.h
similarity index 100%
rename from variants/t-eth-elite/rfswitch.h
rename to variants/esp32s3/t-eth-elite/rfswitch.h
diff --git a/variants/t-eth-elite/variant.h b/variants/esp32s3/t-eth-elite/variant.h
similarity index 100%
rename from variants/t-eth-elite/variant.h
rename to variants/esp32s3/t-eth-elite/variant.h
diff --git a/variants/t-watch-s3/pins_arduino.h b/variants/esp32s3/t-watch-s3/pins_arduino.h
similarity index 100%
rename from variants/t-watch-s3/pins_arduino.h
rename to variants/esp32s3/t-watch-s3/pins_arduino.h
diff --git a/variants/t-watch-s3/platformio.ini b/variants/esp32s3/t-watch-s3/platformio.ini
similarity index 93%
rename from variants/t-watch-s3/platformio.ini
rename to variants/esp32s3/t-watch-s3/platformio.ini
index f98237943..59ff8891d 100644
--- a/variants/t-watch-s3/platformio.ini
+++ b/variants/esp32s3/t-watch-s3/platformio.ini
@@ -8,7 +8,7 @@ upload_protocol = esptool
build_flags = ${esp32_base.build_flags}
-DT_WATCH_S3
- -Ivariants/t-watch-s3
+ -Ivariants/esp32s3/t-watch-s3
-DPCF8563_RTC=0x51
-DHAS_BMA423=1
diff --git a/variants/t-watch-s3/variant.h b/variants/esp32s3/t-watch-s3/variant.h
similarity index 100%
rename from variants/t-watch-s3/variant.h
rename to variants/esp32s3/t-watch-s3/variant.h
diff --git a/variants/tbeam-s3-core/pins_arduino.h b/variants/esp32s3/tbeam-s3-core/pins_arduino.h
similarity index 100%
rename from variants/tbeam-s3-core/pins_arduino.h
rename to variants/esp32s3/tbeam-s3-core/pins_arduino.h
diff --git a/variants/tbeam-s3-core/platformio.ini b/variants/esp32s3/tbeam-s3-core/platformio.ini
similarity index 71%
rename from variants/tbeam-s3-core/platformio.ini
rename to variants/esp32s3/tbeam-s3-core/platformio.ini
index a7bdf963f..fba8e4003 100644
--- a/variants/tbeam-s3-core/platformio.ini
+++ b/variants/esp32s3/tbeam-s3-core/platformio.ini
@@ -11,5 +11,5 @@ lib_deps =
build_flags =
${esp32s3_base.build_flags}
- -Ivariants/tbeam-s3-core
- -DPCF8563_RTC=0x51 ;Putting definitions in variant.h does not compile correctly
+ -I variants/esp32s3/tbeam-s3-core
+ -D PCF8563_RTC=0x51 ;Putting definitions in variant.h does not compile correctly
diff --git a/variants/tbeam-s3-core/variant.h b/variants/esp32s3/tbeam-s3-core/variant.h
similarity index 100%
rename from variants/tbeam-s3-core/variant.h
rename to variants/esp32s3/tbeam-s3-core/variant.h
diff --git a/variants/tlora_t3s3_epaper/nicheGraphics.h b/variants/esp32s3/tlora_t3s3_epaper/nicheGraphics.h
similarity index 100%
rename from variants/tlora_t3s3_epaper/nicheGraphics.h
rename to variants/esp32s3/tlora_t3s3_epaper/nicheGraphics.h
diff --git a/variants/tlora_t3s3_epaper/pins_arduino.h b/variants/esp32s3/tlora_t3s3_epaper/pins_arduino.h
similarity index 100%
rename from variants/tlora_t3s3_epaper/pins_arduino.h
rename to variants/esp32s3/tlora_t3s3_epaper/pins_arduino.h
diff --git a/variants/tlora_t3s3_epaper/platformio.ini b/variants/esp32s3/tlora_t3s3_epaper/platformio.ini
similarity index 85%
rename from variants/tlora_t3s3_epaper/platformio.ini
rename to variants/esp32s3/tlora_t3s3_epaper/platformio.ini
index 0750b5bbb..71644ee77 100644
--- a/variants/tlora_t3s3_epaper/platformio.ini
+++ b/variants/esp32s3/tlora_t3s3_epaper/platformio.ini
@@ -5,7 +5,9 @@ board_check = true
upload_protocol = esptool
build_flags =
- ${esp32_base.build_flags} -D TLORA_T3S3_EPAPER -I variants/tlora_t3s3_epaper
+ ${esp32_base.build_flags}
+ -D TLORA_T3S3_EPAPER
+ -I variants/esp32s3/tlora_t3s3_epaper
-DGPS_POWER_TOGGLE
-DUSE_EINK
-DEINK_DISPLAY_MODEL=GxEPD2_213_BN
@@ -29,8 +31,8 @@ build_src_filter =
build_flags =
${esp32s3_base.build_flags}
${inkhud.build_flags}
- -I variants/tlora_t3s3_epaper
+ -I variants/esp32s3/tlora_t3s3_epaper
-D TLORA_T3S3_EPAPER
lib_deps =
${inkhud.lib_deps} ; InkHUD libs first, so we get GFXRoot instead of AdafruitGFX
- ${esp32s3_base.lib_deps}
\ No newline at end of file
+ ${esp32s3_base.lib_deps}
diff --git a/variants/tlora_t3s3_epaper/variant.h b/variants/esp32s3/tlora_t3s3_epaper/variant.h
similarity index 100%
rename from variants/tlora_t3s3_epaper/variant.h
rename to variants/esp32s3/tlora_t3s3_epaper/variant.h
diff --git a/variants/tlora_t3s3_v1/pins_arduino.h b/variants/esp32s3/tlora_t3s3_v1/pins_arduino.h
similarity index 100%
rename from variants/tlora_t3s3_v1/pins_arduino.h
rename to variants/esp32s3/tlora_t3s3_v1/pins_arduino.h
diff --git a/variants/tlora_t3s3_v1/platformio.ini b/variants/esp32s3/tlora_t3s3_v1/platformio.ini
similarity index 58%
rename from variants/tlora_t3s3_v1/platformio.ini
rename to variants/esp32s3/tlora_t3s3_v1/platformio.ini
index 0a5797280..d9624f043 100644
--- a/variants/tlora_t3s3_v1/platformio.ini
+++ b/variants/esp32s3/tlora_t3s3_v1/platformio.ini
@@ -5,5 +5,5 @@ board_check = true
upload_protocol = esptool
build_flags =
- ${esp32_base.build_flags} -D TLORA_T3S3_V1 -I variants/tlora_t3s3_v1
- -DGPS_POWER_TOGGLE ; comment this line to disable triple press function on the user button to turn off gps entirely.
\ No newline at end of file
+ ${esp32_base.build_flags} -D TLORA_T3S3_V1 -I variants/esp32s3/tlora_t3s3_v1
+ -DGPS_POWER_TOGGLE ; comment this line to disable triple press function on the user button to turn off gps entirely.
diff --git a/variants/tlora_t3s3_v1/rfswitch.h b/variants/esp32s3/tlora_t3s3_v1/rfswitch.h
similarity index 100%
rename from variants/tlora_t3s3_v1/rfswitch.h
rename to variants/esp32s3/tlora_t3s3_v1/rfswitch.h
diff --git a/variants/tlora_t3s3_v1/variant.h b/variants/esp32s3/tlora_t3s3_v1/variant.h
similarity index 100%
rename from variants/tlora_t3s3_v1/variant.h
rename to variants/esp32s3/tlora_t3s3_v1/variant.h
diff --git a/variants/tracksenger/internal/pins_arduino.h b/variants/esp32s3/tracksenger/internal/pins_arduino.h
similarity index 100%
rename from variants/tracksenger/internal/pins_arduino.h
rename to variants/esp32s3/tracksenger/internal/pins_arduino.h
diff --git a/variants/tracksenger/internal/variant.h b/variants/esp32s3/tracksenger/internal/variant.h
similarity index 100%
rename from variants/tracksenger/internal/variant.h
rename to variants/esp32s3/tracksenger/internal/variant.h
diff --git a/variants/tracksenger/lcd/pins_arduino.h b/variants/esp32s3/tracksenger/lcd/pins_arduino.h
similarity index 100%
rename from variants/tracksenger/lcd/pins_arduino.h
rename to variants/esp32s3/tracksenger/lcd/pins_arduino.h
diff --git a/variants/tracksenger/lcd/variant.h b/variants/esp32s3/tracksenger/lcd/variant.h
similarity index 100%
rename from variants/tracksenger/lcd/variant.h
rename to variants/esp32s3/tracksenger/lcd/variant.h
diff --git a/variants/tracksenger/oled/pins_arduino.h b/variants/esp32s3/tracksenger/oled/pins_arduino.h
similarity index 100%
rename from variants/tracksenger/oled/pins_arduino.h
rename to variants/esp32s3/tracksenger/oled/pins_arduino.h
diff --git a/variants/tracksenger/oled/variant.h b/variants/esp32s3/tracksenger/oled/variant.h
similarity index 100%
rename from variants/tracksenger/oled/variant.h
rename to variants/esp32s3/tracksenger/oled/variant.h
diff --git a/variants/tracksenger/platformio.ini b/variants/esp32s3/tracksenger/platformio.ini
similarity index 85%
rename from variants/tracksenger/platformio.ini
rename to variants/esp32s3/tracksenger/platformio.ini
index b36b9c45a..0e9f08541 100644
--- a/variants/tracksenger/platformio.ini
+++ b/variants/esp32s3/tracksenger/platformio.ini
@@ -5,7 +5,8 @@ board_build.partitions = default_8MB.csv
upload_protocol = esp-builtin
build_flags =
- ${esp32s3_base.build_flags} -I variants/tracksenger/internal
+ ${esp32s3_base.build_flags}
+ -I variants/esp32s3/tracksenger/internal
-D HELTEC_TRACKER_V1_1
-D GPS_POWER_TOGGLE ; comment this line to disable triple press function on the user button to turn off gps entirely.
;-D DEBUG_DISABLED ; uncomment this line to disable DEBUG output
@@ -21,7 +22,8 @@ board_build.partitions = default_8MB.csv
upload_protocol = esp-builtin
build_flags =
- ${esp32s3_base.build_flags} -I variants/tracksenger/lcd
+ ${esp32s3_base.build_flags}
+ -I variants/esp32s3/tracksenger/lcd
-D HELTEC_TRACKER_V1_1
-D GPS_POWER_TOGGLE ; comment this line to disable triple press function on the user button to turn off gps entirely.
;-D DEBUG_DISABLED ; uncomment this line to disable DEBUG output
@@ -37,7 +39,8 @@ board_build.partitions = default_8MB.csv
upload_protocol = esp-builtin
build_flags =
- ${esp32s3_base.build_flags} -I variants/tracksenger/oled
+ ${esp32s3_base.build_flags}
+ -I variants/esp32s3/tracksenger/oled
-D HELTEC_TRACKER_V1_1
-D GPS_POWER_TOGGLE ; comment this line to disable triple press function on the user button to turn off gps entirely.
;-D DEBUG_DISABLED ; uncomment this line to disable DEBUG output
diff --git a/variants/unphone/pins_arduino.h b/variants/esp32s3/unphone/pins_arduino.h
similarity index 100%
rename from variants/unphone/pins_arduino.h
rename to variants/esp32s3/unphone/pins_arduino.h
diff --git a/variants/unphone/platformio.ini b/variants/esp32s3/unphone/platformio.ini
similarity index 96%
rename from variants/unphone/platformio.ini
rename to variants/esp32s3/unphone/platformio.ini
index b9da6d0e5..ecb1cbd67 100644
--- a/variants/unphone/platformio.ini
+++ b/variants/esp32s3/unphone/platformio.ini
@@ -11,7 +11,7 @@ monitor_filters = esp32_exception_decoder
build_flags =
${esp32s3_base.build_flags}
-D UNPHONE
- -I variants/unphone
+ -I variants/esp32s3/unphone
-D ARDUINO_USB_MODE=0
-D UNPHONE_ACCEL=0
-D UNPHONE_TOUCHS=0
@@ -23,7 +23,7 @@ build_flags =
build_src_filter =
${esp32s3_base.build_src_filter}
- +<../variants/unphone>
+ +<../variants/esp32s3/unphone>
lib_deps = ${esp32s3_base.lib_deps}
lovyan03/LovyanGFX@ 1.2.0
diff --git a/variants/unphone/variant.cpp b/variants/esp32s3/unphone/variant.cpp
similarity index 100%
rename from variants/unphone/variant.cpp
rename to variants/esp32s3/unphone/variant.cpp
diff --git a/variants/unphone/variant.h b/variants/esp32s3/unphone/variant.h
similarity index 100%
rename from variants/unphone/variant.h
rename to variants/esp32s3/unphone/variant.h
diff --git a/variants/Dongle_nRF52840-pca10059-v1/platformio.ini b/variants/nrf52840/Dongle_nRF52840-pca10059-v1/platformio.ini
similarity index 67%
rename from variants/Dongle_nRF52840-pca10059-v1/platformio.ini
rename to variants/nrf52840/Dongle_nRF52840-pca10059-v1/platformio.ini
index ad944779d..83044c206 100644
--- a/variants/Dongle_nRF52840-pca10059-v1/platformio.ini
+++ b/variants/nrf52840/Dongle_nRF52840-pca10059-v1/platformio.ini
@@ -2,11 +2,13 @@
board_level = extra
extends = nrf52840_base
board = nordic_pca10059
-build_flags = ${nrf52840_base.build_flags} -Ivariants/Dongle_nRF52840-pca10059-v1 -D NORDIC_PCA10059
+build_flags = ${nrf52840_base.build_flags}
+ -Ivariants/nrf52840/Dongle_nRF52840-pca10059-v1
+ -D NORDIC_PCA10059
-DEINK_DISPLAY_MODEL=GxEPD2_420_M01
-DEINK_WIDTH=300
-DEINK_HEIGHT=400
-build_src_filter = ${nrf52_base.build_src_filter} +<../variants/Dongle_nRF52840-pca10059-v1>
+build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/Dongle_nRF52840-pca10059-v1>
lib_deps =
${nrf52840_base.lib_deps}
zinggjm/GxEPD2@^1.6.2
diff --git a/variants/Dongle_nRF52840-pca10059-v1/variant.cpp b/variants/nrf52840/Dongle_nRF52840-pca10059-v1/variant.cpp
similarity index 100%
rename from variants/Dongle_nRF52840-pca10059-v1/variant.cpp
rename to variants/nrf52840/Dongle_nRF52840-pca10059-v1/variant.cpp
diff --git a/variants/Dongle_nRF52840-pca10059-v1/variant.h b/variants/nrf52840/Dongle_nRF52840-pca10059-v1/variant.h
similarity index 100%
rename from variants/Dongle_nRF52840-pca10059-v1/variant.h
rename to variants/nrf52840/Dongle_nRF52840-pca10059-v1/variant.h
diff --git a/variants/ELECROW-ThinkNode-M1/nicheGraphics.h b/variants/nrf52840/ELECROW-ThinkNode-M1/nicheGraphics.h
similarity index 100%
rename from variants/ELECROW-ThinkNode-M1/nicheGraphics.h
rename to variants/nrf52840/ELECROW-ThinkNode-M1/nicheGraphics.h
diff --git a/variants/ELECROW-ThinkNode-M1/platformio.ini b/variants/nrf52840/ELECROW-ThinkNode-M1/platformio.ini
similarity index 88%
rename from variants/ELECROW-ThinkNode-M1/platformio.ini
rename to variants/nrf52840/ELECROW-ThinkNode-M1/platformio.ini
index 2e9a20dfe..0578bcfe8 100644
--- a/variants/ELECROW-ThinkNode-M1/platformio.ini
+++ b/variants/nrf52840/ELECROW-ThinkNode-M1/platformio.ini
@@ -6,7 +6,8 @@ board_check = true
debug_tool = jlink
# add -DCFG_SYSVIEW if you want to use the Segger systemview tool for OS profiling.
-build_flags = ${nrf52840_base.build_flags} -Ivariants/ELECROW-ThinkNode-M1
+build_flags = ${nrf52840_base.build_flags}
+ -Ivariants/nrf52840/ELECROW-ThinkNode-M1
-DELECROW_ThinkNode_M1
-DGPS_POWER_TOGGLE
-DUSE_EINK
@@ -20,7 +21,7 @@ build_flags = ${nrf52840_base.build_flags} -Ivariants/ELECROW-ThinkNode-M1
; -DEINK_LIMIT_GHOSTING_PX=2000 ; (Optional) How much image ghosting is tolerated
-DEINK_BACKGROUND_USES_FAST ; (Optional) Use FAST refresh for both BACKGROUND and RESPONSIVE, until a limit is reached.
-build_src_filter = ${nrf52_base.build_src_filter} +<../variants/ELECROW-ThinkNode-M1>
+build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/ELECROW-ThinkNode-M1>
lib_deps =
${nrf52840_base.lib_deps}
https://github.com/meshtastic/GxEPD2/archive/33db3fa8ee6fc47d160bdb44f8f127c9a9203a10.zip
@@ -36,11 +37,12 @@ debug_tool = jlink
build_flags =
${nrf52840_base.build_flags}
${inkhud.build_flags}
- -I variants/ELECROW-ThinkNode-M1
+ -I variants/nrf52840/ELECROW-ThinkNode-M1
-D ELECROW_ThinkNode_M1
build_src_filter =
${nrf52_base.build_src_filter}
${inkhud.build_src_filter}
+ +<../variants/nrf52840/ELECROW-ThinkNode-M1>
lib_deps =
${inkhud.lib_deps} ; InkHUD libs first, so we get GFXRoot instead of AdafruitGFX
${nrf52840_base.lib_deps}
diff --git a/variants/ELECROW-ThinkNode-M1/variant.cpp b/variants/nrf52840/ELECROW-ThinkNode-M1/variant.cpp
similarity index 100%
rename from variants/ELECROW-ThinkNode-M1/variant.cpp
rename to variants/nrf52840/ELECROW-ThinkNode-M1/variant.cpp
diff --git a/variants/ELECROW-ThinkNode-M1/variant.h b/variants/nrf52840/ELECROW-ThinkNode-M1/variant.h
similarity index 100%
rename from variants/ELECROW-ThinkNode-M1/variant.h
rename to variants/nrf52840/ELECROW-ThinkNode-M1/variant.h
diff --git a/variants/ME25LS01-4Y10TD/platformio.ini b/variants/nrf52840/ME25LS01-4Y10TD/platformio.ini
similarity index 76%
rename from variants/ME25LS01-4Y10TD/platformio.ini
rename to variants/nrf52840/ME25LS01-4Y10TD/platformio.ini
index b452f0ad8..89a45694c 100644
--- a/variants/ME25LS01-4Y10TD/platformio.ini
+++ b/variants/nrf52840/ME25LS01-4Y10TD/platformio.ini
@@ -3,10 +3,14 @@ extends = nrf52840_base
board = me25ls01-4y10td
board_level = extra
; platform = https://github.com/maxgerhardt/platform-nordicnrf52#cac6fcf943a41accd2aeb4f3659ae297a73f422e
-build_flags = ${nrf52840_base.build_flags} -Ivariants/ME25LS01-4Y10TD -Isrc/platform/nrf52/softdevice -Isrc/platform/nrf52/softdevice/nrf52 -DME25LS01_4Y10TD
+build_flags = ${nrf52840_base.build_flags}
+ -Ivariants/nrf52840/ME25LS01-4Y10TD
+ -Isrc/platform/nrf52/softdevice
+ -Isrc/platform/nrf52/softdevice/nrf52
+ -DME25LS01_4Y10TD
-DGPS_POWER_TOGGLE ; comment this line to disable triple press function on the user button to turn off gps entirely.
board_build.ldscript = src/platform/nrf52/nrf52840_s140_v7.ld
-build_src_filter = ${nrf52_base.build_src_filter} +<../variants/ME25LS01-4Y10TD>
+build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/ME25LS01-4Y10TD>
lib_deps =
${nrf52840_base.lib_deps}
; If not set we will default to uploading over serial (first it forces bootloader entry by talking 1200bps to cdcacm)
diff --git a/variants/ME25LS01-4Y10TD/rfswitch.h b/variants/nrf52840/ME25LS01-4Y10TD/rfswitch.h
similarity index 100%
rename from variants/ME25LS01-4Y10TD/rfswitch.h
rename to variants/nrf52840/ME25LS01-4Y10TD/rfswitch.h
diff --git a/variants/ME25LS01-4Y10TD/variant.cpp b/variants/nrf52840/ME25LS01-4Y10TD/variant.cpp
similarity index 100%
rename from variants/ME25LS01-4Y10TD/variant.cpp
rename to variants/nrf52840/ME25LS01-4Y10TD/variant.cpp
diff --git a/variants/ME25LS01-4Y10TD/variant.h b/variants/nrf52840/ME25LS01-4Y10TD/variant.h
similarity index 100%
rename from variants/ME25LS01-4Y10TD/variant.h
rename to variants/nrf52840/ME25LS01-4Y10TD/variant.h
diff --git a/variants/ME25LS01-4Y10TD_e-ink/platformio.ini b/variants/nrf52840/ME25LS01-4Y10TD_e-ink/platformio.ini
similarity index 78%
rename from variants/ME25LS01-4Y10TD_e-ink/platformio.ini
rename to variants/nrf52840/ME25LS01-4Y10TD_e-ink/platformio.ini
index f9788a521..ad5867bd5 100644
--- a/variants/ME25LS01-4Y10TD_e-ink/platformio.ini
+++ b/variants/nrf52840/ME25LS01-4Y10TD_e-ink/platformio.ini
@@ -3,13 +3,17 @@ extends = nrf52840_base
board = me25ls01-4y10td
board_level = extra
; platform = https://github.com/maxgerhardt/platform-nordicnrf52#cac6fcf943a41accd2aeb4f3659ae297a73f422e
-build_flags = ${nrf52840_base.build_flags} -Ivariants/ME25LS01-4Y10TD_e-ink -Isrc/platform/nrf52/softdevice -Isrc/platform/nrf52/softdevice/nrf52 -DME25LS01_4Y10TD
+build_flags = ${nrf52840_base.build_flags}
+ -Ivariants/nrf52840/ME25LS01-4Y10TD_e-ink
+ -Isrc/platform/nrf52/softdevice
+ -Isrc/platform/nrf52/softdevice/nrf52
+ -DME25LS01_4Y10TD
-DGPS_POWER_TOGGLE ; comment this line to disable triple press function on the user button to turn off gps entirely.
-DEINK_DISPLAY_MODEL=GxEPD2_420_GDEY042T81
-DEINK_WIDTH=400
-DEINK_HEIGHT=300
board_build.ldscript = src/platform/nrf52/nrf52840_s140_v7.ld
-build_src_filter = ${nrf52_base.build_src_filter} +<../variants/ME25LS01-4Y10TD_e-ink>
+build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/ME25LS01-4Y10TD_e-ink>
lib_deps =
${nrf52840_base.lib_deps}
zinggjm/GxEPD2@^1.6.2
diff --git a/variants/ME25LS01-4Y10TD_e-ink/rfswitch.h b/variants/nrf52840/ME25LS01-4Y10TD_e-ink/rfswitch.h
similarity index 100%
rename from variants/ME25LS01-4Y10TD_e-ink/rfswitch.h
rename to variants/nrf52840/ME25LS01-4Y10TD_e-ink/rfswitch.h
diff --git a/variants/ME25LS01-4Y10TD_e-ink/variant.cpp b/variants/nrf52840/ME25LS01-4Y10TD_e-ink/variant.cpp
similarity index 100%
rename from variants/ME25LS01-4Y10TD_e-ink/variant.cpp
rename to variants/nrf52840/ME25LS01-4Y10TD_e-ink/variant.cpp
diff --git a/variants/ME25LS01-4Y10TD_e-ink/variant.h b/variants/nrf52840/ME25LS01-4Y10TD_e-ink/variant.h
similarity index 100%
rename from variants/ME25LS01-4Y10TD_e-ink/variant.h
rename to variants/nrf52840/ME25LS01-4Y10TD_e-ink/variant.h
diff --git a/variants/MS24SF1/platformio.ini b/variants/nrf52840/MS24SF1/platformio.ini
similarity index 79%
rename from variants/MS24SF1/platformio.ini
rename to variants/nrf52840/MS24SF1/platformio.ini
index 10e8d2c95..f162cbd60 100644
--- a/variants/MS24SF1/platformio.ini
+++ b/variants/nrf52840/MS24SF1/platformio.ini
@@ -3,10 +3,13 @@ extends = nrf52840_base
board = ms24sf1
board_level = extra
; platform = https://github.com/maxgerhardt/platform-nordicnrf52#cac6fcf943a41accd2aeb4f3659ae297a73f422e
-build_flags = ${nrf52840_base.build_flags} -Ivariants/MS24SF1 -Isrc/platform/nrf52/softdevice -Isrc/platform/nrf52/softdevice/nrf52
+build_flags = ${nrf52840_base.build_flags}
+ -Ivariants/nrf52840/MS24SF1
+ -Isrc/platform/nrf52/softdevice
+ -Isrc/platform/nrf52/softdevice/nrf52
-DGPS_POWER_TOGGLE ; comment this line to disable triple press function on the user button to turn off gps entirely.
board_build.ldscript = src/platform/nrf52/nrf52840_s140_v7.ld
-build_src_filter = ${nrf52_base.build_src_filter} +<../variants/MS24SF1>
+build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/MS24SF1>
lib_deps =
${nrf52840_base.lib_deps}
; If not set we will default to uploading over serial (first it forces bootloader entry by talking 1200bps to cdcacm)
diff --git a/variants/MS24SF1/variant.cpp b/variants/nrf52840/MS24SF1/variant.cpp
similarity index 100%
rename from variants/MS24SF1/variant.cpp
rename to variants/nrf52840/MS24SF1/variant.cpp
diff --git a/variants/MS24SF1/variant.h b/variants/nrf52840/MS24SF1/variant.h
similarity index 100%
rename from variants/MS24SF1/variant.h
rename to variants/nrf52840/MS24SF1/variant.h
diff --git a/variants/MakePython_nRF52840_eink/platformio.ini b/variants/nrf52840/MakePython_nRF52840_eink/platformio.ini
similarity index 77%
rename from variants/MakePython_nRF52840_eink/platformio.ini
rename to variants/nrf52840/MakePython_nRF52840_eink/platformio.ini
index ef97172e9..50e5495f0 100644
--- a/variants/MakePython_nRF52840_eink/platformio.ini
+++ b/variants/nrf52840/MakePython_nRF52840_eink/platformio.ini
@@ -2,12 +2,14 @@
board_level = extra
extends = nrf52840_base
board = nordic_pca10059
-build_flags = ${nrf52840_base.build_flags} -Ivariants/MakePython_nRF52840_eink -D PRIVATE_HW
+build_flags = ${nrf52840_base.build_flags}
+ -Ivariants/nrf52840/MakePython_nRF52840_eink
+ -D PRIVATE_HW
-D PIN_EINK_EN
-DEINK_DISPLAY_MODEL=GxEPD2_290_T5D
-DEINK_WIDTH=296
-DEINK_HEIGHT=128
-build_src_filter = ${nrf52_base.build_src_filter} +<../variants/MakePython_nRF52840_eink>
+build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/MakePython_nRF52840_eink>
lib_deps =
${nrf52840_base.lib_deps}
https://github.com/meshtastic/ESP32_Codec2/archive/633326c78ac251c059ab3a8c430fcdf25b41672f.zip
diff --git a/variants/MakePython_nRF52840_eink/variant.cpp b/variants/nrf52840/MakePython_nRF52840_eink/variant.cpp
similarity index 100%
rename from variants/MakePython_nRF52840_eink/variant.cpp
rename to variants/nrf52840/MakePython_nRF52840_eink/variant.cpp
diff --git a/variants/MakePython_nRF52840_eink/variant.h b/variants/nrf52840/MakePython_nRF52840_eink/variant.h
similarity index 100%
rename from variants/MakePython_nRF52840_eink/variant.h
rename to variants/nrf52840/MakePython_nRF52840_eink/variant.h
diff --git a/variants/MakePython_nRF52840_oled/platformio.ini b/variants/nrf52840/MakePython_nRF52840_oled/platformio.ini
similarity index 69%
rename from variants/MakePython_nRF52840_oled/platformio.ini
rename to variants/nrf52840/MakePython_nRF52840_oled/platformio.ini
index 57b9ecb79..c7418e53c 100644
--- a/variants/MakePython_nRF52840_oled/platformio.ini
+++ b/variants/nrf52840/MakePython_nRF52840_oled/platformio.ini
@@ -2,8 +2,10 @@
board_level = extra
extends = nrf52840_base
board = nordic_pca10059
-build_flags = ${nrf52840_base.build_flags} -Ivariants/MakePython_nRF52840_oled -D PRIVATE_HW
-build_src_filter = ${nrf52_base.build_src_filter} +<../variants/MakePython_nRF52840_oled>
+build_flags = ${nrf52840_base.build_flags}
+ -I variants/nrf52840/MakePython_nRF52840_oled
+ -D PRIVATE_HW
+build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/MakePython_nRF52840_oled>
lib_deps =
${nrf52840_base.lib_deps}
https://github.com/meshtastic/ESP32_Codec2/archive/633326c78ac251c059ab3a8c430fcdf25b41672f.zip
diff --git a/variants/MakePython_nRF52840_oled/variant.cpp b/variants/nrf52840/MakePython_nRF52840_oled/variant.cpp
similarity index 100%
rename from variants/MakePython_nRF52840_oled/variant.cpp
rename to variants/nrf52840/MakePython_nRF52840_oled/variant.cpp
diff --git a/variants/MakePython_nRF52840_oled/variant.h b/variants/nrf52840/MakePython_nRF52840_oled/variant.h
similarity index 100%
rename from variants/MakePython_nRF52840_oled/variant.h
rename to variants/nrf52840/MakePython_nRF52840_oled/variant.h
diff --git a/variants/TWC_mesh_v4/platformio.ini b/variants/nrf52840/TWC_mesh_v4/platformio.ini
similarity index 59%
rename from variants/TWC_mesh_v4/platformio.ini
rename to variants/nrf52840/TWC_mesh_v4/platformio.ini
index 2eb58bf9f..77aeee26e 100644
--- a/variants/TWC_mesh_v4/platformio.ini
+++ b/variants/nrf52840/TWC_mesh_v4/platformio.ini
@@ -2,8 +2,10 @@
extends = nrf52840_base
board = nordic_pca10059
board_level = extra
-build_flags = ${nrf52840_base.build_flags} -I variants/TWC_mesh_v4 -D TWC_mesh_v4 -L".pio\libdeps\TWC_mesh_v4\bsec2\src\cortex-m4\fpv4-sp-d16-hard"
-build_src_filter = ${nrf52_base.build_src_filter} +<../variants/TWC_mesh_v4>
+build_flags = ${nrf52840_base.build_flags}
+ -I variants/nrf52840/TWC_mesh_v4
+ -D TWC_mesh_v4
+build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/TWC_mesh_v4>
lib_deps =
${nrf52840_base.lib_deps}
zinggjm/GxEPD2@^1.6.2
diff --git a/variants/TWC_mesh_v4/variant.cpp b/variants/nrf52840/TWC_mesh_v4/variant.cpp
similarity index 100%
rename from variants/TWC_mesh_v4/variant.cpp
rename to variants/nrf52840/TWC_mesh_v4/variant.cpp
diff --git a/variants/TWC_mesh_v4/variant.h b/variants/nrf52840/TWC_mesh_v4/variant.h
similarity index 100%
rename from variants/TWC_mesh_v4/variant.h
rename to variants/nrf52840/TWC_mesh_v4/variant.h
diff --git a/variants/canaryone/platformio.ini b/variants/nrf52840/canaryone/platformio.ini
similarity index 78%
rename from variants/canaryone/platformio.ini
rename to variants/nrf52840/canaryone/platformio.ini
index ad11305db..251937e9c 100644
--- a/variants/canaryone/platformio.ini
+++ b/variants/nrf52840/canaryone/platformio.ini
@@ -5,8 +5,10 @@ board = canaryone
debug_tool = jlink
# add -DCFG_SYSVIEW if you want to use the Segger systemview tool for OS profiling.
-build_flags = ${nrf52840_base.build_flags} -Ivariants/canaryone
-build_src_filter = ${nrf52_base.build_src_filter} +<../variants/canaryone>
+build_flags =
+ ${nrf52840_base.build_flags}
+ -I variants/nrf52840/canaryone
+build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/canaryone>
lib_deps =
${nrf52840_base.lib_deps}
lewisxhe/PCF8563_Library@^1.0.1
diff --git a/variants/canaryone/variant.cpp b/variants/nrf52840/canaryone/variant.cpp
similarity index 100%
rename from variants/canaryone/variant.cpp
rename to variants/nrf52840/canaryone/variant.cpp
diff --git a/variants/canaryone/variant.h b/variants/nrf52840/canaryone/variant.h
similarity index 100%
rename from variants/canaryone/variant.h
rename to variants/nrf52840/canaryone/variant.h
diff --git a/variants/diy/nrf52_promicro_diy_tcxo/E80_RSSI_per_case.webp b/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/E80_RSSI_per_case.webp
similarity index 100%
rename from variants/diy/nrf52_promicro_diy_tcxo/E80_RSSI_per_case.webp
rename to variants/nrf52840/diy/nrf52_promicro_diy_tcxo/E80_RSSI_per_case.webp
diff --git a/variants/diy/nrf52_promicro_diy_tcxo/Schematic_Pro-Micro_Pinouts 2024-12-14.pdf b/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/Schematic_Pro-Micro_Pinouts 2024-12-14.pdf
similarity index 100%
rename from variants/diy/nrf52_promicro_diy_tcxo/Schematic_Pro-Micro_Pinouts 2024-12-14.pdf
rename to variants/nrf52840/diy/nrf52_promicro_diy_tcxo/Schematic_Pro-Micro_Pinouts 2024-12-14.pdf
diff --git a/variants/diy/nrf52_promicro_diy_tcxo/custom_build_tasks.py b/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/custom_build_tasks.py
similarity index 100%
rename from variants/diy/nrf52_promicro_diy_tcxo/custom_build_tasks.py
rename to variants/nrf52840/diy/nrf52_promicro_diy_tcxo/custom_build_tasks.py
diff --git a/variants/diy/nrf52_promicro_diy_tcxo/nicheGraphics.h b/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/nicheGraphics.h
similarity index 100%
rename from variants/diy/nrf52_promicro_diy_tcxo/nicheGraphics.h
rename to variants/nrf52840/diy/nrf52_promicro_diy_tcxo/nicheGraphics.h
diff --git a/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/platformio.ini b/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/platformio.ini
new file mode 100644
index 000000000..61a6eda07
--- /dev/null
+++ b/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/platformio.ini
@@ -0,0 +1,32 @@
+; Promicro + E22(0)-xxxM / HT-RA62 modules board variant - DIY - with TCXO
+[env:nrf52_promicro_diy_tcxo]
+extends = nrf52840_base
+board = promicro-nrf52840
+build_flags = ${nrf52840_base.build_flags}
+ -I variants/nrf52840/diy/nrf52_promicro_diy_tcxo
+ -D NRF52_PROMICRO_DIY
+build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/diy/nrf52_promicro_diy_tcxo>
+lib_deps =
+ ${nrf52840_base.lib_deps}
+debug_tool = jlink
+
+; NRF52 ProMicro w/ E-Ink display
+[env:nrf52_promicro_diy-inkhud]
+board_level = extra
+extends = nrf52840_base, inkhud
+board = promicro-nrf52840
+build_flags =
+ ${nrf52840_base.build_flags}
+ ${inkhud.build_flags}
+ -I variants/nrf52840/diy/nrf52_promicro_diy_tcxo
+ -D NRF52_PROMICRO_DIY
+build_src_filter =
+ ${nrf52_base.build_src_filter}
+ ${inkhud.build_src_filter}
+ +<../variants/nrf52840/diy/nrf52_promicro_diy_tcxo>
+lib_deps =
+ ${inkhud.lib_deps} ; InkHUD libs first, so we get GFXRoot instead of AdafruitGFX
+ ${nrf52840_base.lib_deps}
+extra_scripts =
+ ${env.extra_scripts}
+ variants/nrf52840/diy/nrf52_promicro_diy_tcxo/custom_build_tasks.py ; Add to PIO's Project Tasks pane: preset builds for common displays
diff --git a/variants/diy/nrf52_promicro_diy_tcxo/readme.md b/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/readme.md
similarity index 99%
rename from variants/diy/nrf52_promicro_diy_tcxo/readme.md
rename to variants/nrf52840/diy/nrf52_promicro_diy_tcxo/readme.md
index 585ac36de..5a78103ee 100644
--- a/variants/diy/nrf52_promicro_diy_tcxo/readme.md
+++ b/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/readme.md
@@ -1,3 +1,5 @@
+
+
# Notes
## General
diff --git a/variants/diy/nrf52_promicro_diy_tcxo/rfswitch.h b/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/rfswitch.h
similarity index 100%
rename from variants/diy/nrf52_promicro_diy_tcxo/rfswitch.h
rename to variants/nrf52840/diy/nrf52_promicro_diy_tcxo/rfswitch.h
diff --git a/variants/diy/nrf52_promicro_diy_tcxo/variant.cpp b/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/variant.cpp
similarity index 100%
rename from variants/diy/nrf52_promicro_diy_tcxo/variant.cpp
rename to variants/nrf52840/diy/nrf52_promicro_diy_tcxo/variant.cpp
diff --git a/variants/diy/nrf52_promicro_diy_tcxo/variant.h b/variants/nrf52840/diy/nrf52_promicro_diy_tcxo/variant.h
similarity index 100%
rename from variants/diy/nrf52_promicro_diy_tcxo/variant.h
rename to variants/nrf52840/diy/nrf52_promicro_diy_tcxo/variant.h
diff --git a/variants/nrf52840/diy/nrf52_promicro_diy_xtal/platformio.ini b/variants/nrf52840/diy/nrf52_promicro_diy_xtal/platformio.ini
new file mode 100644
index 000000000..278f578c5
--- /dev/null
+++ b/variants/nrf52840/diy/nrf52_promicro_diy_xtal/platformio.ini
@@ -0,0 +1,12 @@
+; Promicro + E22(0)-xxxMM / RA-01SH modules board variant - DIY - without TCXO
+[env:nrf52_promicro_diy_xtal]
+extends = nrf52840_base
+board = promicro-nrf52840
+board_level = extra
+build_flags = ${nrf52840_base.build_flags}
+ -I variants/nrf52840/diy/nrf52_promicro_diy_xtal
+ -D NRF52_PROMICRO_DIY
+build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/diy/nrf52_promicro_diy_xtal>
+lib_deps =
+ ${nrf52840_base.lib_deps}
+debug_tool = jlink
diff --git a/variants/diy/nrf52_promicro_diy_xtal/variant.cpp b/variants/nrf52840/diy/nrf52_promicro_diy_xtal/variant.cpp
similarity index 100%
rename from variants/diy/nrf52_promicro_diy_xtal/variant.cpp
rename to variants/nrf52840/diy/nrf52_promicro_diy_xtal/variant.cpp
diff --git a/variants/diy/nrf52_promicro_diy_xtal/variant.h b/variants/nrf52840/diy/nrf52_promicro_diy_xtal/variant.h
similarity index 100%
rename from variants/diy/nrf52_promicro_diy_xtal/variant.h
rename to variants/nrf52840/diy/nrf52_promicro_diy_xtal/variant.h
diff --git a/variants/diy/seeed-xiao-nrf52840-wio-sx1262/README.md b/variants/nrf52840/diy/seeed-xiao-nrf52840-wio-sx1262/README.md
similarity index 100%
rename from variants/diy/seeed-xiao-nrf52840-wio-sx1262/README.md
rename to variants/nrf52840/diy/seeed-xiao-nrf52840-wio-sx1262/README.md
diff --git a/variants/nrf52840/diy/seeed-xiao-nrf52840-wio-sx1262/platformio.ini b/variants/nrf52840/diy/seeed-xiao-nrf52840-wio-sx1262/platformio.ini
new file mode 100644
index 000000000..2df31d23c
--- /dev/null
+++ b/variants/nrf52840/diy/seeed-xiao-nrf52840-wio-sx1262/platformio.ini
@@ -0,0 +1,15 @@
+; Seeed XIAO nRF52840 + XIAO Wio SX1262 DIY
+[env:seeed-xiao-nrf52840-wio-sx1262]
+board = xiao_ble_sense
+extends = nrf52840_base
+board_level = extra
+build_flags = ${nrf52840_base.build_flags}
+ -Ivariants/nrf52840/diy/seeed-xiao-nrf52840-wio-sx1262
+ -D PRIVATE_HW
+ -Isrc/platform/nrf52/softdevice
+ -Isrc/platform/nrf52/softdevice/nrf52
+board_build.ldscript = src/platform/nrf52/nrf52840_s140_v7.ld
+build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/diy/seeed-xiao-nrf52840-wio-sx1262>
+lib_deps =
+ ${nrf52840_base.lib_deps}
+debug_tool = jlink
diff --git a/variants/diy/seeed-xiao-nrf52840-wio-sx1262/variant.cpp b/variants/nrf52840/diy/seeed-xiao-nrf52840-wio-sx1262/variant.cpp
similarity index 100%
rename from variants/diy/seeed-xiao-nrf52840-wio-sx1262/variant.cpp
rename to variants/nrf52840/diy/seeed-xiao-nrf52840-wio-sx1262/variant.cpp
diff --git a/variants/diy/seeed-xiao-nrf52840-wio-sx1262/variant.h b/variants/nrf52840/diy/seeed-xiao-nrf52840-wio-sx1262/variant.h
similarity index 100%
rename from variants/diy/seeed-xiao-nrf52840-wio-sx1262/variant.h
rename to variants/nrf52840/diy/seeed-xiao-nrf52840-wio-sx1262/variant.h
diff --git a/variants/nrf52840/diy/seeed_xiao_nrf52840_e22/platformio.ini b/variants/nrf52840/diy/seeed_xiao_nrf52840_e22/platformio.ini
new file mode 100644
index 000000000..a5d0aaf8f
--- /dev/null
+++ b/variants/nrf52840/diy/seeed_xiao_nrf52840_e22/platformio.ini
@@ -0,0 +1,19 @@
+; Seeed XIAO nRF52840 + EBYTE E22-900M30S - Pinout matching Wio-SX1262 (SKU 113010003)
+[env:seeed_xiao_nrf52840_e22_900m30s]
+extends = env:seeed_xiao_nrf52840_kit
+board_level = extra
+build_flags = ${env:seeed_xiao_nrf52840_kit.build_flags}
+ -D PRIVATE_HW
+ -DEBYTE_E22
+ -DEBYTE_E22_900M30S
+build_unflags = -DGPS_L76K
+
+; Seeed XIAO nRF52840 + EBYTE E22-900M33S - Pinout matching Wio-SX1262 (SKU 113010003)
+[env:seeed_xiao_nrf52840_e22_900m33s]
+extends = env:seeed_xiao_nrf52840_kit
+board_level = extra
+build_flags = ${env:seeed_xiao_nrf52840_kit.build_flags}
+ -D PRIVATE_HW
+ -DEBYTE_E22
+ -DEBYTE_E22_900M33S
+build_unflags = -DGPS_L76K
diff --git a/variants/diy/xiao_ble/README.md b/variants/nrf52840/diy/xiao_ble/README.md
similarity index 100%
rename from variants/diy/xiao_ble/README.md
rename to variants/nrf52840/diy/xiao_ble/README.md
diff --git a/variants/nrf52840/diy/xiao_ble/platformio.ini b/variants/nrf52840/diy/xiao_ble/platformio.ini
new file mode 100644
index 000000000..6c764ea78
--- /dev/null
+++ b/variants/nrf52840/diy/xiao_ble/platformio.ini
@@ -0,0 +1,10 @@
+; Seeed Xiao BLE: https://www.digikey.com/en/products/detail/seeed-technology-co-ltd/102010448/16652893
+[env:xiao_ble]
+extends = env:seeed_xiao_nrf52840_kit
+board_level = extra
+build_flags = ${env:seeed_xiao_nrf52840_kit.build_flags}
+ -D PRIVATE_HW
+ -DXIAO_BLE_LEGACY_PINOUT
+ -DEBYTE_E22
+ -DEBYTE_E22_900M30S
+build_unflags = -DGPS_L76K
diff --git a/variants/feather_diy/platformio.ini b/variants/nrf52840/feather_diy/platformio.ini
similarity index 79%
rename from variants/feather_diy/platformio.ini
rename to variants/nrf52840/feather_diy/platformio.ini
index 84c582ab0..a17e418a2 100644
--- a/variants/feather_diy/platformio.ini
+++ b/variants/nrf52840/feather_diy/platformio.ini
@@ -2,8 +2,10 @@
[env:feather_diy]
extends = nrf52840_base
board = adafruit_feather_nrf52840
-build_flags = ${nrf52840_base.build_flags} -Ivariants/feather_diy -Dfeather_diy
-build_src_filter = ${nrf52_base.build_src_filter} +<../variants/feather_diy>
+build_flags = ${nrf52840_base.build_flags}
+ -Ivariants/nrf52840/feather_diy
+ -Dfeather_diy
+build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/feather_diy>
lib_deps =
${nrf52840_base.lib_deps}
debug_tool = jlink
diff --git a/variants/feather_diy/variant.cpp b/variants/nrf52840/feather_diy/variant.cpp
similarity index 100%
rename from variants/feather_diy/variant.cpp
rename to variants/nrf52840/feather_diy/variant.cpp
diff --git a/variants/feather_diy/variant.h b/variants/nrf52840/feather_diy/variant.h
similarity index 100%
rename from variants/feather_diy/variant.h
rename to variants/nrf52840/feather_diy/variant.h
diff --git a/variants/gat562_mesh_trial_tracker/platformio.ini b/variants/nrf52840/gat562_mesh_trial_tracker/platformio.ini
similarity index 75%
rename from variants/gat562_mesh_trial_tracker/platformio.ini
rename to variants/nrf52840/gat562_mesh_trial_tracker/platformio.ini
index e67f3ec8d..72ac6320d 100644
--- a/variants/gat562_mesh_trial_tracker/platformio.ini
+++ b/variants/nrf52840/gat562_mesh_trial_tracker/platformio.ini
@@ -3,11 +3,13 @@
extends = nrf52840_base
board = gat562_mesh_trial_tracker
board_check = true
-build_flags = ${nrf52840_base.build_flags} -Ivariants/gat562_mesh_trial_tracker -D GAT562_MESH_TRIAL_TRACKER
+build_flags = ${nrf52840_base.build_flags}
+ -I variants/nrf52840/gat562_mesh_trial_tracker
+ -D GAT562_MESH_TRIAL_TRACKER
-DGPS_POWER_TOGGLE ; comment this line to disable triple press function on the user button to turn off gps entirely.
-DRADIOLIB_EXCLUDE_SX128X=1
-DRADIOLIB_EXCLUDE_SX127X=1
-DRADIOLIB_EXCLUDE_LR11X0=1
-build_src_filter = ${nrf52_base.build_src_filter} +<../variants/gat562_mesh_trial_tracker>
-lib_deps =
+build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/gat562_mesh_trial_tracker>
+lib_deps =
${nrf52840_base.lib_deps}
diff --git a/variants/gat562_mesh_trial_tracker/variant.cpp b/variants/nrf52840/gat562_mesh_trial_tracker/variant.cpp
similarity index 100%
rename from variants/gat562_mesh_trial_tracker/variant.cpp
rename to variants/nrf52840/gat562_mesh_trial_tracker/variant.cpp
diff --git a/variants/gat562_mesh_trial_tracker/variant.h b/variants/nrf52840/gat562_mesh_trial_tracker/variant.h
similarity index 100%
rename from variants/gat562_mesh_trial_tracker/variant.h
rename to variants/nrf52840/gat562_mesh_trial_tracker/variant.h
diff --git a/variants/heltec_mesh_node_t114-inkhud/custom_build_tasks.py b/variants/nrf52840/heltec_mesh_node_t114-inkhud/custom_build_tasks.py
similarity index 100%
rename from variants/heltec_mesh_node_t114-inkhud/custom_build_tasks.py
rename to variants/nrf52840/heltec_mesh_node_t114-inkhud/custom_build_tasks.py
diff --git a/variants/heltec_mesh_node_t114-inkhud/nicheGraphics.h b/variants/nrf52840/heltec_mesh_node_t114-inkhud/nicheGraphics.h
similarity index 100%
rename from variants/heltec_mesh_node_t114-inkhud/nicheGraphics.h
rename to variants/nrf52840/heltec_mesh_node_t114-inkhud/nicheGraphics.h
diff --git a/variants/heltec_mesh_node_t114-inkhud/platformio.ini b/variants/nrf52840/heltec_mesh_node_t114-inkhud/platformio.ini
similarity index 66%
rename from variants/heltec_mesh_node_t114-inkhud/platformio.ini
rename to variants/nrf52840/heltec_mesh_node_t114-inkhud/platformio.ini
index 9a5673040..2641a507d 100644
--- a/variants/heltec_mesh_node_t114-inkhud/platformio.ini
+++ b/variants/nrf52840/heltec_mesh_node_t114-inkhud/platformio.ini
@@ -6,14 +6,15 @@ board_check = true
build_flags =
${nrf52840_base.build_flags}
${inkhud.build_flags}
- -I variants/heltec_mesh_node_t114-inkhud
+ -I variants/nrf52840/heltec_mesh_node_t114-inkhud
build_src_filter =
${nrf52_base.build_src_filter}
${inkhud.build_src_filter}
+ +<../variants/nrf52840/heltec_mesh_node_t114-inkhud>
lib_deps =
${inkhud.lib_deps} ; InkHUD libs first, so we get GFXRoot instead of AdafruitGFX
${nrf52840_base.lib_deps}
lewisxhe/PCF8563_Library@^1.0.1
extra_scripts =
${env.extra_scripts}
- variants/diy/nrf52_promicro_diy_tcxo/custom_build_tasks.py ; Add to PIO's Project Tasks pane: preset builds for common displays
\ No newline at end of file
+ variants/nrf52840/diy/nrf52_promicro_diy_tcxo/custom_build_tasks.py ; Add to PIO's Project Tasks pane: preset builds for common displays
diff --git a/variants/heltec_mesh_node_t114-inkhud/variant.cpp b/variants/nrf52840/heltec_mesh_node_t114-inkhud/variant.cpp
similarity index 100%
rename from variants/heltec_mesh_node_t114-inkhud/variant.cpp
rename to variants/nrf52840/heltec_mesh_node_t114-inkhud/variant.cpp
diff --git a/variants/heltec_mesh_node_t114-inkhud/variant.h b/variants/nrf52840/heltec_mesh_node_t114-inkhud/variant.h
similarity index 100%
rename from variants/heltec_mesh_node_t114-inkhud/variant.h
rename to variants/nrf52840/heltec_mesh_node_t114-inkhud/variant.h
diff --git a/variants/heltec_mesh_node_t114/platformio.ini b/variants/nrf52840/heltec_mesh_node_t114/platformio.ini
similarity index 74%
rename from variants/heltec_mesh_node_t114/platformio.ini
rename to variants/nrf52840/heltec_mesh_node_t114/platformio.ini
index 3ba97bd04..ead787bb1 100644
--- a/variants/heltec_mesh_node_t114/platformio.ini
+++ b/variants/nrf52840/heltec_mesh_node_t114/platformio.ini
@@ -5,11 +5,12 @@ board = heltec_mesh_node_t114
debug_tool = jlink
# add -DCFG_SYSVIEW if you want to use the Segger systemview tool for OS profiling.
-build_flags = ${nrf52840_base.build_flags} -Ivariants/heltec_mesh_node_t114
- -DGPS_POWER_TOGGLE
- -DHELTEC_T114
+build_flags = ${nrf52840_base.build_flags}
+ -Ivariants/nrf52840/heltec_mesh_node_t114
+ -DGPS_POWER_TOGGLE
+ -DHELTEC_T114
-build_src_filter = ${nrf52_base.build_src_filter} +<../variants/heltec_mesh_node_t114>
+build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/heltec_mesh_node_t114>
lib_deps =
${nrf52840_base.lib_deps}
lewisxhe/PCF8563_Library@^1.0.1
diff --git a/variants/heltec_mesh_node_t114/variant.cpp b/variants/nrf52840/heltec_mesh_node_t114/variant.cpp
similarity index 100%
rename from variants/heltec_mesh_node_t114/variant.cpp
rename to variants/nrf52840/heltec_mesh_node_t114/variant.cpp
diff --git a/variants/heltec_mesh_node_t114/variant.h b/variants/nrf52840/heltec_mesh_node_t114/variant.h
similarity index 100%
rename from variants/heltec_mesh_node_t114/variant.h
rename to variants/nrf52840/heltec_mesh_node_t114/variant.h
diff --git a/variants/heltec_mesh_pocket/nicheGraphics.h b/variants/nrf52840/heltec_mesh_pocket/nicheGraphics.h
similarity index 100%
rename from variants/heltec_mesh_pocket/nicheGraphics.h
rename to variants/nrf52840/heltec_mesh_pocket/nicheGraphics.h
diff --git a/variants/heltec_mesh_pocket/platformio.ini b/variants/nrf52840/heltec_mesh_pocket/platformio.ini
similarity index 89%
rename from variants/heltec_mesh_pocket/platformio.ini
rename to variants/nrf52840/heltec_mesh_pocket/platformio.ini
index 2f3886887..2fb852226 100644
--- a/variants/heltec_mesh_pocket/platformio.ini
+++ b/variants/nrf52840/heltec_mesh_pocket/platformio.ini
@@ -5,7 +5,8 @@ board = heltec_mesh_pocket
debug_tool = jlink
# add -DCFG_SYSVIEW if you want to use the Segger systemview tool for OS profiling.
-build_flags = ${nrf52840_base.build_flags} -Ivariants/heltec_mesh_pocket
+build_flags = ${nrf52840_base.build_flags}
+ -Ivariants/nrf52840/heltec_mesh_pocket
-DHELTEC_MESH_POCKET
-DHELTEC_MESH_POCKET_BATTERY_5000
-DUSE_EINK
@@ -21,7 +22,7 @@ build_flags = ${nrf52840_base.build_flags} -Ivariants/heltec_mesh_pocket
-DEINK_HASQUIRK_GHOSTING ; Display model is identified as "prone to ghosting"
-DEINK_HASQUIRK_WEAKFASTREFRESH ; Pixels set with fast-refresh are easy to clear, disrupted by sunlight
-build_src_filter = ${nrf52_base.build_src_filter} +<../variants/heltec_mesh_pocket>
+build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/heltec_mesh_pocket>
lib_deps =
${nrf52840_base.lib_deps}
lewisxhe/PCF8563_Library@^1.0.1
@@ -31,11 +32,11 @@ lib_deps =
[env:heltec-mesh-pocket-5000-inkhud]
extends = nrf52840_base, inkhud
board = heltec_mesh_pocket
-build_src_filter = ${nrf52_base.build_src_filter} +<../variants/heltec_mesh_pocket> ${inkhud.build_src_filter}
+build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/heltec_mesh_pocket> ${inkhud.build_src_filter}
build_flags =
${inkhud.build_flags}
${nrf52840_base.build_flags}
- -I variants/heltec_mesh_pocket
+ -I variants/nrf52840/heltec_mesh_pocket
-D HELTEC_MESH_POCKET
-D HELTEC_MESH_POCKET_BATTERY_5000
lib_deps =
@@ -50,7 +51,8 @@ board = heltec_mesh_pocket
debug_tool = jlink
# add -DCFG_SYSVIEW if you want to use the Segger systemview tool for OS profiling.
-build_flags = ${nrf52840_base.build_flags} -Ivariants/heltec_mesh_pocket
+build_flags = ${nrf52840_base.build_flags}
+ -Ivariants/nrf52840/heltec_mesh_pocket
-DHELTEC_MESH_POCKET
-DHELTEC_MESH_POCKET_BATTERY_10000
-DUSE_EINK
@@ -66,7 +68,7 @@ build_flags = ${nrf52840_base.build_flags} -Ivariants/heltec_mesh_pocket
-DEINK_HASQUIRK_GHOSTING ; Display model is identified as "prone to ghosting"
-DEINK_HASQUIRK_WEAKFASTREFRESH ; Pixels set with fast-refresh are easy to clear, disrupted by sunlight
-build_src_filter = ${nrf52_base.build_src_filter} +<../variants/heltec_mesh_pocket>
+build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/heltec_mesh_pocket>
lib_deps =
${nrf52840_base.lib_deps}
lewisxhe/PCF8563_Library@^1.0.1
@@ -76,11 +78,11 @@ lib_deps =
[env:heltec-mesh-pocket-10000-inkhud]
extends = nrf52840_base, inkhud
board = heltec_mesh_pocket
-build_src_filter = ${nrf52_base.build_src_filter} +<../variants/heltec_mesh_pocket> ${inkhud.build_src_filter}
+build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/heltec_mesh_pocket> ${inkhud.build_src_filter}
build_flags =
${inkhud.build_flags}
${nrf52840_base.build_flags}
- -I variants/heltec_mesh_pocket
+ -I variants/nrf52840/heltec_mesh_pocket
-D HELTEC_MESH_POCKET
-D HELTEC_MESH_POCKET_BATTERY_10000
lib_deps =
diff --git a/variants/heltec_mesh_pocket/variant.cpp b/variants/nrf52840/heltec_mesh_pocket/variant.cpp
similarity index 100%
rename from variants/heltec_mesh_pocket/variant.cpp
rename to variants/nrf52840/heltec_mesh_pocket/variant.cpp
diff --git a/variants/heltec_mesh_pocket/variant.h b/variants/nrf52840/heltec_mesh_pocket/variant.h
similarity index 100%
rename from variants/heltec_mesh_pocket/variant.h
rename to variants/nrf52840/heltec_mesh_pocket/variant.h
diff --git a/variants/meshlink/platformio.ini b/variants/nrf52840/meshlink/platformio.ini
similarity index 94%
rename from variants/meshlink/platformio.ini
rename to variants/nrf52840/meshlink/platformio.ini
index 384858576..8216a704a 100644
--- a/variants/meshlink/platformio.ini
+++ b/variants/nrf52840/meshlink/platformio.ini
@@ -5,7 +5,9 @@
extends = nrf52840_base
board = meshlink
;board_check = true
-build_flags = ${nrf52840_base.build_flags} -I variants/meshlink -D MESHLINK
+build_flags = ${nrf52840_base.build_flags}
+ -I variants/nrf52840/meshlink
+ -D MESHLINK
-D GPS_POWER_TOGGLE ; comment this line to disable triple press function on the user button to turn off gps entirely.
-D EINK_DISPLAY_MODEL=GxEPD2_213_B74
-D EINK_WIDTH=250
@@ -19,7 +21,7 @@ build_flags = ${nrf52840_base.build_flags} -I variants/meshlink -D MESHLINK
-D EINK_HASQUIRK_VICIOUSFASTREFRESH ; Identify that pixels drawn by fast-refresh are harder to clear
-build_src_filter = ${nrf52_base.build_src_filter} +<../variants/meshlink>
+build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/meshlink>
lib_deps =
${nrf52840_base.lib_deps}
https://github.com/meshtastic/GxEPD2/archive/55f618961db45a23eff0233546430f1e5a80f63a.zip
diff --git a/variants/meshlink/variant.cpp b/variants/nrf52840/meshlink/variant.cpp
similarity index 100%
rename from variants/meshlink/variant.cpp
rename to variants/nrf52840/meshlink/variant.cpp
diff --git a/variants/meshlink/variant.h b/variants/nrf52840/meshlink/variant.h
similarity index 100%
rename from variants/meshlink/variant.h
rename to variants/nrf52840/meshlink/variant.h
diff --git a/variants/meshlink_eink/platformio.ini b/variants/nrf52840/meshlink_eink/platformio.ini
similarity index 93%
rename from variants/meshlink_eink/platformio.ini
rename to variants/nrf52840/meshlink_eink/platformio.ini
index 550b1e2fc..a48a9e695 100644
--- a/variants/meshlink_eink/platformio.ini
+++ b/variants/nrf52840/meshlink_eink/platformio.ini
@@ -5,7 +5,9 @@
extends = nrf52840_base
board = meshlink
;board_check = true
-build_flags = ${nrf52840_base.build_flags} -I variants/meshlink_eink -D MESHLINK
+build_flags = ${nrf52840_base.build_flags}
+ -I variants/nrf52840/meshlink_eink
+ -D MESHLINK
-D GPS_POWER_TOGGLE ; comment this line to disable triple press function on the user button to turn off gps entirely.
-D EINK_DISPLAY_MODEL=GxEPD2_213_B74
-D EINK_WIDTH=250
@@ -19,7 +21,7 @@ build_flags = ${nrf52840_base.build_flags} -I variants/meshlink_eink -D MESHLINK
-D EINK_HASQUIRK_VICIOUSFASTREFRESH ; Identify that pixels drawn by fast-refresh are harder to clear
-build_src_filter = ${nrf52_base.build_src_filter} +<../variants/meshlink_eink>
+build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/meshlink_eink>
lib_deps =
${nrf52840_base.lib_deps}
https://github.com/meshtastic/GxEPD2/archive/55f618961db45a23eff0233546430f1e5a80f63a.zip
diff --git a/variants/meshlink_eink/variant.cpp b/variants/nrf52840/meshlink_eink/variant.cpp
similarity index 100%
rename from variants/meshlink_eink/variant.cpp
rename to variants/nrf52840/meshlink_eink/variant.cpp
diff --git a/variants/meshlink_eink/variant.h b/variants/nrf52840/meshlink_eink/variant.h
similarity index 100%
rename from variants/meshlink_eink/variant.h
rename to variants/nrf52840/meshlink_eink/variant.h
diff --git a/variants/monteops_hw1/platformio.ini b/variants/nrf52840/monteops_hw1/platformio.ini
similarity index 77%
rename from variants/monteops_hw1/platformio.ini
rename to variants/nrf52840/monteops_hw1/platformio.ini
index 82567f614..5426aee7f 100644
--- a/variants/monteops_hw1/platformio.ini
+++ b/variants/nrf52840/monteops_hw1/platformio.ini
@@ -3,8 +3,10 @@
board_level = extra
extends = nrf52840_base
board = wiscore_rak4631
-build_flags = ${nrf52840_base.build_flags} -Ivariants/monteops_hw1 -D MONTEOPS_HW1
-build_src_filter = ${nrf52_base.build_src_filter} +<../variants/monteops_hw1> + + +
+build_flags = ${nrf52840_base.build_flags}
+ -I variants/nrf52840/monteops_hw1
+ -D MONTEOPS_HW1
+build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/monteops_hw1> + + +
lib_deps =
${nrf52840_base.lib_deps}
${networking_base.lib_deps}
diff --git a/variants/monteops_hw1/variant.cpp b/variants/nrf52840/monteops_hw1/variant.cpp
similarity index 100%
rename from variants/monteops_hw1/variant.cpp
rename to variants/nrf52840/monteops_hw1/variant.cpp
diff --git a/variants/monteops_hw1/variant.h b/variants/nrf52840/monteops_hw1/variant.h
similarity index 100%
rename from variants/monteops_hw1/variant.h
rename to variants/nrf52840/monteops_hw1/variant.h
diff --git a/variants/nano-g2-ultra/platformio.ini b/variants/nrf52840/nano-g2-ultra/platformio.ini
similarity index 70%
rename from variants/nano-g2-ultra/platformio.ini
rename to variants/nrf52840/nano-g2-ultra/platformio.ini
index 7da168b47..f697a90dd 100644
--- a/variants/nano-g2-ultra/platformio.ini
+++ b/variants/nrf52840/nano-g2-ultra/platformio.ini
@@ -4,8 +4,10 @@ extends = nrf52840_base
board = nano-g2-ultra
debug_tool = jlink
-build_flags = ${nrf52840_base.build_flags} -Ivariants/nano-g2-ultra -D NANO_G2_ULTRA
-build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nano-g2-ultra>
+build_flags = ${nrf52840_base.build_flags}
+ -I variants/nrf52840/nano-g2-ultra
+ -D NANO_G2_ULTRA
+build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/nano-g2-ultra>
lib_deps =
${nrf52840_base.lib_deps}
lewisxhe/PCF8563_Library@^1.0.1
diff --git a/variants/nano-g2-ultra/variant.cpp b/variants/nrf52840/nano-g2-ultra/variant.cpp
similarity index 100%
rename from variants/nano-g2-ultra/variant.cpp
rename to variants/nrf52840/nano-g2-ultra/variant.cpp
diff --git a/variants/nano-g2-ultra/variant.h b/variants/nrf52840/nano-g2-ultra/variant.h
similarity index 100%
rename from variants/nano-g2-ultra/variant.h
rename to variants/nrf52840/nano-g2-ultra/variant.h
diff --git a/variants/rak2560/platformio.ini b/variants/nrf52840/rak2560/platformio.ini
similarity index 87%
rename from variants/rak2560/platformio.ini
rename to variants/nrf52840/rak2560/platformio.ini
index 8a720ce5a..2b73aca03 100644
--- a/variants/rak2560/platformio.ini
+++ b/variants/nrf52840/rak2560/platformio.ini
@@ -3,13 +3,15 @@
extends = nrf52840_base
board = wiscore_rak4631
board_check = true
-build_flags = ${nrf52840_base.build_flags} -Ivariants/rak2560 -D RAK_4631
+build_flags = ${nrf52840_base.build_flags}
+ -I variants/nrf52840/rak2560
+ -D RAK_4631
-DGPS_POWER_TOGGLE ; comment this line to disable triple press function on the user button to turn off gps entirely.
-DRADIOLIB_EXCLUDE_SX128X=1
-DRADIOLIB_EXCLUDE_SX127X=1
-DRADIOLIB_EXCLUDE_LR11X0=1
-DHAS_RAKPROT=1 ; Define if RAk OneWireSerial is used (disables GPS)
-build_src_filter = ${nrf52_base.build_src_filter} +<../variants/rak2560> + +
+build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/rak2560> + +
lib_deps =
${nrf52840_base.lib_deps}
${networking_base.lib_deps}
diff --git a/variants/rak2560/variant.cpp b/variants/nrf52840/rak2560/variant.cpp
similarity index 100%
rename from variants/rak2560/variant.cpp
rename to variants/nrf52840/rak2560/variant.cpp
diff --git a/variants/rak2560/variant.h b/variants/nrf52840/rak2560/variant.h
similarity index 99%
rename from variants/rak2560/variant.h
rename to variants/nrf52840/rak2560/variant.h
index a03fc3933..f922e8a61 100644
--- a/variants/rak2560/variant.h
+++ b/variants/nrf52840/rak2560/variant.h
@@ -222,6 +222,7 @@ SO GPIO 39/TXEN MAY NOT BE DEFINED FOR SUCCESSFUL OPERATION OF THE SX1262 - TG
// #define PIN_GPS_EN PIN_3V3_EN
#define PIN_GPS_PPS (17) // Pulse per second input from the GPS
+#define GPS_SERIAL_PORT Serial2
// On RAK2560 the GPS is be on a different UART
// #define GPS_RX_PIN PIN_SERIAL2_RX
// #define GPS_TX_PIN PIN_SERIAL2_TX
diff --git a/variants/rak4631/platformio.ini b/variants/nrf52840/rak4631/platformio.ini
similarity index 94%
rename from variants/rak4631/platformio.ini
rename to variants/nrf52840/rak4631/platformio.ini
index ee134e87a..7b695779c 100644
--- a/variants/rak4631/platformio.ini
+++ b/variants/nrf52840/rak4631/platformio.ini
@@ -3,7 +3,9 @@
extends = nrf52840_base
board = wiscore_rak4631
board_check = true
-build_flags = ${nrf52840_base.build_flags} -Ivariants/rak4631 -D RAK_4631
+build_flags = ${nrf52840_base.build_flags}
+ -I variants/nrf52840/rak4631
+ -D RAK_4631
-DGPS_POWER_TOGGLE ; comment this line to disable triple press function on the user button to turn off gps entirely.
-DEINK_DISPLAY_MODEL=GxEPD2_213_BN
-DEINK_WIDTH=250
@@ -11,7 +13,7 @@ build_flags = ${nrf52840_base.build_flags} -Ivariants/rak4631 -D RAK_4631
-DRADIOLIB_EXCLUDE_SX128X=1
-DRADIOLIB_EXCLUDE_SX127X=1
-DRADIOLIB_EXCLUDE_LR11X0=1
-build_src_filter = ${nrf52_base.build_src_filter} +<../variants/rak4631> + + +
+build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/rak4631> + + +
lib_deps =
${nrf52840_base.lib_deps}
${networking_base.lib_deps}
diff --git a/variants/rak4631/variant.cpp b/variants/nrf52840/rak4631/variant.cpp
similarity index 100%
rename from variants/rak4631/variant.cpp
rename to variants/nrf52840/rak4631/variant.cpp
diff --git a/variants/rak4631/variant.h b/variants/nrf52840/rak4631/variant.h
similarity index 100%
rename from variants/rak4631/variant.h
rename to variants/nrf52840/rak4631/variant.h
diff --git a/variants/rak4631_epaper/platformio.ini b/variants/nrf52840/rak4631_epaper/platformio.ini
similarity index 86%
rename from variants/rak4631_epaper/platformio.ini
rename to variants/nrf52840/rak4631_epaper/platformio.ini
index 47e4451c7..704520f8d 100644
--- a/variants/rak4631_epaper/platformio.ini
+++ b/variants/nrf52840/rak4631_epaper/platformio.ini
@@ -2,14 +2,16 @@
[env:rak4631_eink]
extends = nrf52840_base
board = wiscore_rak4631
-build_flags = ${nrf52840_base.build_flags} -Ivariants/rak4631_epaper -D RAK_4631
+build_flags = ${nrf52840_base.build_flags}
+ -I variants/nrf52840/rak4631_epaper
+ -D RAK_4631
-DEINK_DISPLAY_MODEL=GxEPD2_213_BN
-DEINK_WIDTH=250
-DEINK_HEIGHT=122
-DRADIOLIB_EXCLUDE_SX128X=1
-DRADIOLIB_EXCLUDE_SX127X=1
-DRADIOLIB_EXCLUDE_LR11X0=1
-build_src_filter = ${nrf52_base.build_src_filter} +<../variants/rak4631_epaper>
+build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/rak4631_epaper>
lib_deps =
${nrf52840_base.lib_deps}
zinggjm/GxEPD2@^1.6.2
diff --git a/variants/rak4631_epaper/variant.cpp b/variants/nrf52840/rak4631_epaper/variant.cpp
similarity index 100%
rename from variants/rak4631_epaper/variant.cpp
rename to variants/nrf52840/rak4631_epaper/variant.cpp
diff --git a/variants/rak4631_epaper/variant.h b/variants/nrf52840/rak4631_epaper/variant.h
similarity index 100%
rename from variants/rak4631_epaper/variant.h
rename to variants/nrf52840/rak4631_epaper/variant.h
diff --git a/variants/rak4631_epaper_onrxtx/platformio.ini b/variants/nrf52840/rak4631_epaper_onrxtx/platformio.ini
similarity index 87%
rename from variants/rak4631_epaper_onrxtx/platformio.ini
rename to variants/nrf52840/rak4631_epaper_onrxtx/platformio.ini
index 52a13f2a7..e0156668b 100644
--- a/variants/rak4631_epaper_onrxtx/platformio.ini
+++ b/variants/nrf52840/rak4631_epaper_onrxtx/platformio.ini
@@ -3,7 +3,9 @@
board_level = extra
extends = nrf52840_base
board = wiscore_rak4631
-build_flags = ${nrf52840_base.build_flags} -Ivariants/rak4631_epaper -D RAK_4631
+build_flags = ${nrf52840_base.build_flags}
+ -I variants/nrf52840/rak4631_epaper
+ -D RAK_4631
-D PIN_EINK_EN=34
-D EINK_DISPLAY_MODEL=GxEPD2_213_BN
-D EINK_WIDTH=250
@@ -11,7 +13,7 @@ build_flags = ${nrf52840_base.build_flags} -Ivariants/rak4631_epaper -D RAK_4631
-D RADIOLIB_EXCLUDE_SX128X=1
-D RADIOLIB_EXCLUDE_SX127X=1
-D RADIOLIB_EXCLUDE_LR11X0=1
-build_src_filter = ${nrf52_base.build_src_filter} +<../variants/rak4631_epaper_onrxtx>
+build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/rak4631_epaper_onrxtx>
lib_deps =
${nrf52840_base.lib_deps}
zinggjm/GxEPD2@^1.6.2
diff --git a/variants/rak4631_epaper_onrxtx/variant.cpp b/variants/nrf52840/rak4631_epaper_onrxtx/variant.cpp
similarity index 100%
rename from variants/rak4631_epaper_onrxtx/variant.cpp
rename to variants/nrf52840/rak4631_epaper_onrxtx/variant.cpp
diff --git a/variants/rak4631_epaper_onrxtx/variant.h b/variants/nrf52840/rak4631_epaper_onrxtx/variant.h
similarity index 100%
rename from variants/rak4631_epaper_onrxtx/variant.h
rename to variants/nrf52840/rak4631_epaper_onrxtx/variant.h
diff --git a/variants/rak4631_eth_gw/platformio.ini b/variants/nrf52840/rak4631_eth_gw/platformio.ini
similarity index 94%
rename from variants/rak4631_eth_gw/platformio.ini
rename to variants/nrf52840/rak4631_eth_gw/platformio.ini
index 492ca374b..a1c1b4610 100644
--- a/variants/rak4631_eth_gw/platformio.ini
+++ b/variants/nrf52840/rak4631_eth_gw/platformio.ini
@@ -3,8 +3,11 @@
extends = nrf52840_base
board = wiscore_rak4631
board_check = true
-build_flags = ${nrf52840_base.build_flags} -Ivariants/rak4631_eth_gw -D RAK_4631
+build_flags = ${nrf52840_base.build_flags}
+ -I variants/nrf52840/rak4631_eth_gw
+ -D RAK_4631
-DGPS_POWER_TOGGLE ; comment this line to disable triple press function on the user button to turn off gps entirely.
+ -DHAS_UDP_MULTICAST=1
-DEINK_DISPLAY_MODEL=GxEPD2_213_BN
-DEINK_WIDTH=250
-DEINK_HEIGHT=122
@@ -21,7 +24,7 @@ build_flags = ${nrf52840_base.build_flags} -Ivariants/rak4631_eth_gw -D RAK_4631
-DMESHTASTIC_EXCLUDE_STOREFORWARD=1
-DMESHTASTIC_EXCLUDE_CANNEDMESSAGES=1
-DMESHTASTIC_EXCLUDE_WAYPOINT=1
-build_src_filter = ${nrf52_base.build_src_filter} +<../variants/rak4631_eth_gw> + + +
+build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/rak4631_eth_gw> + + +
lib_deps =
${nrf52840_base.lib_deps}
${networking_base.lib_deps}
diff --git a/variants/rak4631_eth_gw/variant.cpp b/variants/nrf52840/rak4631_eth_gw/variant.cpp
similarity index 100%
rename from variants/rak4631_eth_gw/variant.cpp
rename to variants/nrf52840/rak4631_eth_gw/variant.cpp
diff --git a/variants/rak4631_eth_gw/variant.h b/variants/nrf52840/rak4631_eth_gw/variant.h
similarity index 100%
rename from variants/rak4631_eth_gw/variant.h
rename to variants/nrf52840/rak4631_eth_gw/variant.h
diff --git a/variants/rak4631_nomadstar_meteor_pro/platformio.ini b/variants/nrf52840/rak4631_nomadstar_meteor_pro/platformio.ini
similarity index 89%
rename from variants/rak4631_nomadstar_meteor_pro/platformio.ini
rename to variants/nrf52840/rak4631_nomadstar_meteor_pro/platformio.ini
index d5fbe6a16..e94eef1ee 100644
--- a/variants/rak4631_nomadstar_meteor_pro/platformio.ini
+++ b/variants/nrf52840/rak4631_nomadstar_meteor_pro/platformio.ini
@@ -3,8 +3,9 @@
extends = nrf52840_base
board = wiscore_rak4631
board_check = true
-build_flags = ${nrf52840_base.build_flags} -Ivariants/rak4631_nomadstar_meteor_pro -D NOMADSTAR_METEOR_PRO
- -L "${platformio.libdeps_dir}/${this.__env__}/bsec2/src/cortex-m4/fpv4-sp-d16-hard"
+build_flags = ${nrf52840_base.build_flags}
+ -I variants/nrf52840/rak4631_nomadstar_meteor_pro
+ -D NOMADSTAR_METEOR_PRO
;-DGPS_POWER_TOGGLE ; comment this line to disable triple press function on the user button to turn off gps entirely.
-DEINK_DISPLAY_MODEL=GxEPD2_213_BN
-DEINK_WIDTH=250
@@ -12,8 +13,8 @@ build_flags = ${nrf52840_base.build_flags} -Ivariants/rak4631_nomadstar_meteor_p
-DRADIOLIB_EXCLUDE_SX128X=1
-DRADIOLIB_EXCLUDE_SX127X=1
-DRADIOLIB_EXCLUDE_LR11X0=1
-build_src_filter = ${nrf52_base.build_src_filter} +<../variants/rak4631_nomadstar_meteor_pro> + +
-lib_deps =
+build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/rak4631_nomadstar_meteor_pro> + +
+lib_deps =
${nrf52840_base.lib_deps}
https://github.com/NomadStar-outdoor/IOBoard-RGB-LP5562-Library.git#9c366c8
diff --git a/variants/rak4631_nomadstar_meteor_pro/variant.cpp b/variants/nrf52840/rak4631_nomadstar_meteor_pro/variant.cpp
similarity index 100%
rename from variants/rak4631_nomadstar_meteor_pro/variant.cpp
rename to variants/nrf52840/rak4631_nomadstar_meteor_pro/variant.cpp
diff --git a/variants/rak4631_nomadstar_meteor_pro/variant.h b/variants/nrf52840/rak4631_nomadstar_meteor_pro/variant.h
similarity index 100%
rename from variants/rak4631_nomadstar_meteor_pro/variant.h
rename to variants/nrf52840/rak4631_nomadstar_meteor_pro/variant.h
diff --git a/variants/nrf52840/rak_wismeshtag/platformio.ini b/variants/nrf52840/rak_wismeshtag/platformio.ini
new file mode 100644
index 000000000..08e723302
--- /dev/null
+++ b/variants/nrf52840/rak_wismeshtag/platformio.ini
@@ -0,0 +1,17 @@
+; The very slick RAK wireless RAK 4631 / 4630 board - Unified firmware for 5005/19003, with or without OLED RAK 1921
+[env:rak_wismeshtag]
+extends = nrf52840_base
+board = wiscore_rak4631
+board_check = true
+build_flags = ${nrf52840_base.build_flags}
+ -I variants/nrf52840/rak_wismeshtag
+ -D WISMESH_TAG
+ -D RAK_4631
+ -DGPS_POWER_TOGGLE ; comment this line to disable triple press function on the user button to turn off gps entirely.
+ -DRADIOLIB_EXCLUDE_SX128X=1
+ -DRADIOLIB_EXCLUDE_SX127X=1
+ -DRADIOLIB_EXCLUDE_LR11X0=1
+ -DMESHTASTIC_EXCLUDE_WIFI=1
+build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/rak_wismeshtag>
+lib_deps =
+ ${nrf52840_base.lib_deps}
\ No newline at end of file
diff --git a/variants/nrf52840/rak_wismeshtag/variant.cpp b/variants/nrf52840/rak_wismeshtag/variant.cpp
new file mode 100644
index 000000000..e84b60b3b
--- /dev/null
+++ b/variants/nrf52840/rak_wismeshtag/variant.cpp
@@ -0,0 +1,45 @@
+/*
+ Copyright (c) 2014-2015 Arduino LLC. All right reserved.
+ Copyright (c) 2016 Sandeep Mistry All right reserved.
+ Copyright (c) 2018, Adafruit Industries (adafruit.com)
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+*/
+
+#include "variant.h"
+#include "nrf.h"
+#include "wiring_constants.h"
+#include "wiring_digital.h"
+
+const uint32_t g_ADigitalPinMap[] = {
+ // P0
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
+
+ // P1
+ 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47};
+
+void initVariant()
+{
+ // LED1 & LED2
+ pinMode(PIN_LED1, OUTPUT);
+ ledOff(PIN_LED1);
+
+ pinMode(PIN_LED2, OUTPUT);
+ ledOff(PIN_LED2);
+
+ // 3V3 Power Rail
+ pinMode(PIN_3V3_EN, OUTPUT);
+ digitalWrite(PIN_3V3_EN, HIGH);
+}
diff --git a/variants/nrf52840/rak_wismeshtag/variant.h b/variants/nrf52840/rak_wismeshtag/variant.h
new file mode 100644
index 000000000..eba910dc1
--- /dev/null
+++ b/variants/nrf52840/rak_wismeshtag/variant.h
@@ -0,0 +1,244 @@
+/*
+ Copyright (c) 2014-2015 Arduino LLC. All right reserved.
+ Copyright (c) 2016 Sandeep Mistry All right reserved.
+ Copyright (c) 2018, Adafruit Industries (adafruit.com)
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU Lesser General Public License for more details.
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+*/
+
+#ifndef _VARIANT_RAK4630_
+#define _VARIANT_RAK4630_
+
+#define RAK4630
+
+/** Master clock frequency */
+#define VARIANT_MCK (64000000ul)
+
+#define USE_LFXO // Board uses 32khz crystal for LF
+// define USE_LFRC // Board uses RC for LF
+
+/*----------------------------------------------------------------------------
+ * Headers
+ *----------------------------------------------------------------------------*/
+
+#include "WVariant.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif // __cplusplus
+
+// Number of pins defined in PinDescription array
+#define PINS_COUNT (48)
+#define NUM_DIGITAL_PINS (48)
+#define NUM_ANALOG_INPUTS (6)
+#define NUM_ANALOG_OUTPUTS (0)
+
+// LEDs
+#define PIN_LED1 (35)
+#define PIN_LED2 (36)
+
+#define LED_BUILTIN PIN_LED1
+#define LED_CONN PIN_LED2
+
+#define LED_GREEN PIN_LED1
+#define LED_BLUE PIN_LED2
+
+#define LED_STATE_ON 1 // State when LED is litted
+
+/*
+ * Buttons
+ */
+
+#define PIN_BUTTON1 9 // Pin for button on E-ink button module or IO expansion
+#define BUTTON_NEED_PULLUP
+#define PIN_BUTTON2 12
+#define PIN_BUTTON3 24
+#define PIN_BUTTON4 25
+
+/*
+ * Analog pins
+ */
+#define PIN_A0 (5)
+#define PIN_A1 (31)
+#define PIN_A2 (28)
+#define PIN_A3 (29)
+#define PIN_A4 (30)
+#define PIN_A5 (31)
+#define PIN_A6 (0xff)
+#define PIN_A7 (0xff)
+
+static const uint8_t A0 = PIN_A0;
+static const uint8_t A1 = PIN_A1;
+static const uint8_t A2 = PIN_A2;
+static const uint8_t A3 = PIN_A3;
+static const uint8_t A4 = PIN_A4;
+static const uint8_t A5 = PIN_A5;
+static const uint8_t A6 = PIN_A6;
+static const uint8_t A7 = PIN_A7;
+#define ADC_RESOLUTION 14
+
+// Other pins
+#define PIN_AREF (2)
+#define PIN_NFC1 (9)
+#define PIN_NFC2 (10)
+
+static const uint8_t AREF = PIN_AREF;
+
+/*
+ * Serial interfaces
+ */
+#define PIN_SERIAL1_RX (15)
+#define PIN_SERIAL1_TX (16)
+
+// Connected to Jlink CDC
+#define PIN_SERIAL2_RX (8)
+#define PIN_SERIAL2_TX (6)
+
+/*
+ * SPI Interfaces
+ */
+#define SPI_INTERFACES_COUNT 2
+
+#define PIN_SPI_MISO (45)
+#define PIN_SPI_MOSI (44)
+#define PIN_SPI_SCK (43)
+
+#define PIN_SPI1_MISO (29) // (0 + 29)
+#define PIN_SPI1_MOSI (30) // (0 + 30)
+#define PIN_SPI1_SCK (3) // (0 + 3)
+
+static const uint8_t SS = 42;
+static const uint8_t MOSI = PIN_SPI_MOSI;
+static const uint8_t MISO = PIN_SPI_MISO;
+static const uint8_t SCK = PIN_SPI_SCK;
+
+/*
+ * eink display pins
+ */
+
+#define PIN_EINK_CS (0 + 26)
+#define PIN_EINK_BUSY (0 + 4)
+#define PIN_EINK_DC (0 + 17)
+#define PIN_EINK_RES (-1)
+#define PIN_EINK_SCLK (0 + 3)
+#define PIN_EINK_MOSI (0 + 30) // also called SDI
+
+/*
+ * Wire Interfaces
+ */
+#define WIRE_INTERFACES_COUNT 1
+
+// RAK WISMESHTAG
+#define PIN_WIRE_SDA (25)
+#define PIN_WIRE_SCL (24)
+
+// QSPI Pins
+#define PIN_QSPI_SCK 3
+#define PIN_QSPI_CS 26
+#define PIN_QSPI_IO0 30
+#define PIN_QSPI_IO1 29
+#define PIN_QSPI_IO2 28
+#define PIN_QSPI_IO3 2
+
+/* @note RAK5005-O GPIO mapping to RAK4631 GPIO ports
+ RAK5005-O <-> nRF52840
+ IO1 <-> P0.17 (Arduino GPIO number 17)
+ IO2 <-> P1.02 (Arduino GPIO number 34)
+ IO3 <-> P0.21 (Arduino GPIO number 21)
+ IO4 <-> P0.04 (Arduino GPIO number 4)
+ IO5 <-> P0.09 (Arduino GPIO number 9)
+ IO6 <-> P0.10 (Arduino GPIO number 10)
+ IO7 <-> P0.28 (Arduino GPIO number 28)
+ SW1 <-> P0.01 (Arduino GPIO number 1)
+ A0 <-> P0.04/AIN2 (Arduino Analog A2
+ A1 <-> P0.31/AIN7 (Arduino Analog A7
+ SPI_CS <-> P0.26 (Arduino GPIO number 26)
+ */
+
+// RAK4630 LoRa module
+
+/* Setup of the SX1262 LoRa module ( https://docs.rakwireless.com/Product-Categories/WisBlock/RAK4631/Datasheet/ )
+
+P1.10 NSS SPI NSS (Arduino GPIO number 42)
+P1.11 SCK SPI CLK (Arduino GPIO number 43)
+P1.12 MOSI SPI MOSI (Arduino GPIO number 44)
+P1.13 MISO SPI MISO (Arduino GPIO number 45)
+P1.14 BUSY BUSY signal (Arduino GPIO number 46)
+P1.15 DIO1 DIO1 event interrupt (Arduino GPIO number 47)
+P1.06 NRESET NRESET manual reset of the SX1262 (Arduino GPIO number 38)
+
+Important for successful SX1262 initialization:
+
+* Setup DIO2 to control the antenna switch
+* Setup DIO3 to control the TCXO power supply
+* Setup the SX1262 to use it's DCDC regulator and not the LDO
+* RAK4630 schematics show GPIO P1.07 connected to the antenna switch, but it should not be initialized, as DIO2 will do the
+control of the antenna switch
+
+SO GPIO 39/TXEN MAY NOT BE DEFINED FOR SUCCESSFUL OPERATION OF THE SX1262 - TG
+
+*/
+
+#define DETECTION_SENSOR_EN 4
+
+#define USE_SX1262
+#define SX126X_CS (42)
+#define SX126X_DIO1 (47)
+#define SX126X_BUSY (46)
+#define SX126X_RESET (38)
+// #define SX126X_TXEN (39)
+// #define SX126X_RXEN (37)
+#define SX126X_POWER_EN (37)
+// DIO2 controlls an antenna switch and the TCXO voltage is controlled by DIO3
+#define SX126X_DIO2_AS_RF_SWITCH
+#define SX126X_DIO3_TCXO_VOLTAGE 1.8
+
+// Testing USB detection
+#define NRF_APM
+
+// enables 3.3V periphery like GPS or IO Module
+// Do not toggle this for GPS power savings
+#define PIN_3V3_EN (34)
+
+// RAK WISMESHTAG
+#define PIN_GPS_EN PIN_3V3_EN
+#define PIN_GPS_PPS (17) // Pulse per second input from the GPS
+
+#define GPS_RX_PIN PIN_SERIAL1_RX
+#define GPS_TX_PIN PIN_SERIAL1_TX
+
+// RAK WISMESHTAG
+#define PIN_BUZZER 21
+
+// Battery
+// The battery sense is hooked to pin A0 (5)
+#define BATTERY_PIN PIN_A0
+// and has 12 bit resolution
+#define BATTERY_SENSE_RESOLUTION_BITS 12
+#define BATTERY_SENSE_RESOLUTION 4096.0
+#undef AREF_VOLTAGE
+#define AREF_VOLTAGE 3.0
+#define VBAT_AR_INTERNAL AR_INTERNAL_3_0
+#define ADC_MULTIPLIER 1.73
+
+#define RAK_4631 1
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+ * Arduino objects - C++ only
+ *----------------------------------------------------------------------------*/
+
+#endif
\ No newline at end of file
diff --git a/variants/rak_wismeshtap/platformio.ini b/variants/nrf52840/rak_wismeshtap/platformio.ini
similarity index 87%
rename from variants/rak_wismeshtap/platformio.ini
rename to variants/nrf52840/rak_wismeshtap/platformio.ini
index bfb3ea927..f6ee8fd23 100644
--- a/variants/rak_wismeshtap/platformio.ini
+++ b/variants/nrf52840/rak_wismeshtap/platformio.ini
@@ -2,7 +2,10 @@
[env:rak_wismeshtap]
extends = nrf52840_base
board = wiscore_rak4631
-build_flags = ${nrf52840_base.build_flags} -Ivariants/rak_wismeshtap -DWISMESH_TAP -DRAK_4631
+build_flags = ${nrf52840_base.build_flags}
+ -Ivariants/nrf52840/rak_wismeshtap
+ -DWISMESH_TAP
+ -DRAK_4631
-DGPS_POWER_TOGGLE ; comment this line to disable triple press function on the user button to turn off gps entirely.
-DEINK_DISPLAY_MODEL=GxEPD2_213_BN
-DEINK_WIDTH=250
@@ -12,7 +15,7 @@ build_flags = ${nrf52840_base.build_flags} -Ivariants/rak_wismeshtap -DWISMESH_T
-DMESHTASTIC_EXCLUDE_STOREFORWARD=1
-DMESHTASTIC_EXCLUDE_POWER_TELEMETRY=1
-DMESHTASTIC_EXCLUDE_ATAK=1
-build_src_filter = ${nrf52_base.build_src_filter} +<../variants/rak_wismeshtap> + + +
+build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/rak_wismeshtap> + + +
lib_deps =
${nrf52840_base.lib_deps}
${networking_base.lib_deps}
diff --git a/variants/rak_wismeshtap/variant.cpp b/variants/nrf52840/rak_wismeshtap/variant.cpp
similarity index 100%
rename from variants/rak_wismeshtap/variant.cpp
rename to variants/nrf52840/rak_wismeshtap/variant.cpp
diff --git a/variants/rak_wismeshtap/variant.h b/variants/nrf52840/rak_wismeshtap/variant.h
similarity index 100%
rename from variants/rak_wismeshtap/variant.h
rename to variants/nrf52840/rak_wismeshtap/variant.h
diff --git a/variants/seeed_solar_node/platformio.ini b/variants/nrf52840/seeed_solar_node/platformio.ini
similarity index 70%
rename from variants/seeed_solar_node/platformio.ini
rename to variants/nrf52840/seeed_solar_node/platformio.ini
index eb91a435f..b2a128c57 100644
--- a/variants/seeed_solar_node/platformio.ini
+++ b/variants/nrf52840/seeed_solar_node/platformio.ini
@@ -3,11 +3,12 @@ board = seeed_solar_node
extends = nrf52840_base
;board_level = extra
build_flags = ${nrf52840_base.build_flags}
- -I $PROJECT_DIR/variants/seeed_solar_node
+ -I variants/nrf52840/seeed_solar_node
-D SEEED_SOLAR_NODE
- -Isrc/platform/nrf52/softdevice -Isrc/platform/nrf52/softdevice/nrf52
+ -I src/platform/nrf52/softdevice
+ -I src/platform/nrf52/softdevice/nrf52
board_build.ldscript = src/platform/nrf52/nrf52840_s140_v7.ld
-build_src_filter = ${nrf52_base.build_src_filter} +<../variants/seeed_solar_node>
+build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/seeed_solar_node>
lib_deps =
${nrf52840_base.lib_deps}
debug_tool = jlink
diff --git a/variants/seeed_solar_node/variant.cpp b/variants/nrf52840/seeed_solar_node/variant.cpp
similarity index 100%
rename from variants/seeed_solar_node/variant.cpp
rename to variants/nrf52840/seeed_solar_node/variant.cpp
diff --git a/variants/seeed_solar_node/variant.h b/variants/nrf52840/seeed_solar_node/variant.h
similarity index 100%
rename from variants/seeed_solar_node/variant.h
rename to variants/nrf52840/seeed_solar_node/variant.h
diff --git a/variants/seeed_wio_tracker_L1/platformio.ini b/variants/nrf52840/seeed_wio_tracker_L1/platformio.ini
similarity index 61%
rename from variants/seeed_wio_tracker_L1/platformio.ini
rename to variants/nrf52840/seeed_wio_tracker_L1/platformio.ini
index 3c4653d7e..6c137384d 100644
--- a/variants/seeed_wio_tracker_L1/platformio.ini
+++ b/variants/nrf52840/seeed_wio_tracker_L1/platformio.ini
@@ -1,13 +1,13 @@
[env:seeed_wio_tracker_L1]
board = seeed_wio_tracker_L1
extends = nrf52840_base
-;board_level = extra
build_flags = ${nrf52840_base.build_flags}
- -I $PROJECT_DIR/variants/seeed_wio_tracker_L1
- -D SEEED_WIO_TRACKER_L1
- -Isrc/platform/nrf52/softdevice -Isrc/platform/nrf52/softdevice/nrf52
+ -I variants/nrf52840/seeed_wio_tracker_L1
+ -D SEEED_WIO_TRACKER_L1
+ -I src/platform/nrf52/softdevice
+ -I src/platform/nrf52/softdevice/nrf52
board_build.ldscript = src/platform/nrf52/nrf52840_s140_v7.ld
-build_src_filter = ${nrf52_base.build_src_filter} +<../variants/seeed_wio_tracker_L1>
+build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/seeed_wio_tracker_L1>
lib_deps =
${nrf52840_base.lib_deps}
debug_tool = jlink
diff --git a/variants/seeed_wio_tracker_L1/variant.cpp b/variants/nrf52840/seeed_wio_tracker_L1/variant.cpp
similarity index 100%
rename from variants/seeed_wio_tracker_L1/variant.cpp
rename to variants/nrf52840/seeed_wio_tracker_L1/variant.cpp
diff --git a/variants/seeed_wio_tracker_L1/variant.h b/variants/nrf52840/seeed_wio_tracker_L1/variant.h
similarity index 100%
rename from variants/seeed_wio_tracker_L1/variant.h
rename to variants/nrf52840/seeed_wio_tracker_L1/variant.h
diff --git a/variants/seeed_wio_tracker_L1_eink/nicheGraphics.h b/variants/nrf52840/seeed_wio_tracker_L1_eink/nicheGraphics.h
similarity index 100%
rename from variants/seeed_wio_tracker_L1_eink/nicheGraphics.h
rename to variants/nrf52840/seeed_wio_tracker_L1_eink/nicheGraphics.h
diff --git a/variants/seeed_wio_tracker_L1_eink/platformio.ini b/variants/nrf52840/seeed_wio_tracker_L1_eink/platformio.ini
similarity index 50%
rename from variants/seeed_wio_tracker_L1_eink/platformio.ini
rename to variants/nrf52840/seeed_wio_tracker_L1_eink/platformio.ini
index b84757b9d..52ff39d49 100644
--- a/variants/seeed_wio_tracker_L1_eink/platformio.ini
+++ b/variants/nrf52840/seeed_wio_tracker_L1_eink/platformio.ini
@@ -2,12 +2,15 @@
board = seeed_wio_tracker_L1
extends = nrf52840_base, inkhud
;board_level = extra
-build_flags = ${nrf52840_base.build_flags} ${inkhud.build_flags}
- -I $PROJECT_DIR/variants/seeed_wio_tracker_L1_eink
- -D SEEED_WIO_TRACKER_L1
- -Isrc/platform/nrf52/softdevice -Isrc/platform/nrf52/softdevice/nrf52
+build_flags = ${nrf52840_base.build_flags}
+ ${inkhud.build_flags}
+ -I variants/nrf52840/seeed_wio_tracker_L1_eink
+ -D SEEED_WIO_TRACKER_L1_EINK
+ -D SEEED_WIO_TRACKER_L1
+ -I src/platform/nrf52/softdevice
+ -I src/platform/nrf52/softdevice/nrf52
board_build.ldscript = src/platform/nrf52/nrf52840_s140_v7.ld
-build_src_filter = ${nrf52_base.build_src_filter} +<../variants/seeed_wio_tracker_L1_eink> ${inkhud.build_src_filter}
+build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/seeed_wio_tracker_L1_eink> ${inkhud.build_src_filter}
lib_deps =
${inkhud.lib_deps}
${nrf52840_base.lib_deps}
diff --git a/variants/seeed_wio_tracker_L1_eink/variant.cpp b/variants/nrf52840/seeed_wio_tracker_L1_eink/variant.cpp
similarity index 100%
rename from variants/seeed_wio_tracker_L1_eink/variant.cpp
rename to variants/nrf52840/seeed_wio_tracker_L1_eink/variant.cpp
diff --git a/variants/seeed_wio_tracker_L1_eink/variant.h b/variants/nrf52840/seeed_wio_tracker_L1_eink/variant.h
similarity index 100%
rename from variants/seeed_wio_tracker_L1_eink/variant.h
rename to variants/nrf52840/seeed_wio_tracker_L1_eink/variant.h
diff --git a/variants/seeed_xiao_nrf52840_kit/platformio.ini b/variants/nrf52840/seeed_xiao_nrf52840_kit/platformio.ini
similarity index 66%
rename from variants/seeed_xiao_nrf52840_kit/platformio.ini
rename to variants/nrf52840/seeed_xiao_nrf52840_kit/platformio.ini
index 0e1e94cd5..27352875d 100644
--- a/variants/seeed_xiao_nrf52840_kit/platformio.ini
+++ b/variants/nrf52840/seeed_xiao_nrf52840_kit/platformio.ini
@@ -2,9 +2,14 @@
[env:seeed_xiao_nrf52840_kit]
extends = nrf52840_base
board = xiao_ble_sense
-build_flags = ${nrf52840_base.build_flags} -Ivariants/seeed_xiao_nrf52840_kit -Isrc/platform/nrf52/softdevice -Isrc/platform/nrf52/softdevice/nrf52 -DSEEED_XIAO_NRF52840_KIT -DGPS_L76K
+build_flags = ${nrf52840_base.build_flags}
+ -Ivariants/nrf52840/seeed_xiao_nrf52840_kit
+ -Isrc/platform/nrf52/softdevice
+ -Isrc/platform/nrf52/softdevice/nrf52
+ -DSEEED_XIAO_NRF52840_KIT
+ -DGPS_L76K
board_build.ldscript = src/platform/nrf52/nrf52840_s140_v7.ld
-build_src_filter = ${nrf52_base.build_src_filter} +<../variants/seeed_xiao_nrf52840_kit>
+build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/seeed_xiao_nrf52840_kit>
lib_deps =
${nrf52840_base.lib_deps}
debug_tool = jlink
diff --git a/variants/seeed_xiao_nrf52840_kit/variant.cpp b/variants/nrf52840/seeed_xiao_nrf52840_kit/variant.cpp
similarity index 100%
rename from variants/seeed_xiao_nrf52840_kit/variant.cpp
rename to variants/nrf52840/seeed_xiao_nrf52840_kit/variant.cpp
diff --git a/variants/seeed_xiao_nrf52840_kit/variant.h b/variants/nrf52840/seeed_xiao_nrf52840_kit/variant.h
similarity index 100%
rename from variants/seeed_xiao_nrf52840_kit/variant.h
rename to variants/nrf52840/seeed_xiao_nrf52840_kit/variant.h
diff --git a/variants/t-echo/nicheGraphics.h b/variants/nrf52840/t-echo/nicheGraphics.h
similarity index 100%
rename from variants/t-echo/nicheGraphics.h
rename to variants/nrf52840/t-echo/nicheGraphics.h
diff --git a/variants/t-echo/platformio.ini b/variants/nrf52840/t-echo/platformio.ini
similarity index 89%
rename from variants/t-echo/platformio.ini
rename to variants/nrf52840/t-echo/platformio.ini
index 85c3b5799..b80958d5d 100644
--- a/variants/t-echo/platformio.ini
+++ b/variants/nrf52840/t-echo/platformio.ini
@@ -6,7 +6,8 @@ board_check = true
debug_tool = jlink
# add -DCFG_SYSVIEW if you want to use the Segger systemview tool for OS profiling.
-build_flags = ${nrf52840_base.build_flags} -Ivariants/t-echo
+build_flags = ${nrf52840_base.build_flags}
+ -Ivariants/nrf52840/t-echo
-DGPS_POWER_TOGGLE
-DEINK_DISPLAY_MODEL=GxEPD2_154_D67
-DEINK_WIDTH=200
@@ -16,7 +17,7 @@ build_flags = ${nrf52840_base.build_flags} -Ivariants/t-echo
-DEINK_LIMIT_FASTREFRESH=20 ; How many consecutive fast-refreshes are permitted
-DEINK_BACKGROUND_USES_FAST ; (Optional) Use FAST refresh for both BACKGROUND and RESPONSIVE, until a limit is reached.
-build_src_filter = ${nrf52_base.build_src_filter} +<../variants/t-echo>
+build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/t-echo>
lib_deps =
${nrf52840_base.lib_deps}
https://github.com/meshtastic/GxEPD2/archive/55f618961db45a23eff0233546430f1e5a80f63a.zip
@@ -31,11 +32,11 @@ debug_tool = jlink
build_flags =
${nrf52840_base.build_flags}
${inkhud.build_flags}
- -I variants/t-echo
+ -I variants/nrf52840/t-echo
build_src_filter =
${nrf52_base.build_src_filter}
${inkhud.build_src_filter}
- +<../variants/t-echo>
+ +<../variants/nrf52840/t-echo>
lib_deps =
${inkhud.lib_deps} ; InkHUD libs first, so we get GFXRoot instead of AdafruitGFX
${nrf52840_base.lib_deps}
diff --git a/variants/t-echo/variant.cpp b/variants/nrf52840/t-echo/variant.cpp
similarity index 100%
rename from variants/t-echo/variant.cpp
rename to variants/nrf52840/t-echo/variant.cpp
diff --git a/variants/t-echo/variant.h b/variants/nrf52840/t-echo/variant.h
similarity index 100%
rename from variants/t-echo/variant.h
rename to variants/nrf52840/t-echo/variant.h
diff --git a/variants/tracker-t1000-e/platformio.ini b/variants/nrf52840/tracker-t1000-e/platformio.ini
similarity index 78%
rename from variants/tracker-t1000-e/platformio.ini
rename to variants/nrf52840/tracker-t1000-e/platformio.ini
index b1f11d524..45c8c5d00 100644
--- a/variants/tracker-t1000-e/platformio.ini
+++ b/variants/nrf52840/tracker-t1000-e/platformio.ini
@@ -1,7 +1,11 @@
[env:tracker-t1000-e]
extends = nrf52840_base
board = tracker-t1000-e
-build_flags = ${nrf52840_base.build_flags} -Ivariants/tracker-t1000-e -Isrc/platform/nrf52/softdevice -Isrc/platform/nrf52/softdevice/nrf52 -DTRACKER_T1000_E
+build_flags = ${nrf52840_base.build_flags}
+ -Ivariants/nrf52840/tracker-t1000-e
+ -Isrc/platform/nrf52/softdevice
+ -Isrc/platform/nrf52/softdevice/nrf52
+ -DTRACKER_T1000_E
-DGPS_POWER_TOGGLE
-DMESHTASTIC_EXCLUDE_ENVIRONMENTAL_SENSOR_EXTERNAL=1
-DMESHTASTIC_EXCLUDE_CANNEDMESSAGES=1
@@ -9,7 +13,7 @@ build_flags = ${nrf52840_base.build_flags} -Ivariants/tracker-t1000-e -Isrc/plat
-DMESHTASTIC_EXCLUDE_DETECTIONSENSOR=1
-DMESHTASTIC_EXCLUDE_WIFI=1
board_build.ldscript = src/platform/nrf52/nrf52840_s140_v7.ld
-build_src_filter = ${nrf52_base.build_src_filter} +<../variants/tracker-t1000-e>
+build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/tracker-t1000-e>
lib_deps =
${nrf52840_base.lib_deps}
https://github.com/meshtastic/QMA6100P_Arduino_Library/archive/14c900b8b2e4feaac5007a7e41e0c1b7f0841136.zip
diff --git a/variants/tracker-t1000-e/rfswitch.h b/variants/nrf52840/tracker-t1000-e/rfswitch.h
similarity index 100%
rename from variants/tracker-t1000-e/rfswitch.h
rename to variants/nrf52840/tracker-t1000-e/rfswitch.h
diff --git a/variants/tracker-t1000-e/variant.cpp b/variants/nrf52840/tracker-t1000-e/variant.cpp
similarity index 100%
rename from variants/tracker-t1000-e/variant.cpp
rename to variants/nrf52840/tracker-t1000-e/variant.cpp
diff --git a/variants/tracker-t1000-e/variant.h b/variants/nrf52840/tracker-t1000-e/variant.h
similarity index 100%
rename from variants/tracker-t1000-e/variant.h
rename to variants/nrf52840/tracker-t1000-e/variant.h
diff --git a/variants/wio-sdk-wm1110/platformio.ini b/variants/nrf52840/wio-sdk-wm1110/platformio.ini
similarity index 80%
rename from variants/wio-sdk-wm1110/platformio.ini
rename to variants/nrf52840/wio-sdk-wm1110/platformio.ini
index 4e1415678..2c65246b8 100644
--- a/variants/wio-sdk-wm1110/platformio.ini
+++ b/variants/nrf52840/wio-sdk-wm1110/platformio.ini
@@ -4,16 +4,20 @@ extends = nrf52840_base
board = wio-sdk-wm1110
extra_scripts =
- bin/platformio-custom.py
+ ${env.extra_scripts}
extra_scripts/disable_adafruit_usb.py
# Remove adafruit USB serial from the build (it is incompatible with using the ch340 serial chip on this board)
build_unflags = ${nrf52840_base:build_unflags} -DUSBCON -DUSE_TINYUSB
-build_flags = ${nrf52840_base.build_flags} -Ivariants/wio-sdk-wm1110 -Isrc/platform/nrf52/softdevice -Isrc/platform/nrf52/softdevice/nrf52 -DWIO_WM1110
+build_flags = ${nrf52840_base.build_flags}
+ -Ivariants/nrf52840/wio-sdk-wm1110
+ -Isrc/platform/nrf52/softdevice
+ -Isrc/platform/nrf52/softdevice/nrf52
+ -DWIO_WM1110
-DGPS_POWER_TOGGLE ; comment this line to disable triple press function on the user button to turn off gps entirely.
-DCFG_TUD_CDC=0
board_build.ldscript = src/platform/nrf52/nrf52840_s140_v7.ld
-build_src_filter = ${nrf52_base.build_src_filter} +<../variants/wio-sdk-wm1110>
+build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/wio-sdk-wm1110>
;debug_tool = jlink
debug_tool = stlink
diff --git a/variants/wio-sdk-wm1110/rfswitch.h b/variants/nrf52840/wio-sdk-wm1110/rfswitch.h
similarity index 100%
rename from variants/wio-sdk-wm1110/rfswitch.h
rename to variants/nrf52840/wio-sdk-wm1110/rfswitch.h
diff --git a/variants/wio-sdk-wm1110/variant.cpp b/variants/nrf52840/wio-sdk-wm1110/variant.cpp
similarity index 100%
rename from variants/wio-sdk-wm1110/variant.cpp
rename to variants/nrf52840/wio-sdk-wm1110/variant.cpp
diff --git a/variants/wio-sdk-wm1110/variant.h b/variants/nrf52840/wio-sdk-wm1110/variant.h
similarity index 100%
rename from variants/wio-sdk-wm1110/variant.h
rename to variants/nrf52840/wio-sdk-wm1110/variant.h
diff --git a/variants/wio-t1000-s/platformio.ini b/variants/nrf52840/wio-t1000-s/platformio.ini
similarity index 77%
rename from variants/wio-t1000-s/platformio.ini
rename to variants/nrf52840/wio-t1000-s/platformio.ini
index 2eab1e1c5..3594bcf07 100644
--- a/variants/wio-t1000-s/platformio.ini
+++ b/variants/nrf52840/wio-t1000-s/platformio.ini
@@ -3,10 +3,14 @@
extends = nrf52840_base
board = wio-t1000-s
board_level = extra
-build_flags = ${nrf52840_base.build_flags} -Ivariants/wio-t1000-s -Isrc/platform/nrf52/softdevice -Isrc/platform/nrf52/softdevice/nrf52 -DWIO_WM1110
+build_flags = ${nrf52840_base.build_flags}
+ -Ivariants/nrf52840/wio-t1000-s
+ -Isrc/platform/nrf52/softdevice
+ -Isrc/platform/nrf52/softdevice/nrf52
+ -DWIO_WM1110
-DGPS_POWER_TOGGLE ; comment this line to disable triple press function on the user button to turn off gps entirely.
board_build.ldscript = src/platform/nrf52/nrf52840_s140_v7.ld
-build_src_filter = ${nrf52_base.build_src_filter} +<../variants/wio-t1000-s>
+build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/wio-t1000-s>
lib_deps =
${nrf52840_base.lib_deps}
debug_tool = jlink
diff --git a/variants/wio-t1000-s/rfswitch.h b/variants/nrf52840/wio-t1000-s/rfswitch.h
similarity index 100%
rename from variants/wio-t1000-s/rfswitch.h
rename to variants/nrf52840/wio-t1000-s/rfswitch.h
diff --git a/variants/wio-t1000-s/variant.cpp b/variants/nrf52840/wio-t1000-s/variant.cpp
similarity index 100%
rename from variants/wio-t1000-s/variant.cpp
rename to variants/nrf52840/wio-t1000-s/variant.cpp
diff --git a/variants/wio-t1000-s/variant.h b/variants/nrf52840/wio-t1000-s/variant.h
similarity index 100%
rename from variants/wio-t1000-s/variant.h
rename to variants/nrf52840/wio-t1000-s/variant.h
diff --git a/variants/wio-tracker-wm1110/platformio.ini b/variants/nrf52840/wio-tracker-wm1110/platformio.ini
similarity index 73%
rename from variants/wio-tracker-wm1110/platformio.ini
rename to variants/nrf52840/wio-tracker-wm1110/platformio.ini
index a6960b435..b383043bb 100644
--- a/variants/wio-tracker-wm1110/platformio.ini
+++ b/variants/nrf52840/wio-tracker-wm1110/platformio.ini
@@ -2,10 +2,14 @@
[env:wio-tracker-wm1110]
extends = nrf52840_base
board = wio-tracker-wm1110
-build_flags = ${nrf52840_base.build_flags} -Ivariants/wio-tracker-wm1110 -Isrc/platform/nrf52/softdevice -Isrc/platform/nrf52/softdevice/nrf52 -DWIO_WM1110
+build_flags = ${nrf52840_base.build_flags}
+ -Ivariants/nrf52840/wio-tracker-wm1110
+ -Isrc/platform/nrf52/softdevice
+ -Isrc/platform/nrf52/softdevice/nrf52
+ -DWIO_WM1110
-DGPS_POWER_TOGGLE ; comment this line to disable triple press function on the user button to turn off gps entirely.
board_build.ldscript = src/platform/nrf52/nrf52840_s140_v7.ld
-build_src_filter = ${nrf52_base.build_src_filter} +<../variants/wio-tracker-wm1110>
+build_src_filter = ${nrf52_base.build_src_filter} +<../variants/nrf52840/wio-tracker-wm1110>
lib_deps =
${nrf52840_base.lib_deps}
; If not set we will default to uploading over serial (first it forces bootloader entry by talking 1200bps to cdcacm)
diff --git a/variants/wio-tracker-wm1110/rfswitch.h b/variants/nrf52840/wio-tracker-wm1110/rfswitch.h
similarity index 100%
rename from variants/wio-tracker-wm1110/rfswitch.h
rename to variants/nrf52840/wio-tracker-wm1110/rfswitch.h
diff --git a/variants/wio-tracker-wm1110/variant.cpp b/variants/nrf52840/wio-tracker-wm1110/variant.cpp
similarity index 100%
rename from variants/wio-tracker-wm1110/variant.cpp
rename to variants/nrf52840/wio-tracker-wm1110/variant.cpp
diff --git a/variants/wio-tracker-wm1110/variant.h b/variants/nrf52840/wio-tracker-wm1110/variant.h
similarity index 100%
rename from variants/wio-tracker-wm1110/variant.h
rename to variants/nrf52840/wio-tracker-wm1110/variant.h
diff --git a/variants/ec_catsniffer/platformio.ini b/variants/rp2040/ec_catsniffer/platformio.ini
similarity index 50%
rename from variants/ec_catsniffer/platformio.ini
rename to variants/rp2040/ec_catsniffer/platformio.ini
index 6db9abe90..acf19d757 100644
--- a/variants/ec_catsniffer/platformio.ini
+++ b/variants/rp2040/ec_catsniffer/platformio.ini
@@ -2,13 +2,13 @@
extends = rp2040_base
board = rpipico
upload_protocol = picotool
-
-build_flags = ${rp2040_base.build_flags}
- -DRPI_PICO
- -Ivariants/ec_catsniffer
- -DDEBUG_RP2040_PORT=Serial
- # -DHW_SPI1_DEVICE
+build_flags =
+ ${rp2040_base.build_flags}
+ -D RPI_PICO
+ -I variants/rp2040/ec_catsniffer
+ -D DEBUG_RP2040_PORT=Serial
+ ; -D HW_SPI1_DEVICE
lib_deps =
${rp2040_base.lib_deps}
debug_build_flags = ${rp2040_base.build_flags}, -g
-debug_tool = cmsis-dap
\ No newline at end of file
+debug_tool = cmsis-dap
diff --git a/variants/ec_catsniffer/variant.cpp b/variants/rp2040/ec_catsniffer/variant.cpp
similarity index 100%
rename from variants/ec_catsniffer/variant.cpp
rename to variants/rp2040/ec_catsniffer/variant.cpp
diff --git a/variants/ec_catsniffer/variant.h b/variants/rp2040/ec_catsniffer/variant.h
similarity index 100%
rename from variants/ec_catsniffer/variant.h
rename to variants/rp2040/ec_catsniffer/variant.h
diff --git a/variants/feather_rp2040_rfm95/platformio.ini b/variants/rp2040/feather_rp2040_rfm95/platformio.ini
similarity index 53%
rename from variants/feather_rp2040_rfm95/platformio.ini
rename to variants/rp2040/feather_rp2040_rfm95/platformio.ini
index db1eb4f02..ef4118cb0 100644
--- a/variants/feather_rp2040_rfm95/platformio.ini
+++ b/variants/rp2040/feather_rp2040_rfm95/platformio.ini
@@ -2,14 +2,14 @@
extends = rp2040_base
board = adafruit_feather
upload_protocol = picotool
-
# add our variants files to the include and src paths
-build_flags = ${rp2040_base.build_flags}
- -DRP2040_FEATHER_RFM95
- -Ivariants/feather_rp2040_rfm95
- -DDEBUG_RP2040_PORT=Serial
- -DHW_SPI1_DEVICE
+build_flags =
+ ${rp2040_base.build_flags}
+ -D RP2040_FEATHER_RFM95
+ -I variants/rp2040/feather_rp2040_rfm95
+ -D DEBUG_RP2040_PORT=Serial
+ -D HW_SPI1_DEVICE
lib_deps =
${rp2040_base.lib_deps}
debug_build_flags = ${rp2040_base.build_flags}
-debug_tool = cmsis-dap ; for e.g. Picotool
\ No newline at end of file
+debug_tool = cmsis-dap ; for e.g. Picotool
diff --git a/variants/feather_rp2040_rfm95/variant.h b/variants/rp2040/feather_rp2040_rfm95/variant.h
similarity index 100%
rename from variants/feather_rp2040_rfm95/variant.h
rename to variants/rp2040/feather_rp2040_rfm95/variant.h
diff --git a/variants/nibble_rp2040/platformio.ini b/variants/rp2040/nibble_rp2040/platformio.ini
similarity index 56%
rename from variants/nibble_rp2040/platformio.ini
rename to variants/rp2040/nibble_rp2040/platformio.ini
index c3a1923c5..024a72206 100644
--- a/variants/nibble_rp2040/platformio.ini
+++ b/variants/rp2040/nibble_rp2040/platformio.ini
@@ -3,14 +3,14 @@ extends = rp2040_base
board = rpipico
board_level = extra
upload_protocol = picotool
-
# add our variants files to the include and src paths
-build_flags = ${rp2040_base.build_flags}
- -DPRIVATE_HW
- -Ivariants/nibble_rp2040
- -DDEBUG_RP2040_PORT=Serial
- -DHW_SPI1_DEVICE
+build_flags =
+ ${rp2040_base.build_flags}
+ -D PRIVATE_HW
+ -I variants/rp2040/nibble_rp2040
+ -D DEBUG_RP2040_PORT=Serial
+ -D HW_SPI1_DEVICE
lib_deps =
${rp2040_base.lib_deps}
debug_build_flags = ${rp2040_base.build_flags}, -g
-debug_tool = cmsis-dap ; for e.g. Picotool
\ No newline at end of file
+debug_tool = cmsis-dap ; for e.g. Picotool
diff --git a/variants/nibble_rp2040/variant.h b/variants/rp2040/nibble_rp2040/variant.h
similarity index 100%
rename from variants/nibble_rp2040/variant.h
rename to variants/rp2040/nibble_rp2040/variant.h
diff --git a/variants/rak11310/pins_arduino.h b/variants/rp2040/rak11310/pins_arduino.h
similarity index 100%
rename from variants/rak11310/pins_arduino.h
rename to variants/rp2040/rak11310/pins_arduino.h
diff --git a/variants/rak11310/platformio.ini b/variants/rp2040/rak11310/platformio.ini
similarity index 64%
rename from variants/rak11310/platformio.ini
rename to variants/rp2040/rak11310/platformio.ini
index fd7e842cc..aca24656b 100644
--- a/variants/rak11310/platformio.ini
+++ b/variants/rp2040/rak11310/platformio.ini
@@ -2,18 +2,18 @@
extends = rp2040_base
board = rakwireless_rak11300
upload_protocol = picotool
-
# add our variants files to the include and src paths
-build_flags = ${rp2040_base.build_flags}
- -DRAK11310
- -Ivariants/rak11310
- -DDEBUG_RP2040_PORT=Serial
- -DRV3028_RTC=0x52
-build_src_filter = ${rp2040_base.build_src_filter} +<../variants/rak11310> + + +
+build_flags =
+ ${rp2040_base.build_flags}
+ -D RAK11310
+ -I variants/rp2040/rak11310
+ -D DEBUG_RP2040_PORT=Serial
+ -D RV3028_RTC=0x52
+build_src_filter = ${rp2040_base.build_src_filter} +<../variants/rp2040/rak11310> + + +
lib_deps =
${rp2040_base.lib_deps}
${networking_base.lib_deps}
melopero/Melopero RV3028@^1.1.0
https://github.com/RAKWireless/RAK13800-W5100S/archive/1.0.2.zip
debug_build_flags = ${rp2040_base.build_flags}, -g
-debug_tool = cmsis-dap ; for e.g. Picotool
\ No newline at end of file
+debug_tool = cmsis-dap ; for e.g. Picotool
diff --git a/variants/rak11310/variant.h b/variants/rp2040/rak11310/variant.h
similarity index 100%
rename from variants/rak11310/variant.h
rename to variants/rp2040/rak11310/variant.h
diff --git a/variants/rp2040-lora/platformio.ini b/variants/rp2040/rp2040-lora/platformio.ini
similarity index 54%
rename from variants/rp2040-lora/platformio.ini
rename to variants/rp2040/rp2040-lora/platformio.ini
index 7ac5b2cac..d59e74f20 100644
--- a/variants/rp2040-lora/platformio.ini
+++ b/variants/rp2040/rp2040-lora/platformio.ini
@@ -2,14 +2,14 @@
extends = rp2040_base
board = rpipico
upload_protocol = picotool
-
# add our variants files to the include and src paths
-build_flags = ${rp2040_base.build_flags}
- -DRP2040_LORA
- -Ivariants/rp2040-lora
- -DDEBUG_RP2040_PORT=Serial
- -DHW_SPI1_DEVICE
+build_flags =
+ ${rp2040_base.build_flags}
+ -D RP2040_LORA
+ -I variants/rp2040/rp2040-lora
+ -D DEBUG_RP2040_PORT=Serial
+ -D HW_SPI1_DEVICE
lib_deps =
${rp2040_base.lib_deps}
debug_build_flags = ${rp2040_base.build_flags}, -g
-debug_tool = cmsis-dap ; for e.g. Picotool
\ No newline at end of file
+debug_tool = cmsis-dap ; for e.g. Picotool
diff --git a/variants/rp2040-lora/variant.h b/variants/rp2040/rp2040-lora/variant.h
similarity index 100%
rename from variants/rp2040-lora/variant.h
rename to variants/rp2040/rp2040-lora/variant.h
diff --git a/variants/rpipico-slowclock/platformio.ini b/variants/rp2040/rpipico-slowclock/platformio.ini
similarity index 85%
rename from variants/rpipico-slowclock/platformio.ini
rename to variants/rp2040/rpipico-slowclock/platformio.ini
index c56f9e78c..30928aead 100644
--- a/variants/rpipico-slowclock/platformio.ini
+++ b/variants/rp2040/rpipico-slowclock/platformio.ini
@@ -12,11 +12,11 @@ debug_init_cmds =
$LOAD_CMDS
monitor init
monitor reset halt
-
# add our variants files to the include and src paths
-build_flags = ${rp2040_base.build_flags}
+build_flags =
+ ${rp2040_base.build_flags}
-DRPI_PICO
- -Ivariants/rpipico-slowclock
+ -Ivariants/rp2040/rpipico-slowclock
-DDEBUG_RP2040_PORT=Serial2
-DHW_SPI1_DEVICE
-g
@@ -25,4 +25,4 @@ lib_deps =
${rp2040_base.lib_deps}
debug_build_flags = ${rp2040_base.build_flags}
-g
- -DNO_USB
\ No newline at end of file
+ -DNO_USB
diff --git a/variants/rpipico-slowclock/variant.h b/variants/rp2040/rpipico-slowclock/variant.h
similarity index 100%
rename from variants/rpipico-slowclock/variant.h
rename to variants/rp2040/rpipico-slowclock/variant.h
diff --git a/variants/rpipico/platformio.ini b/variants/rp2040/rpipico/platformio.ini
similarity index 55%
rename from variants/rpipico/platformio.ini
rename to variants/rp2040/rpipico/platformio.ini
index e34cfa43b..81db2a312 100644
--- a/variants/rpipico/platformio.ini
+++ b/variants/rp2040/rpipico/platformio.ini
@@ -4,12 +4,13 @@ board = rpipico
upload_protocol = picotool
# add our variants files to the include and src paths
-build_flags = ${rp2040_base.build_flags}
- -DRPI_PICO
- -Ivariants/rpipico
- -DDEBUG_RP2040_PORT=Serial
- -DHW_SPI1_DEVICE
+build_flags =
+ ${rp2040_base.build_flags}
+ -D RPI_PICO
+ -I variants/rp2040/rpipico
+ -D DEBUG_RP2040_PORT=Serial
+ -D HW_SPI1_DEVICE
lib_deps =
${rp2040_base.lib_deps}
debug_build_flags = ${rp2040_base.build_flags}, -g
-debug_tool = cmsis-dap ; for e.g. Picotool
\ No newline at end of file
+debug_tool = cmsis-dap ; for e.g. Picotool
diff --git a/variants/rpipico/variant.h b/variants/rp2040/rpipico/variant.h
similarity index 100%
rename from variants/rpipico/variant.h
rename to variants/rp2040/rpipico/variant.h
diff --git a/variants/rpipicow/platformio.ini b/variants/rp2040/rpipicow/platformio.ini
similarity index 75%
rename from variants/rpipicow/platformio.ini
rename to variants/rp2040/rpipicow/platformio.ini
index e59944b5d..f3fd07f8d 100644
--- a/variants/rpipicow/platformio.ini
+++ b/variants/rp2040/rpipicow/platformio.ini
@@ -2,14 +2,14 @@
extends = rp2040_base
board = rpipicow
upload_protocol = picotool
-
# add our variants files to the include and src paths
-build_flags = ${rp2040_base.build_flags}
- -DRPI_PICO
- -Ivariants/rpipicow
- -DHW_SPI1_DEVICE
+build_flags =
+ ${rp2040_base.build_flags}
+ -D RPI_PICO
+ -I variants/rp2040/rpipicow
+ -D HW_SPI1_DEVICE
+ -D HAS_UDP_MULTICAST=1
-fexceptions # for exception handling in MQTT
- -DHAS_UDP_MULTICAST=1
build_src_filter = ${rp2040_base.build_src_filter} +
lib_deps =
${rp2040_base.lib_deps}
diff --git a/variants/rpipicow/variant.h b/variants/rp2040/rpipicow/variant.h
similarity index 100%
rename from variants/rpipicow/variant.h
rename to variants/rp2040/rpipicow/variant.h
diff --git a/variants/senselora_rp2040/pins_arduino.h b/variants/rp2040/senselora_rp2040/pins_arduino.h
similarity index 100%
rename from variants/senselora_rp2040/pins_arduino.h
rename to variants/rp2040/senselora_rp2040/pins_arduino.h
diff --git a/variants/senselora_rp2040/platformio.ini b/variants/rp2040/senselora_rp2040/platformio.ini
similarity index 60%
rename from variants/senselora_rp2040/platformio.ini
rename to variants/rp2040/senselora_rp2040/platformio.ini
index b05fc1f8b..3a574d0f9 100644
--- a/variants/senselora_rp2040/platformio.ini
+++ b/variants/rp2040/senselora_rp2040/platformio.ini
@@ -5,9 +5,9 @@ board = rpipico
upload_protocol = picotool
# add our variants files to the include and src paths
-build_flags = ${rp2040_base.build_flags}
- -DSENSELORA_RP2040
- -Ivariants/senselora_rp2040
- -DDEBUG_RP2040_PORT=Serial
+build_flags = ${rp2040_base.build_flags}
+ -D SENSELORA_RP2040
+ -I variants/rp2040/senselora_rp2040
+ -D DEBUG_RP2040_PORT=Serial
lib_deps =
${rp2040_base.lib_deps}
\ No newline at end of file
diff --git a/variants/senselora_rp2040/variant.h b/variants/rp2040/senselora_rp2040/variant.h
similarity index 92%
rename from variants/senselora_rp2040/variant.h
rename to variants/rp2040/senselora_rp2040/variant.h
index 2f68cf034..cc90284b7 100644
--- a/variants/senselora_rp2040/variant.h
+++ b/variants/rp2040/senselora_rp2040/variant.h
@@ -6,6 +6,7 @@
#define BUTTON_NEED_PULLUP
#define LED_PIN PIN_LED
+#define ledOff(pin) pinMode(pin, INPUT)
#undef BATTERY_PIN
#define BATTERY_SENSE_RESOLUTION_BITS ADC_RESOLUTION
diff --git a/variants/rpipico2/platformio.ini b/variants/rp2350/rpipico2/platformio.ini
similarity index 54%
rename from variants/rpipico2/platformio.ini
rename to variants/rp2350/rpipico2/platformio.ini
index 066809a91..485523eb0 100644
--- a/variants/rpipico2/platformio.ini
+++ b/variants/rp2350/rpipico2/platformio.ini
@@ -4,12 +4,13 @@ board = rpipico2
upload_protocol = picotool
# add our variants files to the include and src paths
-build_flags = ${rp2350_base.build_flags}
- -DRPI_PICO2
- -Ivariants/rpipico2
- -DDEBUG_RP2040_PORT=Serial
- -DHW_SPI1_DEVICE
+build_flags =
+ ${rp2350_base.build_flags}
+ -D RPI_PICO2
+ -I variants/rp2350/rpipico2
+ -D DEBUG_RP2040_PORT=Serial
+ -D HW_SPI1_DEVICE
lib_deps =
${rp2350_base.lib_deps}
debug_build_flags = ${rp2350_base.build_flags}, -g
-debug_tool = cmsis-dap ; for e.g. Picotool
\ No newline at end of file
+debug_tool = cmsis-dap ; for e.g. Picotool
diff --git a/variants/rpipico2/variant.h b/variants/rp2350/rpipico2/variant.h
similarity index 100%
rename from variants/rpipico2/variant.h
rename to variants/rp2350/rpipico2/variant.h
diff --git a/variants/rpipico2w/platformio.ini b/variants/rp2350/rpipico2w/platformio.ini
similarity index 91%
rename from variants/rpipico2w/platformio.ini
rename to variants/rp2350/rpipico2w/platformio.ini
index 0fac1e9ce..3e5f2dbdd 100644
--- a/variants/rpipico2w/platformio.ini
+++ b/variants/rp2350/rpipico2w/platformio.ini
@@ -13,9 +13,10 @@ debug_init_cmds =
monitor reset halt
# add our variants files to the include and src paths
-build_flags = ${rp2350_base.build_flags}
+build_flags =
+ ${rp2350_base.build_flags}
-DRPI_PICO2
- -Ivariants/rpipico2w
+ -Ivariants/rp2350/rpipico2w
# -DDEBUG_RP2040_PORT=Serial
-DHW_SPI1_DEVICE
-DARDUINO_RASPBERRY_PI_PICO_2W
diff --git a/variants/rpipico2w/variant.h b/variants/rp2350/rpipico2w/variant.h
similarity index 100%
rename from variants/rpipico2w/variant.h
rename to variants/rp2350/rpipico2w/variant.h
diff --git a/variants/CDEBYTE_E77-MBL/platformio.ini b/variants/stm32/CDEBYTE_E77-MBL/platformio.ini
similarity index 58%
rename from variants/CDEBYTE_E77-MBL/platformio.ini
rename to variants/stm32/CDEBYTE_E77-MBL/platformio.ini
index 8a8002086..c011f62c9 100644
--- a/variants/CDEBYTE_E77-MBL/platformio.ini
+++ b/variants/stm32/CDEBYTE_E77-MBL/platformio.ini
@@ -5,23 +5,13 @@ board_upload.maximum_size = 233472 ; reserve the last 28KB for filesystem
board_level = extra
build_flags =
${stm32_base.build_flags}
- -Ivariants/CDEBYTE_E77-MBL
+ -Ivariants/stm32/CDEBYTE_E77-MBL
-DSERIAL_UART_INSTANCE=1
-DPIN_SERIAL_RX=PA3
-DPIN_SERIAL_TX=PA2
- -DHAL_DAC_MODULE_ONLY
- -DHAL_RNG_MODULE_ENABLED
- -DRADIOLIB_EXCLUDE_SX128X=1
- -DRADIOLIB_EXCLUDE_SX127X=1
- -DRADIOLIB_EXCLUDE_LR11X0=1
-DMESHTASTIC_EXCLUDE_ENVIRONMENTAL_SENSOR=1
-DMESHTASTIC_EXCLUDE_I2C=1
- -DMESHTASTIC_EXCLUDE_WIFI=1
- -DMESHTASTIC_EXCLUDE_BLUETOOTH=1
-DMESHTASTIC_EXCLUDE_GPS=1
- -DMESHTASTIC_EXCLUDE_SCREEN=1
- -DMESHTASTIC_EXCLUDE_MQTT=1
- -DMESHTASTIC_EXCLUDE_POWERMON=1
;-DPIO_FRAMEWORK_ARDUINO_NANOLIB_FLOAT_PRINTF
;-DCFG_DEBUG
diff --git a/variants/CDEBYTE_E77-MBL/variant.h b/variants/stm32/CDEBYTE_E77-MBL/variant.h
similarity index 100%
rename from variants/CDEBYTE_E77-MBL/variant.h
rename to variants/stm32/CDEBYTE_E77-MBL/variant.h
diff --git a/variants/rak3172/platformio.ini b/variants/stm32/rak3172/platformio.ini
similarity index 52%
rename from variants/rak3172/platformio.ini
rename to variants/stm32/rak3172/platformio.ini
index 99610b17c..9799fc879 100644
--- a/variants/rak3172/platformio.ini
+++ b/variants/stm32/rak3172/platformio.ini
@@ -4,21 +4,11 @@ board = wiscore_rak3172
board_upload.maximum_size = 233472 ; reserve the last 28KB for filesystem
build_flags =
${stm32_base.build_flags}
- -Ivariants/rak3172
+ -Ivariants/stm32/rak3172
-DPIN_WIRE_SDA=PA11
-DPIN_WIRE_SCL=PA12
- -DHAL_DAC_MODULE_ONLY
- -DHAL_RNG_MODULE_ENABLED
- -DRADIOLIB_EXCLUDE_SX128X=1
- -DRADIOLIB_EXCLUDE_SX127X=1
- -DRADIOLIB_EXCLUDE_LR11X0=1
-DMESHTASTIC_EXCLUDE_ENVIRONMENTAL_SENSOR=1
-DMESHTASTIC_EXCLUDE_I2C=1
- -DMESHTASTIC_EXCLUDE_WIFI=1
- -DMESHTASTIC_EXCLUDE_BLUETOOTH=1
-DMESHTASTIC_EXCLUDE_GPS=1
- -DMESHTASTIC_EXCLUDE_SCREEN=1
- -DMESHTASTIC_EXCLUDE_MQTT=1
- -DMESHTASTIC_EXCLUDE_POWERMON=1
;-DCFG_DEBUG
upload_port = stlink
diff --git a/variants/rak3172/variant.h b/variants/stm32/rak3172/variant.h
similarity index 100%
rename from variants/rak3172/variant.h
rename to variants/stm32/rak3172/variant.h
diff --git a/variants/wio-e5/platformio.ini b/variants/stm32/wio-e5/platformio.ini
similarity index 68%
rename from variants/wio-e5/platformio.ini
rename to variants/stm32/wio-e5/platformio.ini
index 1ef7abd78..c057946dd 100644
--- a/variants/wio-e5/platformio.ini
+++ b/variants/stm32/wio-e5/platformio.ini
@@ -4,18 +4,18 @@ board = lora_e5_dev_board
board_upload.maximum_size = 233472 ; reserve the last 28KB for filesystem
build_flags =
${stm32_base.build_flags}
- -Ivariants/wio-e5
+ -Ivariants/stm32/wio-e5
-DSERIAL_UART_INSTANCE=1
-DPIN_SERIAL_RX=PB7
-DPIN_SERIAL_TX=PB6
-DPIN_WIRE_SDA=PA15
-DPIN_WIRE_SCL=PB15
- -DHAL_DAC_MODULE_ONLY
- -DHAL_RNG_MODULE_ENABLED
- -DRADIOLIB_EXCLUDE_SX128X=1
- -DRADIOLIB_EXCLUDE_SX127X=1
- -DRADIOLIB_EXCLUDE_LR11X0=1
- -DHAS_SENSOR
+ -DHAS_SENSOR=1
+ -DENABLE_HWSERIAL2
+ -DPIN_SERIAL2_TX=PA2
+ -DPIN_SERIAL2_RX=PA3
+ -DHAS_GPS=1
+ -DGPS_SERIAL_PORT=Serial2
upload_port = stlink
diff --git a/variants/wio-e5/variant.h b/variants/stm32/wio-e5/variant.h
similarity index 96%
rename from variants/wio-e5/variant.h
rename to variants/stm32/wio-e5/variant.h
index 5421eaeb9..6098b4ce6 100644
--- a/variants/wio-e5/variant.h
+++ b/variants/stm32/wio-e5/variant.h
@@ -17,6 +17,8 @@ Do not expect a working Meshtastic device with this target.
#define LED_PIN PB5
#define LED_STATE_ON 1
+#define WIO_E5
+
#if (defined(LED_BUILTIN) && LED_BUILTIN == PNUM_NOT_DEFINED)
#undef LED_BUILTIN
#define LED_BUILTIN (LED_PIN)
diff --git a/version.properties b/version.properties
index 5de810523..aa959bcac 100644
--- a/version.properties
+++ b/version.properties
@@ -1,4 +1,4 @@
[VERSION]
major = 2
minor = 7
-build = 3
+build = 4