mirror of
https://github.com/alexhopeoconnor/firmware.git
synced 2026-10-19 18:01:30 +10:00
Compare commits
6
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
712cdd2287 | ||
|
|
44523b4ba7 | ||
|
|
6b7a1819fb | ||
|
|
1525f6fae3 | ||
|
|
f85bda87e0 | ||
|
|
8891b55be1 |
@@ -4,14 +4,9 @@ on:
|
|||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
inputs:
|
inputs:
|
||||||
# trunk-ignore(checkov/CKV_GHA_7)
|
# trunk-ignore(checkov/CKV_GHA_7)
|
||||||
target:
|
|
||||||
type: string
|
|
||||||
required: false
|
|
||||||
description: Choose the target board, e.g. nrf52_promicro_diy_tcxo. If blank, will find available targets.
|
|
||||||
arch:
|
arch:
|
||||||
type: choice
|
type: choice
|
||||||
options:
|
options:
|
||||||
- all
|
|
||||||
- esp32
|
- esp32
|
||||||
- esp32s3
|
- esp32s3
|
||||||
- esp32c3
|
- esp32c3
|
||||||
@@ -20,18 +15,32 @@ on:
|
|||||||
- rp2040
|
- rp2040
|
||||||
- rp2350
|
- rp2350
|
||||||
- stm32
|
- stm32
|
||||||
description: Choose an arch to limit the search, or 'all' to search all architectures.
|
target:
|
||||||
default: all
|
type: string
|
||||||
|
required: false
|
||||||
|
description: Choose the target board, e.g. nrf52_promicro_diy_tcxo. If blank, will find available targets.
|
||||||
|
# find-target:
|
||||||
|
# type: boolean
|
||||||
|
# default: true
|
||||||
|
# description: 'Find the available targets'
|
||||||
|
|
||||||
permissions: read-all
|
permissions: read-all
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
find-targets:
|
find-targets:
|
||||||
|
if: ${{ inputs.target == '' }}
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
arch:
|
arch:
|
||||||
- all
|
- esp32
|
||||||
|
- esp32s3
|
||||||
|
- esp32c3
|
||||||
|
- esp32c6
|
||||||
|
- nrf52840
|
||||||
|
- rp2040
|
||||||
|
- rp2350
|
||||||
|
- stm32
|
||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-24.04
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v6
|
||||||
@@ -42,37 +51,14 @@ jobs:
|
|||||||
- run: pip install -U platformio
|
- run: pip install -U platformio
|
||||||
- name: Generate matrix
|
- name: Generate matrix
|
||||||
id: jsonStep
|
id: jsonStep
|
||||||
env:
|
|
||||||
BUILDTARGET: ${{ inputs.target }}
|
|
||||||
MATRIXARCH: ${{ inputs.arch }}
|
|
||||||
run: |
|
run: |
|
||||||
TARGETS=$(./bin/generate_ci_matrix.py ${{matrix.arch}} --level extra)
|
TARGETS=$(./bin/generate_ci_matrix.py ${{matrix.arch}} --level extra)
|
||||||
if [ "$BUILDTARGET" = "" ]; then
|
echo "Name: $GITHUB_REF_NAME" >> $GITHUB_STEP_SUMMARY
|
||||||
echo "Name: $GITHUB_REF_NAME" >> $GITHUB_STEP_SUMMARY
|
echo "Base: $GITHUB_BASE_REF" >> $GITHUB_STEP_SUMMARY
|
||||||
echo "Base: $GITHUB_BASE_REF" >> $GITHUB_STEP_SUMMARY
|
echo "Arch: ${{matrix.arch}}" >> $GITHUB_STEP_SUMMARY
|
||||||
echo "Arch: $MATRIXARCH" >> $GITHUB_STEP_SUMMARY
|
echo "Ref: $GITHUB_REF" >> $GITHUB_STEP_SUMMARY
|
||||||
echo "Ref: $GITHUB_REF" >> $GITHUB_STEP_SUMMARY
|
echo "Targets:" >> $GITHUB_STEP_SUMMARY
|
||||||
echo "## 🎯 The following target boards are available to build:" >> $GITHUB_STEP_SUMMARY
|
echo $TARGETS | jq -r 'sort_by(.board) |.[] | "- " + .board' >> $GITHUB_STEP_SUMMARY
|
||||||
echo "| Platform | Board |" >> $GITHUB_STEP_SUMMARY
|
|
||||||
echo "| -------- | ----- |" >> $GITHUB_STEP_SUMMARY
|
|
||||||
echo $TARGETS | jq -r 'sort_by(.board) | sort_by(.platform) |.[] | "| " + .platform + " | " + .board + " |" ' >> $GITHUB_STEP_SUMMARY
|
|
||||||
else
|
|
||||||
echo "We build this one:" >> $GITHUB_STEP_SUMMARY
|
|
||||||
ARCH=$(echo "$TARGETS" | jq --arg BUILDTARGET "$BUILDTARGET" -r '.[] | select(.board==$BUILDTARGET) | .platform')
|
|
||||||
echo "| Platform | Board |" >> $GITHUB_STEP_SUMMARY
|
|
||||||
echo "| -------- | ----- |" >> $GITHUB_STEP_SUMMARY
|
|
||||||
echo "| $ARCH | "$BUILDTARGET" |" >> $GITHUB_STEP_SUMMARY
|
|
||||||
echo "" >> $GITHUB_STEP_SUMMARY
|
|
||||||
if [[ "$ARCH" == "" ]]; then
|
|
||||||
echo "## ❌ Error: Target "$BUILDTARGET" not found!" >> $GITHUB_STEP_SUMMARY
|
|
||||||
else
|
|
||||||
echo "## ✅ Target "$BUILDTARGET" found, proceeding to build." >> $GITHUB_STEP_SUMMARY
|
|
||||||
fi
|
|
||||||
echo "You may need to refresh this page to make the built firmware appear below." >> $GITHUB_STEP_SUMMARY
|
|
||||||
echo "arch=$ARCH" >> $GITHUB_OUTPUT
|
|
||||||
fi
|
|
||||||
outputs:
|
|
||||||
arch: ${{ steps.jsonStep.outputs.arch }}
|
|
||||||
|
|
||||||
version:
|
version:
|
||||||
if: ${{ inputs.target != '' }}
|
if: ${{ inputs.target != '' }}
|
||||||
@@ -92,12 +78,12 @@ jobs:
|
|||||||
|
|
||||||
build:
|
build:
|
||||||
if: ${{ inputs.target != '' && inputs.arch != 'native' }}
|
if: ${{ inputs.target != '' && inputs.arch != 'native' }}
|
||||||
needs: [version, find-targets]
|
needs: [version]
|
||||||
uses: ./.github/workflows/build_firmware.yml
|
uses: ./.github/workflows/build_firmware.yml
|
||||||
with:
|
with:
|
||||||
version: ${{ needs.version.outputs.long }}
|
version: ${{ needs.version.outputs.long }}
|
||||||
pio_env: ${{ inputs.target }}
|
pio_env: ${{ inputs.target }}
|
||||||
platform: ${{ needs.find-targets.outputs.arch }}
|
platform: ${{ inputs.arch }}
|
||||||
|
|
||||||
gather-artifacts:
|
gather-artifacts:
|
||||||
permissions:
|
permissions:
|
||||||
|
|||||||
@@ -56,25 +56,6 @@ jobs:
|
|||||||
echo "long=$(./bin/buildinfo.py long)" >> $GITHUB_OUTPUT
|
echo "long=$(./bin/buildinfo.py long)" >> $GITHUB_OUTPUT
|
||||||
id: version
|
id: version
|
||||||
|
|
||||||
- name: Set up QEMU
|
|
||||||
uses: docker/setup-qemu-action@v4
|
|
||||||
with:
|
|
||||||
cache-image: true
|
|
||||||
|
|
||||||
- name: Docker setup
|
|
||||||
uses: docker/setup-buildx-action@v4
|
|
||||||
with:
|
|
||||||
# Add Google/Amazon DockerHub mirrors to buildkit config
|
|
||||||
# https://docs.docker.com/build/ci/github-actions/configure-builder/#registry-mirror
|
|
||||||
buildkitd-config-inline: |
|
|
||||||
[registry."docker.io"]
|
|
||||||
mirrors = ["mirror.gcr.io", "public.ecr.aws"]
|
|
||||||
|
|
||||||
- name: Sanitize platform string
|
|
||||||
id: sanitize_platform
|
|
||||||
# Replace slashes with underscores
|
|
||||||
run: echo "cleaned_platform=${{ inputs.platform }}" | sed 's/\//_/g' >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- name: Docker login
|
- name: Docker login
|
||||||
if: ${{ inputs.push }}
|
if: ${{ inputs.push }}
|
||||||
uses: docker/login-action@v4
|
uses: docker/login-action@v4
|
||||||
@@ -82,6 +63,17 @@ jobs:
|
|||||||
username: meshtastic
|
username: meshtastic
|
||||||
password: ${{ secrets.DOCKER_FIRMWARE_TOKEN }}
|
password: ${{ secrets.DOCKER_FIRMWARE_TOKEN }}
|
||||||
|
|
||||||
|
- name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v4
|
||||||
|
|
||||||
|
- name: Docker setup
|
||||||
|
uses: docker/setup-buildx-action@v4
|
||||||
|
|
||||||
|
- name: Sanitize platform string
|
||||||
|
id: sanitize_platform
|
||||||
|
# Replace slashes with underscores
|
||||||
|
run: echo "cleaned_platform=${{ inputs.platform }}" | sed 's/\//_/g' >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- name: Docker tag
|
- name: Docker tag
|
||||||
id: meta
|
id: meta
|
||||||
uses: docker/metadata-action@v6
|
uses: docker/metadata-action@v6
|
||||||
@@ -103,6 +95,3 @@ jobs:
|
|||||||
platforms: ${{ inputs.platform }}
|
platforms: ${{ inputs.platform }}
|
||||||
build-args: |
|
build-args: |
|
||||||
PIO_ENV=${{ inputs.pio_env }}
|
PIO_ENV=${{ inputs.pio_env }}
|
||||||
# Cache image layers in GitHub Actions cache to speed up subsequent builds.
|
|
||||||
cache-from: type=gha
|
|
||||||
cache-to: type=gha,mode=max
|
|
||||||
|
|||||||
@@ -309,7 +309,7 @@ jobs:
|
|||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
- name: Create release
|
- name: Create release
|
||||||
uses: softprops/action-gh-release@v3
|
uses: softprops/action-gh-release@v2
|
||||||
id: create_release
|
id: create_release
|
||||||
with:
|
with:
|
||||||
draft: true
|
draft: true
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Apply quality label if needed
|
- name: Apply quality label if needed
|
||||||
if: steps.quality.outputs.response != '' && steps.quality.outputs.response != 'ok'
|
if: steps.quality.outputs.response != '' && steps.quality.outputs.response != 'ok'
|
||||||
uses: actions/github-script@v9
|
uses: actions/github-script@v8
|
||||||
env:
|
env:
|
||||||
QUALITY_LABEL: ${{ steps.quality.outputs.response }}
|
QUALITY_LABEL: ${{ steps.quality.outputs.response }}
|
||||||
with:
|
with:
|
||||||
@@ -80,7 +80,7 @@ jobs:
|
|||||||
# ─────────────────────────────────────────────────────────────────────────
|
# ─────────────────────────────────────────────────────────────────────────
|
||||||
- name: Determine if completeness check should be skipped
|
- name: Determine if completeness check should be skipped
|
||||||
if: steps.quality.outputs.response == 'ok' || steps.quality.outputs.response == ''
|
if: steps.quality.outputs.response == 'ok' || steps.quality.outputs.response == ''
|
||||||
uses: actions/github-script@v9
|
uses: actions/github-script@v8
|
||||||
id: check-skip
|
id: check-skip
|
||||||
with:
|
with:
|
||||||
script: |
|
script: |
|
||||||
@@ -134,7 +134,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Process analysis result
|
- name: Process analysis result
|
||||||
if: (steps.quality.outputs.response == 'ok' || steps.quality.outputs.response == '') && steps.check-skip.outputs.should_skip != 'true' && steps.analysis.outputs.response != ''
|
if: (steps.quality.outputs.response == 'ok' || steps.quality.outputs.response == '') && steps.check-skip.outputs.should_skip != 'true' && steps.analysis.outputs.response != ''
|
||||||
uses: actions/github-script@v9
|
uses: actions/github-script@v8
|
||||||
id: process
|
id: process
|
||||||
env:
|
env:
|
||||||
AI_RESPONSE: ${{ steps.analysis.outputs.response }}
|
AI_RESPONSE: ${{ steps.analysis.outputs.response }}
|
||||||
@@ -174,7 +174,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Apply triage label
|
- name: Apply triage label
|
||||||
if: steps.process.outputs.label != '' && steps.process.outputs.label != 'none'
|
if: steps.process.outputs.label != '' && steps.process.outputs.label != 'none'
|
||||||
uses: actions/github-script@v9
|
uses: actions/github-script@v8
|
||||||
env:
|
env:
|
||||||
LABEL_NAME: ${{ steps.process.outputs.label }}
|
LABEL_NAME: ${{ steps.process.outputs.label }}
|
||||||
with:
|
with:
|
||||||
@@ -200,7 +200,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Comment on issue
|
- name: Comment on issue
|
||||||
if: steps.process.outputs.should_comment == 'true'
|
if: steps.process.outputs.should_comment == 'true'
|
||||||
uses: actions/github-script@v9
|
uses: actions/github-script@v8
|
||||||
env:
|
env:
|
||||||
COMMENT_BODY: ${{ steps.process.outputs.comment_body }}
|
COMMENT_BODY: ${{ steps.process.outputs.comment_body }}
|
||||||
with:
|
with:
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ jobs:
|
|||||||
# Step 1: Check if PR already has automation/type labels (skip if so)
|
# Step 1: Check if PR already has automation/type labels (skip if so)
|
||||||
# ─────────────────────────────────────────────────────────────────────────
|
# ─────────────────────────────────────────────────────────────────────────
|
||||||
- name: Check existing labels
|
- name: Check existing labels
|
||||||
uses: actions/github-script@v9
|
uses: actions/github-script@v8
|
||||||
id: check-labels
|
id: check-labels
|
||||||
with:
|
with:
|
||||||
script: |
|
script: |
|
||||||
@@ -58,7 +58,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Apply quality label if needed
|
- name: Apply quality label if needed
|
||||||
if: steps.check-labels.outputs.skip_all != 'true' && steps.quality.outputs.response != '' && steps.quality.outputs.response != 'ok'
|
if: steps.check-labels.outputs.skip_all != 'true' && steps.quality.outputs.response != '' && steps.quality.outputs.response != 'ok'
|
||||||
uses: actions/github-script@v9
|
uses: actions/github-script@v8
|
||||||
id: quality-label
|
id: quality-label
|
||||||
env:
|
env:
|
||||||
QUALITY_LABEL: ${{ steps.quality.outputs.response }}
|
QUALITY_LABEL: ${{ steps.quality.outputs.response }}
|
||||||
@@ -113,7 +113,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Apply type label
|
- name: Apply type label
|
||||||
if: steps.check-labels.outputs.skip_all != 'true' && steps.check-labels.outputs.has_type_label != 'true' && steps.classify.outputs.response != ''
|
if: steps.check-labels.outputs.skip_all != 'true' && steps.check-labels.outputs.has_type_label != 'true' && steps.classify.outputs.response != ''
|
||||||
uses: actions/github-script@v9
|
uses: actions/github-script@v8
|
||||||
env:
|
env:
|
||||||
TYPE_LABEL: ${{ steps.classify.outputs.response }}
|
TYPE_LABEL: ${{ steps.classify.outputs.response }}
|
||||||
with:
|
with:
|
||||||
|
|||||||
@@ -5,8 +5,6 @@ on:
|
|||||||
secrets:
|
secrets:
|
||||||
PPA_GPG_PRIVATE_KEY:
|
PPA_GPG_PRIVATE_KEY:
|
||||||
required: true
|
required: true
|
||||||
PPA_SFTP_PRIVATE_KEY:
|
|
||||||
required: true
|
|
||||||
inputs:
|
inputs:
|
||||||
ppa_repo:
|
ppa_repo:
|
||||||
description: Meshtastic PPA to target
|
description: Meshtastic PPA to target
|
||||||
@@ -29,7 +27,6 @@ jobs:
|
|||||||
build_location: ppa
|
build_location: ppa
|
||||||
|
|
||||||
package-ppa:
|
package-ppa:
|
||||||
if: ${{ github.event_name != 'pull_request_target' && github.event_name != 'pull_request' }}
|
|
||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-24.04
|
||||||
needs: build-debian-src
|
needs: build-debian-src
|
||||||
steps:
|
steps:
|
||||||
@@ -43,7 +40,7 @@ jobs:
|
|||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get update -y --fix-missing
|
sudo apt-get update -y --fix-missing
|
||||||
sudo apt-get install -y dput openssh-client
|
sudo apt-get install -y dput
|
||||||
|
|
||||||
- name: Import GPG key
|
- name: Import GPG key
|
||||||
uses: crazy-max/ghaction-import-gpg@v7
|
uses: crazy-max/ghaction-import-gpg@v7
|
||||||
@@ -68,42 +65,8 @@ jobs:
|
|||||||
- name: Display structure of downloaded files
|
- name: Display structure of downloaded files
|
||||||
run: ls -lah
|
run: ls -lah
|
||||||
|
|
||||||
- name: Trust Launchpad's SSH key
|
- name: Publish with dput
|
||||||
|
if: ${{ github.event_name != 'pull_request_target' && github.event_name != 'pull_request' }}
|
||||||
|
timeout-minutes: 15 # dput is terrible, sometimes runs 'forever'
|
||||||
run: |
|
run: |
|
||||||
mkdir -p ~/.ssh
|
dput ${{ inputs.ppa_repo }} meshtasticd_${{ steps.version.outputs.deb }}~${{ inputs.series }}_source.changes
|
||||||
ssh-keyscan -H ppa.launchpad.net >> ~/.ssh/known_hosts
|
|
||||||
|
|
||||||
- name: Setup dput config
|
|
||||||
env:
|
|
||||||
ppa_login: meshtasticorg
|
|
||||||
run: |
|
|
||||||
sudo tee /etc/meshtastic-dput.cf >/dev/null <<EOF
|
|
||||||
[ppa]
|
|
||||||
fqdn = ppa.launchpad.net
|
|
||||||
method = ftp
|
|
||||||
incoming = ~%(ppa)s
|
|
||||||
login = anonymous
|
|
||||||
|
|
||||||
[ssh-ppa]
|
|
||||||
fqdn = ppa.launchpad.net
|
|
||||||
method = sftp
|
|
||||||
incoming = ~%(ssh-ppa)s
|
|
||||||
login = ${ppa_login}
|
|
||||||
EOF
|
|
||||||
|
|
||||||
- name: Import SSH key
|
|
||||||
uses: webfactory/ssh-agent@v0.10.0
|
|
||||||
with:
|
|
||||||
ssh-private-key: ${{ secrets.PPA_SFTP_PRIVATE_KEY }}
|
|
||||||
id: ssh
|
|
||||||
|
|
||||||
- name: Publish with dput (sftp)
|
|
||||||
timeout-minutes: 30 # dput is terrible, sometimes runs 'forever'
|
|
||||||
env:
|
|
||||||
up_ppa_repo: ${{ inputs.ppa_repo }}
|
|
||||||
up_series: ${{ inputs.series }}
|
|
||||||
up_version: ${{ steps.version.outputs.deb }}
|
|
||||||
run: >
|
|
||||||
dput -c /etc/meshtastic-dput.cf
|
|
||||||
ssh-${up_ppa_repo}
|
|
||||||
meshtasticd_${up_version}~${up_series}_source.changes
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Check for PR labels
|
- name: Check for PR labels
|
||||||
uses: actions/github-script@v9
|
uses: actions/github-script@v8
|
||||||
with:
|
with:
|
||||||
script: |
|
script: |
|
||||||
const labels = context.payload.pull_request.labels.map(label => label.name);
|
const labels = context.payload.pull_request.labels.map(label => label.name);
|
||||||
|
|||||||
@@ -177,7 +177,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Comment test results on PR
|
- name: Comment test results on PR
|
||||||
if: github.event_name == 'pull_request' && needs.native-tests.result != 'skipped'
|
if: github.event_name == 'pull_request' && needs.native-tests.result != 'skipped'
|
||||||
uses: actions/github-script@v9
|
uses: actions/github-script@v8
|
||||||
with:
|
with:
|
||||||
script: |
|
script: |
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
|
|||||||
@@ -136,7 +136,7 @@ jobs:
|
|||||||
merge-multiple: true
|
merge-multiple: true
|
||||||
|
|
||||||
- name: Test Report
|
- name: Test Report
|
||||||
uses: dorny/test-reporter@v3.0.0
|
uses: dorny/test-reporter@v2.6.0
|
||||||
with:
|
with:
|
||||||
name: PlatformIO Tests
|
name: PlatformIO Tests
|
||||||
path: testreport.xml
|
path: testreport.xml
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ jobs:
|
|||||||
node-version: 24
|
node-version: 24
|
||||||
|
|
||||||
- name: Setup pnpm
|
- name: Setup pnpm
|
||||||
uses: pnpm/action-setup@v6
|
uses: pnpm/action-setup@v5
|
||||||
with:
|
with:
|
||||||
version: latest
|
version: latest
|
||||||
|
|
||||||
|
|||||||
+6
-6
@@ -8,27 +8,27 @@ plugins:
|
|||||||
uri: https://github.com/trunk-io/plugins
|
uri: https://github.com/trunk-io/plugins
|
||||||
lint:
|
lint:
|
||||||
enabled:
|
enabled:
|
||||||
- checkov@3.2.517
|
- checkov@3.2.510
|
||||||
- renovate@43.110.9
|
- renovate@43.84.0
|
||||||
- prettier@3.8.1
|
- prettier@3.8.1
|
||||||
- trufflehog@3.94.3
|
- trufflehog@3.93.8
|
||||||
- yamllint@1.38.0
|
- yamllint@1.38.0
|
||||||
- bandit@1.9.4
|
- bandit@1.9.4
|
||||||
- trivy@0.69.3
|
- trivy@0.69.3
|
||||||
- taplo@0.10.0
|
- taplo@0.10.0
|
||||||
- ruff@0.15.9
|
- ruff@0.15.7
|
||||||
- isort@8.0.1
|
- isort@8.0.1
|
||||||
- markdownlint@0.48.0
|
- markdownlint@0.48.0
|
||||||
- oxipng@10.1.0
|
- oxipng@10.1.0
|
||||||
- svgo@4.0.1
|
- svgo@4.0.1
|
||||||
- actionlint@1.7.12
|
- actionlint@1.7.11
|
||||||
- flake8@7.3.0
|
- flake8@7.3.0
|
||||||
- hadolint@2.14.0
|
- hadolint@2.14.0
|
||||||
- shfmt@3.6.0
|
- shfmt@3.6.0
|
||||||
- shellcheck@0.11.0
|
- shellcheck@0.11.0
|
||||||
- black@26.3.1
|
- black@26.3.1
|
||||||
- git-diff-check
|
- git-diff-check
|
||||||
- gitleaks@8.30.1
|
- gitleaks@8.30.0
|
||||||
- clang-format@16.0.3
|
- clang-format@16.0.3
|
||||||
ignore:
|
ignore:
|
||||||
- linters: [ALL]
|
- linters: [ALL]
|
||||||
|
|||||||
@@ -204,16 +204,6 @@ HostMetrics:
|
|||||||
# UserStringCommand: cat /sys/firmware/devicetree/base/serial-number # Command to execute, to send the results as the userString
|
# UserStringCommand: cat /sys/firmware/devicetree/base/serial-number # Command to execute, to send the results as the userString
|
||||||
|
|
||||||
|
|
||||||
StoreAndForward:
|
|
||||||
# Enabled: true # Enable Store and Forward++, true by default
|
|
||||||
# DBPath: /var/lib/meshtasticd/ # Path to the S&F++ Sqlite DB
|
|
||||||
# Stratum0: false # Specify if this node is a Stratum 0 node, the controller node.
|
|
||||||
# InitialSync: 10 # Number of messages to
|
|
||||||
# Hops: 3 # Number of hops to use for SF++ messages
|
|
||||||
# AnnounceInterval: 5 # Interval in minutes between announcing tip of chain hash
|
|
||||||
# MaxChainLength: 1000 # Maximum number of messages to store in a chain
|
|
||||||
|
|
||||||
|
|
||||||
Config:
|
Config:
|
||||||
# DisplayMode: TWOCOLOR # uncomment to force BaseUI
|
# DisplayMode: TWOCOLOR # uncomment to force BaseUI
|
||||||
# DisplayMode: COLOR # uncomment to force MUI
|
# DisplayMode: COLOR # uncomment to force MUI
|
||||||
|
|||||||
@@ -1,9 +1,3 @@
|
|||||||
Meta:
|
|
||||||
name: BananaPi-BPI-R4-sx1262
|
|
||||||
support: community
|
|
||||||
compatible:
|
|
||||||
- bananapi_bpi-r4 # OpenWrt target
|
|
||||||
|
|
||||||
Lora:
|
Lora:
|
||||||
Module: sx1262 # BananaPi-BPI-R4 SPI via 26p GPIO Header
|
Module: sx1262 # BananaPi-BPI-R4 SPI via 26p GPIO Header
|
||||||
## CS: 28
|
## CS: 28
|
||||||
|
|||||||
@@ -1,10 +1,4 @@
|
|||||||
## https://www.mikroe.com/lr-iot-click
|
## https://www.mikroe.com/lr-iot-click
|
||||||
Meta:
|
|
||||||
name: OpenWRT One mikroBUS LR-IOT-CLICK
|
|
||||||
support: community
|
|
||||||
compatible:
|
|
||||||
- openwrt_one # OpenWrt target
|
|
||||||
|
|
||||||
Lora:
|
Lora:
|
||||||
Module: lr1110 # OpenWRT ONE mikroBUS with LR-IOT-CLICK
|
Module: lr1110 # OpenWRT ONE mikroBUS with LR-IOT-CLICK
|
||||||
# CS: 25
|
# CS: 25
|
||||||
|
|||||||
@@ -1,9 +1,3 @@
|
|||||||
Meta:
|
|
||||||
name: OpenWRT One mikroBUS sx1262
|
|
||||||
support: community
|
|
||||||
compatible:
|
|
||||||
- openwrt_one # OpenWrt target
|
|
||||||
|
|
||||||
Lora:
|
Lora:
|
||||||
Module: sx1262
|
Module: sx1262
|
||||||
IRQ: 10
|
IRQ: 10
|
||||||
|
|||||||
@@ -1,28 +0,0 @@
|
|||||||
# meshtasticd configuration files
|
|
||||||
|
|
||||||
This directory contains YAML configuration files for meshtasticd. Each file describes a specific hardware configuration, including the LoRa module and pin assignments. These configurations are used by meshtasticd to correctly interface with the hardware.
|
|
||||||
|
|
||||||
## Metadata structure
|
|
||||||
|
|
||||||
Each configuration file includes a `Meta` section that provides information about the configuration.
|
|
||||||
This configuration is consumed by configuration-selection tools.
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
Meta:
|
|
||||||
name: MeshAdv-Pi E22-900M30S # A unique identifier for this configuration.
|
|
||||||
support: community # community, official, or deprecated; determined by Meshtastic Leads.
|
|
||||||
compatible: # A list of compatible products or platforms.
|
|
||||||
- raspberry-pi
|
|
||||||
```
|
|
||||||
`name`: A unique identifier for the configuration, typically reflecting the hardware it supports.
|
|
||||||
|
|
||||||
`support`: Indicates the level of support for this configuration. It can be one of the following:
|
|
||||||
|
|
||||||
- `community`: Supported by the Meshtastic community. Meshtastic Members may not possess, or have not tested this configuration.
|
|
||||||
- `official`: Fully supported by Meshtastic. Meshtastic Members have tested and verified this configuration.
|
|
||||||
- `deprecated`: No longer recommended for deployment by Meshtastic.
|
|
||||||
|
|
||||||
`compatible`: A list of compatible products or platforms that can use this configuration.
|
|
||||||
This will vary depending on the intended use case / platform.
|
|
||||||
Multiple compatible entries can be included. E.g. Armbian `BOARD` value or OpenWrt `TARGET` value.
|
|
||||||
These tags can be consumed by different configuration-selection tools, filtering based upon their platform/etc.
|
|
||||||
@@ -1,9 +1,3 @@
|
|||||||
Meta:
|
|
||||||
name: Waveshare 1.44inch LCD HAT
|
|
||||||
support: community
|
|
||||||
compatible:
|
|
||||||
- raspberry-pi
|
|
||||||
|
|
||||||
### Waveshare 1.44inch LCD HAT
|
### Waveshare 1.44inch LCD HAT
|
||||||
Display:
|
Display:
|
||||||
Panel: ST7735S
|
Panel: ST7735S
|
||||||
|
|||||||
@@ -1,9 +1,3 @@
|
|||||||
Meta:
|
|
||||||
name: Waveshare 2.8inch LCD HAT
|
|
||||||
support: community
|
|
||||||
compatible:
|
|
||||||
- raspberry-pi
|
|
||||||
|
|
||||||
Display:
|
Display:
|
||||||
|
|
||||||
### Waveshare 2.8inch RPi LCD
|
### Waveshare 2.8inch RPi LCD
|
||||||
|
|||||||
@@ -1,30 +0,0 @@
|
|||||||
---
|
|
||||||
Lora:
|
|
||||||
## Ebyte E80-900M22S
|
|
||||||
## This is a bit experimental
|
|
||||||
##
|
|
||||||
##
|
|
||||||
Module: lr1121
|
|
||||||
gpiochip: 1 # subtract 32 from the gpio numbers
|
|
||||||
DIO3_TCXO_VOLTAGE: 1.8
|
|
||||||
CS: 16 #pin6 / GPIO48 1C0
|
|
||||||
IRQ: 23 #pin17 / GPIO55 1C7
|
|
||||||
Busy: 22 #pin16 / GPIO54 1C6
|
|
||||||
Reset: 25 #pin13 / GPIO57 1D1
|
|
||||||
|
|
||||||
|
|
||||||
spidev: spidev0.0 #pins are (CS=16, CLK=17, MOSI=18, MISO=19)
|
|
||||||
spiSpeed: 2000000
|
|
||||||
|
|
||||||
rfswitch_table:
|
|
||||||
pins: [DIO5, DIO6, DIO7]
|
|
||||||
MODE_STBY: [LOW, LOW, LOW]
|
|
||||||
MODE_RX: [LOW, HIGH, LOW]
|
|
||||||
MODE_TX: [HIGH, HIGH, LOW]
|
|
||||||
MODE_TX_HP: [HIGH, LOW, LOW]
|
|
||||||
MODE_TX_HF: [LOW, LOW, LOW]
|
|
||||||
MODE_GNSS: [LOW, LOW, HIGH]
|
|
||||||
MODE_WIFI: [LOW, LOW, LOW]
|
|
||||||
|
|
||||||
General:
|
|
||||||
MACAddressSource: eth0
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
---
|
|
||||||
Lora:
|
|
||||||
## Ebyte E80-900M22S
|
|
||||||
## This is a bit experimental
|
|
||||||
##
|
|
||||||
##
|
|
||||||
Module: lr1121
|
|
||||||
gpiochip: 1 # subtract 32 from the gpio numbers
|
|
||||||
DIO3_TCXO_VOLTAGE: 1.8
|
|
||||||
CS: 16 #pin6 / GPIO48 1C0
|
|
||||||
IRQ: 23 #pin17 / GPIO55 1C7
|
|
||||||
Busy: 22 #pin16 / GPIO54 1C6
|
|
||||||
Reset: 25 #pin13 / GPIO57 1D1
|
|
||||||
|
|
||||||
|
|
||||||
spidev: spidev0.0 #pins are (CS=16, CLK=17, MOSI=18, MISO=19)
|
|
||||||
spiSpeed: 2000000
|
|
||||||
|
|
||||||
rfswitch_table:
|
|
||||||
pins:
|
|
||||||
- DIO5
|
|
||||||
- DIO6
|
|
||||||
MODE_STBY:
|
|
||||||
- LOW
|
|
||||||
- LOW
|
|
||||||
MODE_RX:
|
|
||||||
- HIGH
|
|
||||||
- LOW
|
|
||||||
MODE_TX:
|
|
||||||
- HIGH
|
|
||||||
- HIGH
|
|
||||||
MODE_TX_HP:
|
|
||||||
- LOW
|
|
||||||
- HIGH
|
|
||||||
MODE_TX_HF:
|
|
||||||
- LOW
|
|
||||||
- LOW
|
|
||||||
MODE_GNSS:
|
|
||||||
- LOW
|
|
||||||
- LOW
|
|
||||||
MODE_WIFI:
|
|
||||||
- LOW
|
|
||||||
- LOW
|
|
||||||
|
|
||||||
General:
|
|
||||||
MACAddressSource: eth0
|
|
||||||
+20
-22
@@ -1,22 +1,20 @@
|
|||||||
---
|
---
|
||||||
Meta:
|
Lora:
|
||||||
name: Femtofox Ebyte E80-900M22S with TCXO
|
## Ebyte E80-900M22S
|
||||||
support: community
|
## This is a bit experimental
|
||||||
compatible:
|
##
|
||||||
- luckfox-pico-mini # Armbian
|
##
|
||||||
|
Module: lr1121
|
||||||
Lora:
|
gpiochip: 1 # subtract 32 from the gpio numbers
|
||||||
## Ebyte E80-900M22S
|
DIO3_TCXO_VOLTAGE: 1.8
|
||||||
## This is a bit experimental
|
CS: 16 #pin6 / GPIO48 1C0
|
||||||
##
|
IRQ: 23 #pin17 / GPIO55 1C7
|
||||||
##
|
Busy: 22 #pin16 / GPIO54 1C6
|
||||||
Module: lr1121
|
Reset: 25 #pin13 / GPIO57 1D1
|
||||||
gpiochip: 1 # subtract 32 from the gpio numbers
|
|
||||||
DIO3_TCXO_VOLTAGE: 1.8
|
|
||||||
CS: 16 #pin6 / GPIO48 1C0
|
spidev: spidev0.0 #pins are (CS=16, CLK=17, MOSI=18, MISO=19)
|
||||||
IRQ: 23 #pin17 / GPIO55 1C7
|
spiSpeed: 2000000
|
||||||
Busy: 22 #pin16 / GPIO54 1C6
|
|
||||||
Reset: 25 #pin13 / GPIO57 1D1
|
General:
|
||||||
|
MACAddressSource: eth0
|
||||||
spidev: spidev0.0 #pins are (CS=16, CLK=17, MOSI=18, MISO=19)
|
|
||||||
spiSpeed: 2000000
|
|
||||||
+21
-24
@@ -1,24 +1,21 @@
|
|||||||
---
|
---
|
||||||
Meta:
|
Lora:
|
||||||
name: Femtofox SX1262 TCXO
|
## Ebyte E22-900M30S, E22-900M22S with or without external RF switching setup
|
||||||
support: community
|
## HT-RA62 (Has internal switching, but whatever)
|
||||||
compatible:
|
## Seeed WIO SX1262 (already has TXEN-DIO2 link, but needs RXEN)
|
||||||
- luckfox-pico-mini # Armbian
|
## Will work with any module with or without RF switching, and with TCXO
|
||||||
|
Module: sx1262
|
||||||
Lora:
|
gpiochip: 1 # subtract 32 from the gpio numbers
|
||||||
## Ebyte E22-900M30S, E22-900M22S with or without external RF switching setup
|
DIO2_AS_RF_SWITCH: true
|
||||||
## HT-RA62 (Has internal switching, but whatever)
|
DIO3_TCXO_VOLTAGE: true
|
||||||
## Seeed WIO SX1262 (already has TXEN-DIO2 link, but needs RXEN)
|
CS: 16 #pin6 / GPIO48 1C0
|
||||||
## Will work with any module with or without RF switching, and with TCXO
|
IRQ: 23 #pin17 / GPIO55 1C7
|
||||||
Module: sx1262
|
Busy: 22 #pin16 / GPIO54 1C6
|
||||||
gpiochip: 1 # subtract 32 from the gpio numbers
|
Reset: 25 #pin13 / GPIO57 1D1
|
||||||
DIO2_AS_RF_SWITCH: true
|
RXen: 24 #pin12 / GPIO56 1D0 # Not strictly needed for auto-switching, but why complicate things?
|
||||||
DIO3_TCXO_VOLTAGE: true
|
# TXen: bridge to DIO2 on E22 module
|
||||||
CS: 16 #pin6 / GPIO48 1C0
|
spidev: spidev0.0 #pins are (CS=16, CLK=17, MOSI=18, MISO=19)
|
||||||
IRQ: 23 #pin17 / GPIO55 1C7
|
spiSpeed: 2000000
|
||||||
Busy: 22 #pin16 / GPIO54 1C6
|
|
||||||
Reset: 25 #pin13 / GPIO57 1D1
|
General:
|
||||||
RXen: 24 #pin12 / GPIO56 1D0 # Not strictly needed for auto-switching, but why complicate things?
|
MACAddressSource: eth0
|
||||||
# TXen: bridge to DIO2 on E22 module
|
|
||||||
spidev: spidev0.0 #pins are (CS=16, CLK=17, MOSI=18, MISO=19)
|
|
||||||
spiSpeed: 2000000
|
|
||||||
+21
-24
@@ -1,24 +1,21 @@
|
|||||||
---
|
---
|
||||||
Meta:
|
Lora:
|
||||||
name: Femtofox SX1262 XTAL
|
## Ebyte E22-900MM22S with no external RF switching setup
|
||||||
support: community
|
## Waveshare SX126X XXXM, AI Thinker RA-01SH
|
||||||
compatible:
|
## Will work with any module with or without RF switching and no TCXO
|
||||||
- luckfox-pico-mini # Armbian
|
|
||||||
|
Module: sx1262
|
||||||
Lora:
|
gpiochip: 1 # subtract 32 from the gpio numbers
|
||||||
## Ebyte E22-900MM22S with no external RF switching setup
|
DIO2_AS_RF_SWITCH: true
|
||||||
## Waveshare SX126X XXXM, AI Thinker RA-01SH
|
DIO3_TCXO_VOLTAGE: false
|
||||||
## Will work with any module with or without RF switching and no TCXO
|
CS: 16 #pin6 / GPIO48 1C0
|
||||||
|
IRQ: 23 #pin17 / GPIO55 1C7
|
||||||
Module: sx1262
|
Busy: 22 #pin16 / GPIO54 1C6
|
||||||
gpiochip: 1 # subtract 32 from the gpio numbers
|
Reset: 25 #pin13 / GPIO57 1D1
|
||||||
DIO2_AS_RF_SWITCH: true
|
RXen: 24 #pin12 / GPIO56 1D0 # Not strictly needed for auto-switching, but why complicate things?
|
||||||
DIO3_TCXO_VOLTAGE: false
|
# TXen: bridge to DIO2 on E22 module
|
||||||
CS: 16 #pin6 / GPIO48 1C0
|
spidev: spidev0.0 #pins are (CS=16, CLK=17, MOSI=18, MISO=19)
|
||||||
IRQ: 23 #pin17 / GPIO55 1C7
|
spiSpeed: 2000000
|
||||||
Busy: 22 #pin16 / GPIO54 1C6
|
|
||||||
Reset: 25 #pin13 / GPIO57 1D1
|
General:
|
||||||
RXen: 24 #pin12 / GPIO56 1D0 # Not strictly needed for auto-switching, but why complicate things?
|
MACAddressSource: eth0
|
||||||
# TXen: bridge to DIO2 on E22 module
|
|
||||||
spidev: spidev0.0 #pins are (CS=16, CLK=17, MOSI=18, MISO=19)
|
|
||||||
spiSpeed: 2000000
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
---
|
|
||||||
Lora:
|
|
||||||
## Ebyte E80-900M22S
|
|
||||||
## This is a bit experimental
|
|
||||||
##
|
|
||||||
##
|
|
||||||
Module: lr1121
|
|
||||||
gpiochip: 1 # subtract 32 from the gpio numbers
|
|
||||||
DIO3_TCXO_VOLTAGE: 1.8
|
|
||||||
CS: 16 #pin6 / GPIO48 1C0
|
|
||||||
IRQ: 23 #pin17 / GPIO55 1C7
|
|
||||||
Busy: 22 #pin16 / GPIO54 1C6
|
|
||||||
Reset: 25 #pin13 / GPIO57 1D1
|
|
||||||
|
|
||||||
|
|
||||||
spidev: spidev0.0 #pins are (CS=16, CLK=17, MOSI=18, MISO=19)
|
|
||||||
spiSpeed: 2000000
|
|
||||||
|
|
||||||
rfswitch_table:
|
|
||||||
pins: [DIO5, DIO6, DIO7]
|
|
||||||
MODE_STBY: [LOW, LOW, LOW]
|
|
||||||
MODE_RX: [LOW, LOW, LOW]
|
|
||||||
MODE_TX: [LOW, HIGH, LOW]
|
|
||||||
MODE_TX_HP: [HIGH, LOW, LOW]
|
|
||||||
# MODE_TX_HF: []
|
|
||||||
# MODE_GNSS: []
|
|
||||||
MODE_WIFI: [LOW, LOW, LOW]
|
|
||||||
|
|
||||||
General:
|
|
||||||
MACAddressSource: eth0
|
|
||||||
@@ -1,9 +1,3 @@
|
|||||||
Meta:
|
|
||||||
name: Adafruit RFM9x
|
|
||||||
support: deprecated
|
|
||||||
compatible:
|
|
||||||
- raspberry-pi
|
|
||||||
|
|
||||||
Lora:
|
Lora:
|
||||||
Module: RF95 # Adafruit RFM9x
|
Module: RF95 # Adafruit RFM9x
|
||||||
Reset: 25
|
Reset: 25
|
||||||
|
|||||||
@@ -1,11 +1,5 @@
|
|||||||
# MeshAdv-Pi E22-900M30S
|
# MeshAdv-Pi E22-900M30S
|
||||||
# https://github.com/chrismyers2000/MeshAdv-Pi-Hat
|
# https://github.com/chrismyers2000/MeshAdv-Pi-Hat
|
||||||
Meta:
|
|
||||||
name: MeshAdv-Pi E22-900M30S
|
|
||||||
support: community
|
|
||||||
compatible:
|
|
||||||
- raspberry-pi
|
|
||||||
|
|
||||||
Lora:
|
Lora:
|
||||||
Module: sx1262
|
Module: sx1262
|
||||||
CS: 21
|
CS: 21
|
||||||
|
|||||||
@@ -1,11 +1,5 @@
|
|||||||
# MeshAdv Mini E22-900M22S
|
# MeshAdv Mini E22-900M22S
|
||||||
# https://github.com/chrismyers2000/MeshAdv-Mini
|
# https://github.com/chrismyers2000/MeshAdv-Mini
|
||||||
Meta:
|
|
||||||
name: MeshAdv Mini E22-900M22S
|
|
||||||
support: community
|
|
||||||
compatible:
|
|
||||||
- raspberry-pi
|
|
||||||
|
|
||||||
Lora:
|
Lora:
|
||||||
Module: sx1262 # Ebyte E22-900M22S
|
Module: sx1262 # Ebyte E22-900M22S
|
||||||
CS: 8
|
CS: 8
|
||||||
|
|||||||
@@ -1,12 +1,6 @@
|
|||||||
Meta:
|
|
||||||
name: RAK6421 + RAK13300 Slot 1
|
|
||||||
support: official
|
|
||||||
compatible:
|
|
||||||
- raspberry-pi
|
|
||||||
|
|
||||||
Lora:
|
Lora:
|
||||||
|
|
||||||
### RAK13300 in Slot 1
|
### RAK13300in Slot 1
|
||||||
Module: sx1262
|
Module: sx1262
|
||||||
IRQ: 22 #IO6
|
IRQ: 22 #IO6
|
||||||
Reset: 16 # IO4
|
Reset: 16 # IO4
|
||||||
|
|||||||
@@ -1,11 +1,5 @@
|
|||||||
Meta:
|
|
||||||
name: RAK6421 + RAK13300 Slot 2
|
|
||||||
support: official
|
|
||||||
compatible:
|
|
||||||
- raspberry-pi
|
|
||||||
|
|
||||||
Lora:
|
Lora:
|
||||||
### RAK13300 in Slot 2 pins
|
### RAK13300in Slot 2 pins
|
||||||
IRQ: 18 #IO6
|
IRQ: 18 #IO6
|
||||||
Reset: 24 # IO4
|
Reset: 24 # IO4
|
||||||
Busy: 19 # IO5
|
Busy: 19 # IO5
|
||||||
|
|||||||
@@ -1,12 +1,6 @@
|
|||||||
Meta:
|
|
||||||
name: RAK6421 + RAK13302 Slot 1
|
|
||||||
support: official
|
|
||||||
compatible:
|
|
||||||
- raspberry-pi
|
|
||||||
|
|
||||||
Lora:
|
Lora:
|
||||||
|
|
||||||
### RAK13302 in Slot 1
|
### RAK13300in Slot 1
|
||||||
Module: sx1262
|
Module: sx1262
|
||||||
IRQ: 22 #IO6
|
IRQ: 22 #IO6
|
||||||
Reset: 16 # IO4
|
Reset: 16 # IO4
|
||||||
|
|||||||
@@ -1,11 +1,5 @@
|
|||||||
Meta:
|
|
||||||
name: RAK6421 + RAK13302 Slot 2
|
|
||||||
support: official
|
|
||||||
compatible:
|
|
||||||
- raspberry-pi
|
|
||||||
|
|
||||||
Lora:
|
Lora:
|
||||||
### RAK13302 in Slot 2 pins
|
### RAK13300in Slot 2 pins
|
||||||
IRQ: 18 #IO6
|
IRQ: 18 #IO6
|
||||||
Reset: 24 # IO4
|
Reset: 24 # IO4
|
||||||
Busy: 19 # IO5
|
Busy: 19 # IO5
|
||||||
|
|||||||
@@ -1,39 +0,0 @@
|
|||||||
# MeshAdv-Pi E22-900M30S
|
|
||||||
# https://github.com/chrismyers2000/MeshAdv-Pi-Hat
|
|
||||||
Meta:
|
|
||||||
name: MeshAdv-Pi E22-900M30S
|
|
||||||
support: community
|
|
||||||
compatible:
|
|
||||||
- ebyte-ecb41-pge # Armbian
|
|
||||||
|
|
||||||
Lora:
|
|
||||||
Module: sx1262
|
|
||||||
CS: # GPIO0_A1 (physical 40)
|
|
||||||
pin: 1
|
|
||||||
gpiochip: 0
|
|
||||||
line: 1
|
|
||||||
IRQ: # GPIO0_A3 (physical 36)
|
|
||||||
pin: 3
|
|
||||||
gpiochip: 0
|
|
||||||
line: 3
|
|
||||||
Busy: # GPIO0_A0 (physical 38)
|
|
||||||
pin: 0
|
|
||||||
gpiochip: 0
|
|
||||||
line: 0
|
|
||||||
Reset: # GPIO0_B4 (physical 12)
|
|
||||||
pin: 12
|
|
||||||
gpiochip: 0
|
|
||||||
line: 12
|
|
||||||
TXen: # GPIO1_D1 (physical 33)
|
|
||||||
pin: 57
|
|
||||||
gpiochip: 1
|
|
||||||
line: 25
|
|
||||||
RXen: # GPIO1_B3 (physical 32)
|
|
||||||
pin: 43
|
|
||||||
gpiochip: 1
|
|
||||||
line: 11
|
|
||||||
DIO3_TCXO_VOLTAGE: true
|
|
||||||
# Only for E22-900M33S:
|
|
||||||
# Limit the output power to 8 dBm
|
|
||||||
# SX126X_MAX_POWER: 8
|
|
||||||
spidev: spidev0.0
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
# MeshAdv Mini E22-900M22S
|
|
||||||
# https://github.com/chrismyers2000/MeshAdv-Mini
|
|
||||||
Meta:
|
|
||||||
name: MeshAdv Mini E22-900M22S
|
|
||||||
support: community
|
|
||||||
compatible:
|
|
||||||
- ebyte-ecb41-pge # Armbian
|
|
||||||
|
|
||||||
Lora:
|
|
||||||
Module: sx1262 # Ebyte E22-900M22S
|
|
||||||
CS: # GPIO0_B6 (physical 24, SPI1_CSN0)
|
|
||||||
pin: 14
|
|
||||||
gpiochip: 0
|
|
||||||
line: 14
|
|
||||||
IRQ: # GPIO0_A3 (physical 36)
|
|
||||||
pin: 3
|
|
||||||
gpiochip: 0
|
|
||||||
line: 3
|
|
||||||
Busy: # GPIO0_A0 (physical 38)
|
|
||||||
pin: 0
|
|
||||||
gpiochip: 0
|
|
||||||
line: 0
|
|
||||||
Reset: # GPIO1_C3 (physical 18)
|
|
||||||
pin: 51
|
|
||||||
gpiochip: 1
|
|
||||||
line: 19
|
|
||||||
RXen: # GPIO1_B3 (physical 32)
|
|
||||||
pin: 43
|
|
||||||
gpiochip: 1
|
|
||||||
line: 11
|
|
||||||
DIO2_AS_RF_SWITCH: true
|
|
||||||
DIO3_TCXO_VOLTAGE: true
|
|
||||||
spidev: spidev0.0
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
Meta:
|
|
||||||
name: RAK6421 + RAK13300 Slot 1
|
|
||||||
support: community # Promote when tested
|
|
||||||
compatible:
|
|
||||||
- ebyte-ecb41-pge # Armbian
|
|
||||||
|
|
||||||
Lora:
|
|
||||||
Module: sx1262
|
|
||||||
IRQ: # GPIO0_A5 (IO6, physical 15)
|
|
||||||
pin: 5
|
|
||||||
gpiochip: 0
|
|
||||||
line: 5
|
|
||||||
Reset: # GPIO0_A3 (IO4, physical 36)
|
|
||||||
pin: 3
|
|
||||||
gpiochip: 0
|
|
||||||
line: 3
|
|
||||||
Busy: # GPIO1_C3 (IO5, physical 18)
|
|
||||||
pin: 51
|
|
||||||
gpiochip: 1
|
|
||||||
line: 19
|
|
||||||
# Ant_sw: # GPIO1_C2 (IO3, physical 16)
|
|
||||||
# pin: 50
|
|
||||||
# gpiochip: 1
|
|
||||||
# line: 18
|
|
||||||
Enable_Pins:
|
|
||||||
- pin: 43 # GPIO1_B3 (physical 32)
|
|
||||||
gpiochip: 1
|
|
||||||
line: 11
|
|
||||||
- pin: 57 # GPIO1_D1 (physical 33)
|
|
||||||
gpiochip: 1
|
|
||||||
line: 25
|
|
||||||
DIO3_TCXO_VOLTAGE: true
|
|
||||||
DIO2_AS_RF_SWITCH: true
|
|
||||||
spidev: spidev0.0
|
|
||||||
# CS: # GPIO0_B6 (SPI1_CSN0, physical 24)
|
|
||||||
# pin: 14
|
|
||||||
# gpiochip: 0
|
|
||||||
# line: 14
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
Meta:
|
|
||||||
name: RAK6421 + RAK13300 Slot 2
|
|
||||||
support: community # Promote when tested
|
|
||||||
compatible:
|
|
||||||
- ebyte-ecb41-pge # Armbian
|
|
||||||
|
|
||||||
Lora:
|
|
||||||
Module: sx1262
|
|
||||||
IRQ: # GPIO0_B4 (IO6, physical 12)
|
|
||||||
pin: 12
|
|
||||||
gpiochip: 0
|
|
||||||
line: 12
|
|
||||||
Reset: # GPIO1_C3 (IO4, physical 18)
|
|
||||||
pin: 51
|
|
||||||
gpiochip: 1
|
|
||||||
line: 19
|
|
||||||
Busy: # GPIO0_B3 (IO5, physical 35)
|
|
||||||
pin: 11
|
|
||||||
gpiochip: 0
|
|
||||||
line: 11
|
|
||||||
# Ant_sw: # GPIO1_C2 (IO3, physical 16)
|
|
||||||
# pin: 50
|
|
||||||
# gpiochip: 1
|
|
||||||
# line: 18
|
|
||||||
Enable_Pins:
|
|
||||||
- pin: 2 # GPIO0_A2 (physical 37)
|
|
||||||
gpiochip: 0
|
|
||||||
line: 2
|
|
||||||
- pin: 50 # GPIO1_C2 (physical 16)
|
|
||||||
gpiochip: 1
|
|
||||||
line: 18
|
|
||||||
spidev: spidev0.1
|
|
||||||
# CS: # GPIO0_A7 (SPI1_CSN1, physical 26)
|
|
||||||
# pin: 7
|
|
||||||
# gpiochip: 0
|
|
||||||
# line: 7
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
Meta:
|
|
||||||
name: RAK6421 + RAK13302 Slot 1
|
|
||||||
support: community # Promote when tested
|
|
||||||
compatible:
|
|
||||||
- ebyte-ecb41-pge # Armbian
|
|
||||||
|
|
||||||
Lora:
|
|
||||||
Module: sx1262
|
|
||||||
IRQ: # GPIO0_A5 (IO6, physical 15)
|
|
||||||
pin: 5
|
|
||||||
gpiochip: 0
|
|
||||||
line: 5
|
|
||||||
Reset: # GPIO0_A3 (IO4, physical 36)
|
|
||||||
pin: 3
|
|
||||||
gpiochip: 0
|
|
||||||
line: 3
|
|
||||||
Busy: # GPIO1_C3 (IO5, physical 18)
|
|
||||||
pin: 51
|
|
||||||
gpiochip: 1
|
|
||||||
line: 19
|
|
||||||
# Ant_sw: # GPIO1_C2 (IO3, physical 16)
|
|
||||||
# pin: 50
|
|
||||||
# gpiochip: 1
|
|
||||||
# line: 18
|
|
||||||
Enable_Pins:
|
|
||||||
- pin: 43 # GPIO1_B3 (physical 32)
|
|
||||||
gpiochip: 1
|
|
||||||
line: 11
|
|
||||||
- pin: 57 # GPIO1_D1 (physical 33)
|
|
||||||
gpiochip: 1
|
|
||||||
line: 25
|
|
||||||
DIO3_TCXO_VOLTAGE: true
|
|
||||||
DIO2_AS_RF_SWITCH: true
|
|
||||||
spidev: spidev0.0
|
|
||||||
# CS: # GPIO0_B6 (SPI1_CSN0, physical 24)
|
|
||||||
# pin: 14
|
|
||||||
# gpiochip: 0
|
|
||||||
# line: 14
|
|
||||||
TX_GAIN_LORA: [9, 9, 10, 11, 9, 8, 9, 10, 10, 10, 11, 12, 12, 12, 12, 12, 12, 12, 12, 10, 9, 8]
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
Meta:
|
|
||||||
name: RAK6421 + RAK13302 Slot 2
|
|
||||||
support: community # Promote when tested
|
|
||||||
compatible:
|
|
||||||
- ebyte-ecb41-pge # Armbian
|
|
||||||
|
|
||||||
Lora:
|
|
||||||
Module: sx1262
|
|
||||||
IRQ: # GPIO0_B4 (IO6, physical 12)
|
|
||||||
pin: 12
|
|
||||||
gpiochip: 0
|
|
||||||
line: 12
|
|
||||||
Reset: # GPIO1_C3 (IO4, physical 18)
|
|
||||||
pin: 51
|
|
||||||
gpiochip: 1
|
|
||||||
line: 19
|
|
||||||
Busy: # GPIO0_B3 (IO5, physical 35)
|
|
||||||
pin: 11
|
|
||||||
gpiochip: 0
|
|
||||||
line: 11
|
|
||||||
# Ant_sw: # GPIO1_C2 (IO3, physical 16)
|
|
||||||
# pin: 50
|
|
||||||
# gpiochip: 1
|
|
||||||
# line: 18
|
|
||||||
Enable_Pins:
|
|
||||||
- pin: 2 # GPIO0_A2 (physical 37)
|
|
||||||
gpiochip: 0
|
|
||||||
line: 2
|
|
||||||
- pin: 50 # GPIO1_C2 (physical 16)
|
|
||||||
gpiochip: 1
|
|
||||||
line: 18
|
|
||||||
spidev: spidev0.1
|
|
||||||
# CS: # GPIO0_A7 (SPI1_CSN1, physical 26)
|
|
||||||
# pin: 7
|
|
||||||
# gpiochip: 0
|
|
||||||
# line: 7
|
|
||||||
TX_GAIN_LORA: [9, 9, 10, 11, 9, 8, 9, 10, 10, 10, 11, 12, 12, 12, 12, 12, 12, 12, 12, 10, 9, 8]
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
Meta:
|
|
||||||
name: Waveshare SX1262
|
|
||||||
support: deprecated
|
|
||||||
compatible:
|
|
||||||
- ebyte-ecb41-pge # Armbian
|
|
||||||
|
|
||||||
Lora:
|
|
||||||
Module: sx1262 # Waveshare SX126X XXXM
|
|
||||||
DIO2_AS_RF_SWITCH: true
|
|
||||||
CS: # GPIO0_A1 (physical 40)
|
|
||||||
pin: 1
|
|
||||||
gpiochip: 0
|
|
||||||
line: 1
|
|
||||||
IRQ: # GPIO0_A3 (physical 36)
|
|
||||||
pin: 3
|
|
||||||
gpiochip: 0
|
|
||||||
line: 3
|
|
||||||
Busy: # GPIO0_A0 (physical 38)
|
|
||||||
pin: 0
|
|
||||||
gpiochip: 0
|
|
||||||
line: 0
|
|
||||||
Reset: # GPIO0_B4 (physical 12)
|
|
||||||
pin: 12
|
|
||||||
gpiochip: 0
|
|
||||||
line: 12
|
|
||||||
SX126X_ANT_SW: # GPIO1_B2 (physical 31)
|
|
||||||
pin: 42
|
|
||||||
gpiochip: 1
|
|
||||||
line: 10
|
|
||||||
spidev: spidev0.0
|
|
||||||
@@ -1,12 +1,6 @@
|
|||||||
Meta:
|
|
||||||
name: RAK6421 + RAK13300 Slot 1 (Autoconf default)
|
|
||||||
support: official
|
|
||||||
compatible:
|
|
||||||
- raspberry-pi
|
|
||||||
|
|
||||||
Lora:
|
Lora:
|
||||||
|
|
||||||
### RAK13300 in Slot 1
|
### RAK13300in Slot 1
|
||||||
Module: sx1262
|
Module: sx1262
|
||||||
IRQ: 22 #IO6
|
IRQ: 22 #IO6
|
||||||
Reset: 16 # IO4
|
Reset: 16 # IO4
|
||||||
|
|||||||
@@ -1,9 +1,3 @@
|
|||||||
Meta:
|
|
||||||
name: Luckfox Lyra PicoCalc Wio LoRa SX1262
|
|
||||||
support: official
|
|
||||||
compatible:
|
|
||||||
- luckfox-lyra-plus # Armbian
|
|
||||||
|
|
||||||
Lora:
|
Lora:
|
||||||
Module: sx1262
|
Module: sx1262
|
||||||
DIO2_AS_RF_SWITCH: true
|
DIO2_AS_RF_SWITCH: true
|
||||||
|
|||||||
@@ -2,13 +2,6 @@
|
|||||||
# Enable overlay 'luckfox-lyra-ultra-w-spi0-cs0-spidev' with armbian-config
|
# Enable overlay 'luckfox-lyra-ultra-w-spi0-cs0-spidev' with armbian-config
|
||||||
# https://github.com/wehooper4/Meshtastic-Hardware/tree/main/Luckfox%20Ultra%20Hat
|
# https://github.com/wehooper4/Meshtastic-Hardware/tree/main/Luckfox%20Ultra%20Hat
|
||||||
# 1 Watt Lyra Ultra hat
|
# 1 Watt Lyra Ultra hat
|
||||||
Meta:
|
|
||||||
name: wehooper4 Luckfox Ultra 1W
|
|
||||||
support: community
|
|
||||||
compatible:
|
|
||||||
- luckfox-pico-ultra # Armbian
|
|
||||||
- luckfox-lyra-ultra # Armbian
|
|
||||||
|
|
||||||
Lora:
|
Lora:
|
||||||
Module: sx1262
|
Module: sx1262
|
||||||
DIO2_AS_RF_SWITCH: true
|
DIO2_AS_RF_SWITCH: true
|
||||||
|
|||||||
@@ -2,13 +2,6 @@
|
|||||||
# Enable overlay 'luckfox-lyra-ultra-w-spi0-cs0-spidev' with armbian-config
|
# Enable overlay 'luckfox-lyra-ultra-w-spi0-cs0-spidev' with armbian-config
|
||||||
# https://github.com/wehooper4/Meshtastic-Hardware/tree/main/Luckfox%20Ultra%20Hat
|
# https://github.com/wehooper4/Meshtastic-Hardware/tree/main/Luckfox%20Ultra%20Hat
|
||||||
# 2 Watt Lyra Ultra hat
|
# 2 Watt Lyra Ultra hat
|
||||||
Meta:
|
|
||||||
name: wehooper4 Luckfox Ultra 2W
|
|
||||||
support: community
|
|
||||||
compatible:
|
|
||||||
- luckfox-pico-ultra # Armbian
|
|
||||||
- luckfox-lyra-ultra # Armbian
|
|
||||||
|
|
||||||
Lora:
|
Lora:
|
||||||
Module: sx1262
|
Module: sx1262
|
||||||
DIO2_AS_RF_SWITCH: true
|
DIO2_AS_RF_SWITCH: true
|
||||||
|
|||||||
@@ -2,12 +2,6 @@
|
|||||||
# Enable overlay 'luckfox-lyra-plus-spi0-cs0_rmio13-spidev' with armbian-config
|
# Enable overlay 'luckfox-lyra-plus-spi0-cs0_rmio13-spidev' with armbian-config
|
||||||
# Waveshare LoRa HAT for Raspberry Pi Pico
|
# Waveshare LoRa HAT for Raspberry Pi Pico
|
||||||
# https://www.waveshare.com/wiki/Pico-LoRa-SX1262
|
# https://www.waveshare.com/wiki/Pico-LoRa-SX1262
|
||||||
Meta:
|
|
||||||
name: Waveshare LoRa HAT for Raspberry Pi Pico
|
|
||||||
support: community
|
|
||||||
compatible:
|
|
||||||
- luckfox-lyra-plus # Armbian
|
|
||||||
|
|
||||||
Lora:
|
Lora:
|
||||||
Module: sx1262
|
Module: sx1262
|
||||||
DIO2_AS_RF_SWITCH: true
|
DIO2_AS_RF_SWITCH: true
|
||||||
|
|||||||
@@ -1,39 +0,0 @@
|
|||||||
# MeshAdv-Pi E22-900M30S
|
|
||||||
# https://github.com/chrismyers2000/MeshAdv-Pi-Hat
|
|
||||||
Meta:
|
|
||||||
name: MeshAdv-Pi E22-900M30S
|
|
||||||
support: community
|
|
||||||
compatible:
|
|
||||||
- luckfox-lyra-zero-w # Armbian
|
|
||||||
|
|
||||||
Lora:
|
|
||||||
Module: sx1262
|
|
||||||
CS: # GPIO0_C2 (physical 40)
|
|
||||||
pin: 18
|
|
||||||
gpiochip: 0
|
|
||||||
line: 18
|
|
||||||
IRQ: # GPIO1_D1 (physical 36)
|
|
||||||
pin: 57
|
|
||||||
gpiochip: 1
|
|
||||||
line: 25
|
|
||||||
Busy: # GPIO0_C1 (physical 38)
|
|
||||||
pin: 17
|
|
||||||
gpiochip: 0
|
|
||||||
line: 17
|
|
||||||
Reset: # GPIO0_B6 (physical 12)
|
|
||||||
pin: 14
|
|
||||||
gpiochip: 0
|
|
||||||
line: 14
|
|
||||||
TXen: # GPIO1_C2 (physical 33)
|
|
||||||
pin: 50
|
|
||||||
gpiochip: 1
|
|
||||||
line: 18
|
|
||||||
RXen: # GPIO1_D2 (physical 32)
|
|
||||||
pin: 58
|
|
||||||
gpiochip: 1
|
|
||||||
line: 26
|
|
||||||
DIO3_TCXO_VOLTAGE: true
|
|
||||||
# Only for E22-900M33S:
|
|
||||||
# Limit the output power to 8 dBm
|
|
||||||
# SX126X_MAX_POWER: 8
|
|
||||||
spidev: spidev0.0
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
# MeshAdv Mini E22-900M22S
|
|
||||||
# https://github.com/chrismyers2000/MeshAdv-Mini
|
|
||||||
Meta:
|
|
||||||
name: MeshAdv Mini E22-900M22S
|
|
||||||
support: community
|
|
||||||
compatible:
|
|
||||||
- luckfox-lyra-zero-w # Armbian
|
|
||||||
|
|
||||||
Lora:
|
|
||||||
Module: sx1262 # Ebyte E22-900M22S
|
|
||||||
CS: # GPIO0_B2_d (phys 24, RPi CE0)
|
|
||||||
pin: 10
|
|
||||||
gpiochip: 0
|
|
||||||
line: 10
|
|
||||||
IRQ: # GPIO1_D1_d (phys 36, RPi GPIO16)
|
|
||||||
pin: 57
|
|
||||||
gpiochip: 1
|
|
||||||
line: 25
|
|
||||||
Busy: # GPIO0_C1_d (phys 38, RPi GPIO20)
|
|
||||||
pin: 17
|
|
||||||
gpiochip: 0
|
|
||||||
line: 17
|
|
||||||
Reset: # GPIO0_B4_d (phys 18, RPi GPIO24)
|
|
||||||
pin: 12
|
|
||||||
gpiochip: 0
|
|
||||||
line: 12
|
|
||||||
RXen: # GPIO1_D2_d (phys 32, RPi GPIO12)
|
|
||||||
pin: 58
|
|
||||||
gpiochip: 1
|
|
||||||
line: 26
|
|
||||||
DIO2_AS_RF_SWITCH: true
|
|
||||||
DIO3_TCXO_VOLTAGE: true
|
|
||||||
spidev: spidev0.0
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
Meta:
|
|
||||||
name: RAK6421 + RAK13300 Slot 1
|
|
||||||
support: community # Promote when tested
|
|
||||||
compatible:
|
|
||||||
- luckfox-lyra-zero-w # Armbian
|
|
||||||
|
|
||||||
Lora:
|
|
||||||
Module: sx1262
|
|
||||||
IRQ: # GPIO0_A5 (IO6)
|
|
||||||
pin: 5
|
|
||||||
gpiochip: 0
|
|
||||||
line: 5
|
|
||||||
Reset: # GPIO1_D1 (IO4)
|
|
||||||
pin: 57
|
|
||||||
gpiochip: 1
|
|
||||||
line: 25
|
|
||||||
Busy: # GPIO0_B4 (IO5)
|
|
||||||
pin: 12
|
|
||||||
gpiochip: 0
|
|
||||||
line: 12
|
|
||||||
# Ant_sw: # GPIO1_C2 (IO3)
|
|
||||||
# pin: 50
|
|
||||||
# gpiochip: 1
|
|
||||||
# line: 18
|
|
||||||
Enable_Pins:
|
|
||||||
- pin: 58 # GPIO1_D2
|
|
||||||
gpiochip: 1
|
|
||||||
line: 26
|
|
||||||
- pin: 50 # GPIO1_C2
|
|
||||||
gpiochip: 1
|
|
||||||
line: 18
|
|
||||||
DIO3_TCXO_VOLTAGE: true
|
|
||||||
DIO2_AS_RF_SWITCH: true
|
|
||||||
spidev: spidev0.0
|
|
||||||
# CS: # GPIO0_B2
|
|
||||||
# pin: 10
|
|
||||||
# gpiochip: 0
|
|
||||||
# line: 10
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
Meta:
|
|
||||||
name: RAK6421 + RAK13300 Slot 2
|
|
||||||
support: community # Promote when tested
|
|
||||||
compatible:
|
|
||||||
- luckfox-lyra-zero-w # Armbian
|
|
||||||
|
|
||||||
Lora:
|
|
||||||
Module: sx1262
|
|
||||||
IRQ: # GPIO0_B6 (IO6)
|
|
||||||
pin: 14
|
|
||||||
gpiochip: 0
|
|
||||||
line: 14
|
|
||||||
Reset: # GPIO0_B4 (IO4)
|
|
||||||
pin: 12
|
|
||||||
gpiochip: 0
|
|
||||||
line: 12
|
|
||||||
Busy: # GPIO1_C0 (IO5)
|
|
||||||
pin: 48
|
|
||||||
gpiochip: 1
|
|
||||||
line: 16
|
|
||||||
# Ant_sw: # GPIO0_B5 (IO3)
|
|
||||||
# pin: 13
|
|
||||||
# gpiochip: 0
|
|
||||||
# line: 13
|
|
||||||
Enable_Pins:
|
|
||||||
- pin: 51 # GPIO1_C3
|
|
||||||
gpiochip: 1
|
|
||||||
line: 19
|
|
||||||
- pin: 13 # GPIO0_B5
|
|
||||||
gpiochip: 0
|
|
||||||
line: 13
|
|
||||||
spidev: spidev0.1
|
|
||||||
# CS: # GPIO0_B1
|
|
||||||
# pin: 9
|
|
||||||
# gpiochip: 0
|
|
||||||
# line: 9
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
Meta:
|
|
||||||
name: RAK6421 + RAK13300 Slot 1
|
|
||||||
support: community # Promote when tested
|
|
||||||
compatible:
|
|
||||||
- luckfox-lyra-zero-w # Armbian
|
|
||||||
|
|
||||||
Lora:
|
|
||||||
Module: sx1262
|
|
||||||
IRQ: # GPIO0_A5 (IO6)
|
|
||||||
pin: 5
|
|
||||||
gpiochip: 0
|
|
||||||
line: 5
|
|
||||||
Reset: # GPIO1_D1 (IO4)
|
|
||||||
pin: 57
|
|
||||||
gpiochip: 1
|
|
||||||
line: 25
|
|
||||||
Busy: # GPIO0_B4 (IO5)
|
|
||||||
pin: 12
|
|
||||||
gpiochip: 0
|
|
||||||
line: 12
|
|
||||||
# Ant_sw: # GPIO1_C2 (IO3)
|
|
||||||
# pin: 50
|
|
||||||
# gpiochip: 1
|
|
||||||
# line: 18
|
|
||||||
Enable_Pins:
|
|
||||||
- pin: 58 # GPIO1_D2
|
|
||||||
gpiochip: 1
|
|
||||||
line: 26
|
|
||||||
- pin: 50 # GPIO1_C2
|
|
||||||
gpiochip: 1
|
|
||||||
line: 18
|
|
||||||
DIO3_TCXO_VOLTAGE: true
|
|
||||||
DIO2_AS_RF_SWITCH: true
|
|
||||||
spidev: spidev0.0
|
|
||||||
# CS: # GPIO0_B2
|
|
||||||
# pin: 10
|
|
||||||
# gpiochip: 0
|
|
||||||
# line: 10
|
|
||||||
TX_GAIN_LORA: [9, 9, 10, 11, 9, 8, 9, 10, 10, 10, 11, 12, 12, 12, 12, 12, 12, 12, 12, 10, 9, 8]
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
Meta:
|
|
||||||
name: RAK6421 + RAK13300 Slot 2
|
|
||||||
support: community # Promote when tested
|
|
||||||
compatible:
|
|
||||||
- luckfox-lyra-zero-w # Armbian
|
|
||||||
|
|
||||||
Lora:
|
|
||||||
Module: sx1262
|
|
||||||
IRQ: # GPIO0_B6 (IO6)
|
|
||||||
pin: 14
|
|
||||||
gpiochip: 0
|
|
||||||
line: 14
|
|
||||||
Reset: # GPIO0_B4 (IO4)
|
|
||||||
pin: 12
|
|
||||||
gpiochip: 0
|
|
||||||
line: 12
|
|
||||||
Busy: # GPIO1_C0 (IO5)
|
|
||||||
pin: 48
|
|
||||||
gpiochip: 1
|
|
||||||
line: 16
|
|
||||||
# Ant_sw: # GPIO0_B5 (IO3)
|
|
||||||
# pin: 13
|
|
||||||
# gpiochip: 0
|
|
||||||
# line: 13
|
|
||||||
Enable_Pins:
|
|
||||||
- pin: 51 # GPIO1_C3
|
|
||||||
gpiochip: 1
|
|
||||||
line: 19
|
|
||||||
- pin: 13 # GPIO0_B5
|
|
||||||
gpiochip: 0
|
|
||||||
line: 13
|
|
||||||
spidev: spidev0.1
|
|
||||||
# CS: # GPIO0_B1
|
|
||||||
# pin: 9
|
|
||||||
# gpiochip: 0
|
|
||||||
# line: 9
|
|
||||||
TX_GAIN_LORA: [9, 9, 10, 11, 9, 8, 9, 10, 10, 10, 11, 12, 12, 12, 12, 12, 12, 12, 12, 10, 9, 8]
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
Meta:
|
|
||||||
name: Waveshare SX1262
|
|
||||||
support: deprecated
|
|
||||||
compatible:
|
|
||||||
- luckfox-lyra-zero-w # Armbian
|
|
||||||
|
|
||||||
Lora:
|
|
||||||
Module: sx1262 # Waveshare SX126X XXXM
|
|
||||||
DIO2_AS_RF_SWITCH: true
|
|
||||||
CS: # GPIO0_C2 (physical 40)
|
|
||||||
pin: 18
|
|
||||||
gpiochip: 0
|
|
||||||
line: 18
|
|
||||||
IRQ: # GPIO1_D1 (physical 36)
|
|
||||||
pin: 57
|
|
||||||
gpiochip: 1
|
|
||||||
line: 25
|
|
||||||
Busy: # GPIO0_C1 (physical 38)
|
|
||||||
pin: 17
|
|
||||||
gpiochip: 0
|
|
||||||
line: 17
|
|
||||||
Reset: # GPIO0_B6 (physical 12)
|
|
||||||
pin: 14
|
|
||||||
gpiochip: 0
|
|
||||||
line: 14
|
|
||||||
SX126X_ANT_SW: # GPIO1_B3 (physical 31)
|
|
||||||
pin: 43
|
|
||||||
gpiochip: 1
|
|
||||||
line: 11
|
|
||||||
spidev: spidev0.0
|
|
||||||
@@ -1,9 +1,3 @@
|
|||||||
Meta:
|
|
||||||
name: Lora Meshstick SX1262
|
|
||||||
support: official
|
|
||||||
compatible:
|
|
||||||
- usb
|
|
||||||
|
|
||||||
Lora:
|
Lora:
|
||||||
Module: sx1262
|
Module: sx1262
|
||||||
CS: 0
|
CS: 0
|
||||||
|
|||||||
@@ -1,41 +0,0 @@
|
|||||||
# !! WARNING: Hats on the OK3506 board are installed "backwards" (facing outwards)
|
|
||||||
|
|
||||||
# MeshAdv-Pi E22-900M30S
|
|
||||||
# https://github.com/chrismyers2000/MeshAdv-Pi-Hat
|
|
||||||
Meta:
|
|
||||||
name: MeshAdv-Pi E22-900M30S
|
|
||||||
support: community
|
|
||||||
compatible:
|
|
||||||
- forlinx-ok3506-s12 # Armbian
|
|
||||||
|
|
||||||
Lora:
|
|
||||||
Module: sx1262
|
|
||||||
CS: # GPIO0_B0 (physical 40)
|
|
||||||
pin: 8
|
|
||||||
gpiochip: 0
|
|
||||||
line: 8
|
|
||||||
IRQ: # GPIO3_B0 (physical 36)
|
|
||||||
pin: 104
|
|
||||||
gpiochip: 3
|
|
||||||
line: 8
|
|
||||||
Busy: # GPIO0_B1 (physical 38)
|
|
||||||
pin: 9
|
|
||||||
gpiochip: 0
|
|
||||||
line: 9
|
|
||||||
Reset: # GPIO0_B6 (physical 12)
|
|
||||||
pin: 14
|
|
||||||
gpiochip: 0
|
|
||||||
line: 14
|
|
||||||
TXen: # GPIO0_A3 (physical 33)
|
|
||||||
pin: 3
|
|
||||||
gpiochip: 0
|
|
||||||
line: 3
|
|
||||||
RXen: # GPIO0_A2 (physical 32)
|
|
||||||
pin: 2
|
|
||||||
gpiochip: 0
|
|
||||||
line: 2
|
|
||||||
DIO3_TCXO_VOLTAGE: true
|
|
||||||
# Only for E22-900M33S:
|
|
||||||
# Limit the output power to 8 dBm
|
|
||||||
# SX126X_MAX_POWER: 8
|
|
||||||
spidev: spidev0.0
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
# !! WARNING: Hats on the OK3506 board are installed "backwards" (facing outwards)
|
|
||||||
|
|
||||||
# MeshAdv Mini E22-900M22S
|
|
||||||
# https://github.com/chrismyers2000/MeshAdv-Mini
|
|
||||||
Meta:
|
|
||||||
name: MeshAdv Mini E22-900M22S
|
|
||||||
support: community
|
|
||||||
compatible:
|
|
||||||
- forlinx-ok3506-s12 # Armbian
|
|
||||||
|
|
||||||
Lora:
|
|
||||||
Module: sx1262 # Ebyte E22-900M22S
|
|
||||||
CS: # GPIO0_C3 (physical 24, SPI0_CSN0)
|
|
||||||
pin: 19
|
|
||||||
gpiochip: 0
|
|
||||||
line: 19
|
|
||||||
IRQ: # GPIO3_B0 (physical 36)
|
|
||||||
pin: 104
|
|
||||||
gpiochip: 3
|
|
||||||
line: 8
|
|
||||||
Busy: # GPIO0_B1 (physical 38)
|
|
||||||
pin: 9
|
|
||||||
gpiochip: 0
|
|
||||||
line: 9
|
|
||||||
Reset: # GPIO3_A6 (physical 18)
|
|
||||||
pin: 102
|
|
||||||
gpiochip: 3
|
|
||||||
line: 6
|
|
||||||
RXen: # GPIO0_A2 (physical 32)
|
|
||||||
pin: 2
|
|
||||||
gpiochip: 0
|
|
||||||
line: 2
|
|
||||||
DIO2_AS_RF_SWITCH: true
|
|
||||||
DIO3_TCXO_VOLTAGE: true
|
|
||||||
spidev: spidev0.0
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
# !! WARNING: Hats on the OK3506 board are installed "backwards" (facing outwards)
|
|
||||||
|
|
||||||
Meta:
|
|
||||||
name: RAK6421 + RAK13300 Slot 1
|
|
||||||
support: community # Promote when tested
|
|
||||||
compatible:
|
|
||||||
- forlinx-ok3506-s12 # Armbian
|
|
||||||
|
|
||||||
Lora:
|
|
||||||
Module: sx1262
|
|
||||||
IRQ: # GPIO3_B5 (IO6, physical 15)
|
|
||||||
pin: 109
|
|
||||||
gpiochip: 3
|
|
||||||
line: 13
|
|
||||||
Reset: # GPIO3_B0 (IO4, physical 36)
|
|
||||||
pin: 104
|
|
||||||
gpiochip: 3
|
|
||||||
line: 8
|
|
||||||
Busy: # GPIO3_A6 (IO5, physical 18)
|
|
||||||
pin: 102
|
|
||||||
gpiochip: 3
|
|
||||||
line: 6
|
|
||||||
# Ant_sw: # GPIO0_A3 (IO3, physical 33)
|
|
||||||
# pin: 3
|
|
||||||
# gpiochip: 0
|
|
||||||
# line: 3
|
|
||||||
Enable_Pins:
|
|
||||||
- pin: 2 # GPIO0_A2 (physical 32)
|
|
||||||
gpiochip: 0
|
|
||||||
line: 2
|
|
||||||
- pin: 3 # GPIO0_A3 (physical 33)
|
|
||||||
gpiochip: 0
|
|
||||||
line: 3
|
|
||||||
DIO3_TCXO_VOLTAGE: true
|
|
||||||
DIO2_AS_RF_SWITCH: true
|
|
||||||
spidev: spidev0.0
|
|
||||||
# CS: # GPIO0_C3 (SPI0_CSN0, physical 24)
|
|
||||||
# pin: 19
|
|
||||||
# gpiochip: 0
|
|
||||||
# line: 19
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
# !! WARNING: Hats on the OK3506 board are installed "backwards" (facing outwards)
|
|
||||||
|
|
||||||
Meta:
|
|
||||||
name: RAK6421 + RAK13300 Slot 2
|
|
||||||
support: community # Promote when tested
|
|
||||||
compatible:
|
|
||||||
- forlinx-ok3506-s12 # Armbian
|
|
||||||
|
|
||||||
Lora:
|
|
||||||
Module: sx1262
|
|
||||||
IRQ: # GPIO0_B6 (IO6, physical 12)
|
|
||||||
pin: 14
|
|
||||||
gpiochip: 0
|
|
||||||
line: 14
|
|
||||||
Reset: # GPIO3_A6 (IO4, physical 18)
|
|
||||||
pin: 102
|
|
||||||
gpiochip: 3
|
|
||||||
line: 6
|
|
||||||
Busy: # GPIO0_B2 (IO5, physical 35)
|
|
||||||
pin: 10
|
|
||||||
gpiochip: 0
|
|
||||||
line: 10
|
|
||||||
# Ant_sw: # GPIO3_A7 (IO3, physical 16)
|
|
||||||
# pin: 103
|
|
||||||
# gpiochip: 3
|
|
||||||
# line: 7
|
|
||||||
Enable_Pins:
|
|
||||||
- pin: 106 # GPIO3_B2 (physical 37)
|
|
||||||
gpiochip: 3
|
|
||||||
line: 10
|
|
||||||
- pin: 103 # GPIO3_A7 (physical 16)
|
|
||||||
gpiochip: 3
|
|
||||||
line: 7
|
|
||||||
spidev: spidev0.1
|
|
||||||
# CS: # GPIO0_B7 (SPI0_CSN1, physical 26)
|
|
||||||
# pin: 15
|
|
||||||
# gpiochip: 0
|
|
||||||
# line: 15
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
# !! WARNING: Hats on the OK3506 board are installed "backwards" (facing outwards)
|
|
||||||
|
|
||||||
Meta:
|
|
||||||
name: RAK6421 + RAK13302 Slot 1
|
|
||||||
support: community # Promote when tested
|
|
||||||
compatible:
|
|
||||||
- forlinx-ok3506-s12 # Armbian
|
|
||||||
|
|
||||||
Lora:
|
|
||||||
Module: sx1262
|
|
||||||
IRQ: # GPIO3_B5 (IO6, physical 15)
|
|
||||||
pin: 109
|
|
||||||
gpiochip: 3
|
|
||||||
line: 13
|
|
||||||
Reset: # GPIO3_B0 (IO4, physical 36)
|
|
||||||
pin: 104
|
|
||||||
gpiochip: 3
|
|
||||||
line: 8
|
|
||||||
Busy: # GPIO3_A6 (IO5, physical 18)
|
|
||||||
pin: 102
|
|
||||||
gpiochip: 3
|
|
||||||
line: 6
|
|
||||||
# Ant_sw: # GPIO0_A3 (IO3, physical 33)
|
|
||||||
# pin: 3
|
|
||||||
# gpiochip: 0
|
|
||||||
# line: 3
|
|
||||||
Enable_Pins:
|
|
||||||
- pin: 2 # GPIO0_A2 (physical 32)
|
|
||||||
gpiochip: 0
|
|
||||||
line: 2
|
|
||||||
- pin: 3 # GPIO0_A3 (physical 33)
|
|
||||||
gpiochip: 0
|
|
||||||
line: 3
|
|
||||||
DIO3_TCXO_VOLTAGE: true
|
|
||||||
DIO2_AS_RF_SWITCH: true
|
|
||||||
spidev: spidev0.0
|
|
||||||
# CS: # GPIO0_C3 (SPI0_CSN0, physical 24)
|
|
||||||
# pin: 19
|
|
||||||
# gpiochip: 0
|
|
||||||
# line: 19
|
|
||||||
TX_GAIN_LORA: [9, 9, 10, 11, 9, 8, 9, 10, 10, 10, 11, 12, 12, 12, 12, 12, 12, 12, 12, 10, 9, 8]
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
# !! WARNING: Hats on the OK3506 board are installed "backwards" (facing outwards)
|
|
||||||
|
|
||||||
Meta:
|
|
||||||
name: RAK6421 + RAK13302 Slot 2
|
|
||||||
support: community # Promote when tested
|
|
||||||
compatible:
|
|
||||||
- forlinx-ok3506-s12 # Armbian
|
|
||||||
|
|
||||||
Lora:
|
|
||||||
Module: sx1262
|
|
||||||
IRQ: # GPIO0_B6 (IO6, physical 12)
|
|
||||||
pin: 14
|
|
||||||
gpiochip: 0
|
|
||||||
line: 14
|
|
||||||
Reset: # GPIO3_A6 (IO4, physical 18)
|
|
||||||
pin: 102
|
|
||||||
gpiochip: 3
|
|
||||||
line: 6
|
|
||||||
Busy: # GPIO0_B2 (IO5, physical 35)
|
|
||||||
pin: 10
|
|
||||||
gpiochip: 0
|
|
||||||
line: 10
|
|
||||||
# Ant_sw: # GPIO3_A7 (IO3, physical 16)
|
|
||||||
# pin: 103
|
|
||||||
# gpiochip: 3
|
|
||||||
# line: 7
|
|
||||||
Enable_Pins:
|
|
||||||
- pin: 106 # GPIO3_B2 (physical 37)
|
|
||||||
gpiochip: 3
|
|
||||||
line: 10
|
|
||||||
- pin: 103 # GPIO3_A7 (physical 16)
|
|
||||||
gpiochip: 3
|
|
||||||
line: 7
|
|
||||||
spidev: spidev0.1
|
|
||||||
# CS: # GPIO0_B7 (SPI0_CSN1, physical 26)
|
|
||||||
# pin: 15
|
|
||||||
# gpiochip: 0
|
|
||||||
# line: 15
|
|
||||||
TX_GAIN_LORA: [9, 9, 10, 11, 9, 8, 9, 10, 10, 10, 11, 12, 12, 12, 12, 12, 12, 12, 12, 10, 9, 8]
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
# !! WARNING: Hats on the OK3506 board are installed "backwards" (facing outwards)
|
|
||||||
|
|
||||||
Meta:
|
|
||||||
name: Waveshare SX1262
|
|
||||||
support: deprecated
|
|
||||||
compatible:
|
|
||||||
- forlinx-ok3506-s12 # Armbian
|
|
||||||
|
|
||||||
Lora:
|
|
||||||
Module: sx1262 # Waveshare SX126X XXXM
|
|
||||||
DIO2_AS_RF_SWITCH: true
|
|
||||||
CS: # GPIO0_B0 (physical 40)
|
|
||||||
pin: 8
|
|
||||||
gpiochip: 0
|
|
||||||
line: 8
|
|
||||||
IRQ: # GPIO3_B0 (physical 36)
|
|
||||||
pin: 104
|
|
||||||
gpiochip: 3
|
|
||||||
line: 8
|
|
||||||
Busy: # GPIO0_B1 (physical 38)
|
|
||||||
pin: 9
|
|
||||||
gpiochip: 0
|
|
||||||
line: 9
|
|
||||||
Reset: # GPIO0_B6 (physical 12)
|
|
||||||
pin: 14
|
|
||||||
gpiochip: 0
|
|
||||||
line: 14
|
|
||||||
SX126X_ANT_SW: # GPIO3_B3 (physical 31)
|
|
||||||
pin: 107
|
|
||||||
gpiochip: 3
|
|
||||||
line: 11
|
|
||||||
spidev: spidev0.0
|
|
||||||
@@ -1,9 +1,3 @@
|
|||||||
Meta:
|
|
||||||
name: Lora Meshstick SX1262
|
|
||||||
support: community
|
|
||||||
compatible:
|
|
||||||
- usb
|
|
||||||
|
|
||||||
Lora:
|
Lora:
|
||||||
Module: lr1121
|
Module: lr1121
|
||||||
CS: 0
|
CS: 0
|
||||||
|
|||||||
@@ -1,11 +1,5 @@
|
|||||||
Meta:
|
|
||||||
name: Pinedio USB SX1262
|
|
||||||
support: deprecated
|
|
||||||
compatible:
|
|
||||||
- usb
|
|
||||||
|
|
||||||
Lora:
|
Lora:
|
||||||
Module: sx1262
|
Module: sx1262
|
||||||
CS: 0
|
CS: 0
|
||||||
IRQ: 10
|
IRQ: 10
|
||||||
spidev: ch341
|
spidev: ch341
|
||||||
@@ -1,9 +1,3 @@
|
|||||||
Meta:
|
|
||||||
name: raxda-rock2f-starter-edition-hat
|
|
||||||
support: community
|
|
||||||
compatible:
|
|
||||||
- rock-2f # Armbian
|
|
||||||
|
|
||||||
Lora:
|
Lora:
|
||||||
|
|
||||||
### Raxda Rock 2F running Armbian Linux 6.1.99-vendor-rk35xx
|
### Raxda Rock 2F running Armbian Linux 6.1.99-vendor-rk35xx
|
||||||
|
|||||||
@@ -1,11 +1,5 @@
|
|||||||
# https://www.waveshare.com/core1262-868m.htm
|
# https://www.waveshare.com/core1262-868m.htm
|
||||||
# https://github.com/markbirss/lora-starter-edition-sx1262-i2c
|
# https://github.com/markbirss/lora-starter-edition-sx1262-i2c
|
||||||
Meta:
|
|
||||||
name: lora-starter-edition-sx1262-i2c
|
|
||||||
support: community
|
|
||||||
compatible:
|
|
||||||
- raspberry-pi
|
|
||||||
|
|
||||||
Lora:
|
Lora:
|
||||||
Module: sx1262 # Starter Edition SX1262 I2C Raspberry Pi HAT
|
Module: sx1262 # Starter Edition SX1262 I2C Raspberry Pi HAT
|
||||||
DIO2_AS_RF_SWITCH: true
|
DIO2_AS_RF_SWITCH: true
|
||||||
|
|||||||
@@ -1,9 +1,3 @@
|
|||||||
Meta:
|
|
||||||
name: meshstick-1262
|
|
||||||
support: official
|
|
||||||
compatible:
|
|
||||||
- usb
|
|
||||||
|
|
||||||
Lora:
|
Lora:
|
||||||
Module: sx1262
|
Module: sx1262
|
||||||
CS: 0
|
CS: 0
|
||||||
|
|||||||
@@ -1,9 +1,3 @@
|
|||||||
Meta:
|
|
||||||
name: meshtoad-e22
|
|
||||||
support: official
|
|
||||||
compatible:
|
|
||||||
- usb
|
|
||||||
|
|
||||||
Lora:
|
Lora:
|
||||||
Module: sx1262
|
Module: sx1262
|
||||||
CS: 0
|
CS: 0
|
||||||
|
|||||||
@@ -1,9 +1,3 @@
|
|||||||
Meta:
|
|
||||||
name: umesh-1262-30dbm
|
|
||||||
support: community
|
|
||||||
compatible:
|
|
||||||
- clockwork-uconsole
|
|
||||||
|
|
||||||
Lora:
|
Lora:
|
||||||
Module: sx1262
|
Module: sx1262
|
||||||
CS: 0
|
CS: 0
|
||||||
|
|||||||
@@ -1,9 +1,3 @@
|
|||||||
Meta:
|
|
||||||
name: umesh-1268-30dbm
|
|
||||||
support: community
|
|
||||||
compatible:
|
|
||||||
- clockwork-uconsole
|
|
||||||
|
|
||||||
Lora:
|
Lora:
|
||||||
Module: sx1268
|
Module: sx1268
|
||||||
CS: 0
|
CS: 0
|
||||||
|
|||||||
@@ -1,9 +1,3 @@
|
|||||||
Meta:
|
|
||||||
name: Waveshare SX1262
|
|
||||||
support: deprecated
|
|
||||||
compatible:
|
|
||||||
- raspberry-pi
|
|
||||||
|
|
||||||
Lora:
|
Lora:
|
||||||
Module: sx1262 # Waveshare SX126X XXXM
|
Module: sx1262 # Waveshare SX126X XXXM
|
||||||
DIO2_AS_RF_SWITCH: true
|
DIO2_AS_RF_SWITCH: true
|
||||||
|
|||||||
@@ -1,12 +1,5 @@
|
|||||||
# https://www.waveshare.com/pico-lora-sx1262-868m.htm
|
# https://www.waveshare.com/pico-lora-sx1262-868m.htm
|
||||||
# https://github.com/markbirss/lora-ws-raspberry-pi-pico-to-rpi-adapter
|
# https://github.com/markbirss/lora-ws-raspberry-pi-pico-to-rpi-adapter
|
||||||
|
|
||||||
Meta:
|
|
||||||
name: ws-raspberry-pico-to-rpi-adapter
|
|
||||||
support: community
|
|
||||||
compatible:
|
|
||||||
- raspberry-pi
|
|
||||||
|
|
||||||
Lora:
|
Lora:
|
||||||
Module: sx1262 # Waveshare Raspberry Pi Pico to Raspberry Pi HAT Adapter
|
Module: sx1262 # Waveshare Raspberry Pi Pico to Raspberry Pi HAT Adapter
|
||||||
DIO2_AS_RF_SWITCH: true
|
DIO2_AS_RF_SWITCH: true
|
||||||
|
|||||||
@@ -15,12 +15,6 @@
|
|||||||
# 5 CS 24
|
# 5 CS 24
|
||||||
# 26 DIO1/IRQ 26
|
# 26 DIO1/IRQ 26
|
||||||
|
|
||||||
Meta:
|
|
||||||
name: ws-raspberry-pico-to-orangepi-03
|
|
||||||
support: community
|
|
||||||
compatible:
|
|
||||||
- orange-pi-zero-3 # Armbian
|
|
||||||
|
|
||||||
Lora:
|
Lora:
|
||||||
Module: sx1262 # Waveshare Raspberry Pico Lora module
|
Module: sx1262 # Waveshare Raspberry Pico Lora module
|
||||||
DIO2_AS_RF_SWITCH: true
|
DIO2_AS_RF_SWITCH: true
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ for pio_env in pio_envs:
|
|||||||
env = {
|
env = {
|
||||||
"ci": {"board": pio_env, "platform": env_platform},
|
"ci": {"board": pio_env, "platform": env_platform},
|
||||||
"board_level": cfg.get(f"env:{pio_env}", "board_level", default=None),
|
"board_level": cfg.get(f"env:{pio_env}", "board_level", default=None),
|
||||||
"board_check": cfg.get(f"env:{pio_env}", "board_check", default="false").strip().lower() == "true",
|
"board_check": bool(cfg.get(f"env:{pio_env}", "board_check", default=False)),
|
||||||
}
|
}
|
||||||
all_envs.append(env)
|
all_envs.append(env)
|
||||||
|
|
||||||
|
|||||||
@@ -87,9 +87,6 @@
|
|||||||
</screenshots>
|
</screenshots>
|
||||||
|
|
||||||
<releases>
|
<releases>
|
||||||
<release version="2.7.22" date="2026-04-06">
|
|
||||||
<url type="details">https://github.com/meshtastic/firmware/releases?q=tag%3Av2.7.22</url>
|
|
||||||
</release>
|
|
||||||
<release version="2.7.21" date="2026-03-11">
|
<release version="2.7.21" date="2026-03-11">
|
||||||
<url type="details">https://github.com/meshtastic/firmware/releases?q=tag%3Av2.7.21</url>
|
<url type="details">https://github.com/meshtastic/firmware/releases?q=tag%3Av2.7.21</url>
|
||||||
</release>
|
</release>
|
||||||
|
|||||||
@@ -1,38 +0,0 @@
|
|||||||
{
|
|
||||||
"build": {
|
|
||||||
"arduino": {
|
|
||||||
"ldscript": "esp32s3_out.ld",
|
|
||||||
"memory_type": "qio_opi",
|
|
||||||
"partitions": "default_16MB.csv"
|
|
||||||
},
|
|
||||||
"core": "esp32",
|
|
||||||
"extra_flags": [
|
|
||||||
"-DBOARD_HAS_PSRAM",
|
|
||||||
"-DARDUINO_RUNNING_CORE=1",
|
|
||||||
"-DARDUINO_EVENT_RUNNING_CORE=0",
|
|
||||||
"-DARDUINO_USB_CDC_ON_BOOT=1",
|
|
||||||
"-DARDUINO_USB_MODE=1"
|
|
||||||
],
|
|
||||||
"f_cpu": "240000000L",
|
|
||||||
"f_flash": "80000000L",
|
|
||||||
"flash_mode": "qio",
|
|
||||||
"hwids": [["0x303A", "0x1001"]],
|
|
||||||
"mcu": "esp32s3",
|
|
||||||
"variant": "esp32s3"
|
|
||||||
},
|
|
||||||
"connectivity": ["wifi", "bluetooth", "lora"],
|
|
||||||
"debug": {
|
|
||||||
"openocd_target": "esp32s3.cfg"
|
|
||||||
},
|
|
||||||
"frameworks": ["arduino", "espidf"],
|
|
||||||
"name": "LilyGo T5-ePaper-S3",
|
|
||||||
"upload": {
|
|
||||||
"flash_size": "16MB",
|
|
||||||
"maximum_ram_size": 327680,
|
|
||||||
"maximum_size": 16777216,
|
|
||||||
"require_upload_port": true,
|
|
||||||
"speed": 921600
|
|
||||||
},
|
|
||||||
"url": "https://lilygo.cc/products/t5-e-paper-s3-pro",
|
|
||||||
"vendor": "LILYGO"
|
|
||||||
}
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
{
|
|
||||||
"build": {
|
|
||||||
"arduino": {
|
|
||||||
"ldscript": "esp32_out.ld"
|
|
||||||
},
|
|
||||||
"core": "esp32",
|
|
||||||
"extra_flags": "-DARDUINO_T_Beam",
|
|
||||||
"f_cpu": "240000000L",
|
|
||||||
"f_flash": "40000000L",
|
|
||||||
"flash_mode": "dio",
|
|
||||||
"mcu": "esp32",
|
|
||||||
"variant": "tbeam"
|
|
||||||
},
|
|
||||||
"connectivity": ["wifi", "bluetooth", "can", "ethernet"],
|
|
||||||
"debug": {
|
|
||||||
"openocd_board": "esp-wroom-32.cfg"
|
|
||||||
},
|
|
||||||
"frameworks": ["arduino", "espidf"],
|
|
||||||
"name": "TTGO T-Beam (PSRAM Disabled)",
|
|
||||||
"upload": {
|
|
||||||
"flash_size": "4MB",
|
|
||||||
"maximum_ram_size": 1310720,
|
|
||||||
"maximum_size": 4194304,
|
|
||||||
"require_upload_port": true,
|
|
||||||
"speed": 460800
|
|
||||||
},
|
|
||||||
"url": "https://github.com/LilyGO/TTGO-T-Beam",
|
|
||||||
"vendor": "TTGO"
|
|
||||||
}
|
|
||||||
Vendored
-6
@@ -1,9 +1,3 @@
|
|||||||
meshtasticd (2.7.22.0) unstable; urgency=medium
|
|
||||||
|
|
||||||
* Version 2.7.22
|
|
||||||
|
|
||||||
-- GitHub Actions <github-actions[bot]@users.noreply.github.com> Mon, 06 Apr 2026 11:34:12 +0000
|
|
||||||
|
|
||||||
meshtasticd (2.7.21.0) unstable; urgency=medium
|
meshtasticd (2.7.21.0) unstable; urgency=medium
|
||||||
|
|
||||||
* Version 2.7.21
|
* Version 2.7.21
|
||||||
|
|||||||
+98
-108
@@ -77,10 +77,10 @@ lib_deps =
|
|||||||
https://github.com/meshtastic/TinyGPSPlus/archive/71a82db35f3b973440044c476d4bcdc673b104f4.zip
|
https://github.com/meshtastic/TinyGPSPlus/archive/71a82db35f3b973440044c476d4bcdc673b104f4.zip
|
||||||
# renovate: datasource=git-refs depName=meshtastic-ArduinoThread packageName=https://github.com/meshtastic/ArduinoThread gitBranch=master
|
# renovate: datasource=git-refs depName=meshtastic-ArduinoThread packageName=https://github.com/meshtastic/ArduinoThread gitBranch=master
|
||||||
https://github.com/meshtastic/ArduinoThread/archive/b841b0415721f1341ea41cccfb4adccfaf951567.zip
|
https://github.com/meshtastic/ArduinoThread/archive/b841b0415721f1341ea41cccfb4adccfaf951567.zip
|
||||||
# renovate: datasource=github-tags depName=Nanopb packageName=nanopb/nanopb
|
# renovate: datasource=custom.pio depName=Nanopb packageName=nanopb/library/Nanopb
|
||||||
https://github.com/nanopb/nanopb/archive/refs/tags/nanopb-0.4.9.1.zip
|
nanopb/Nanopb@0.4.91
|
||||||
# renovate: datasource=github-tags depName=ErriezCRC32 packageName=Erriez/ErriezCRC32
|
# renovate: datasource=custom.pio depName=ErriezCRC32 packageName=erriez/library/ErriezCRC32
|
||||||
https://github.com/Erriez/ErriezCRC32/archive/refs/tags/1.0.1.zip
|
erriez/ErriezCRC32@1.0.1
|
||||||
|
|
||||||
; Used for the code analysis in PIO Home / Inspect
|
; Used for the code analysis in PIO Home / Inspect
|
||||||
check_tool = cppcheck
|
check_tool = cppcheck
|
||||||
@@ -95,153 +95,143 @@ check_flags =
|
|||||||
framework = arduino
|
framework = arduino
|
||||||
lib_deps =
|
lib_deps =
|
||||||
${env.lib_deps}
|
${env.lib_deps}
|
||||||
# renovate: datasource=github-tags depName=NonBlockingRTTTL packageName=end2endzone/NonBlockingRTTTL
|
# renovate: datasource=custom.pio depName=NonBlockingRTTTL packageName=end2endzone/library/NonBlockingRTTTL
|
||||||
https://github.com/end2endzone/NonBlockingRTTTL/archive/refs/tags/1.4.0.zip
|
end2endzone/NonBlockingRTTTL@1.4.0
|
||||||
build_unflags =
|
build_unflags =
|
||||||
-std=c++11
|
-std=c++11
|
||||||
-std=gnu++11
|
-std=gnu++11
|
||||||
build_flags = ${env.build_flags} -Os
|
build_flags = ${env.build_flags} -Os
|
||||||
-std=gnu++17
|
-std=gnu++17
|
||||||
build_src_filter = ${env.build_src_filter} -<platform/portduino/> -<graphics/niche/> -<modules/Native/>
|
build_src_filter = ${env.build_src_filter} -<platform/portduino/> -<graphics/niche/>
|
||||||
|
|
||||||
; Common libs for communicating over TCP/IP networks such as MQTT
|
; Common libs for communicating over TCP/IP networks such as MQTT
|
||||||
[networking_base]
|
[networking_base]
|
||||||
lib_deps =
|
lib_deps =
|
||||||
# renovate: datasource=github-tags depName=TBPubSubClient packageName=thingsboard/pubsubclient
|
# renovate: datasource=custom.pio depName=TBPubSubClient packageName=thingsboard/library/TBPubSubClient
|
||||||
https://github.com/thingsboard/pubsubclient/archive/refs/tags/v2.12.1.zip
|
thingsboard/TBPubSubClient@2.12.1
|
||||||
# renovate: datasource=github-tags depName=NTPClient packageName=arduino-libraries/NTPClient
|
# renovate: datasource=custom.pio depName=NTPClient packageName=arduino-libraries/library/NTPClient
|
||||||
https://github.com/arduino-libraries/NTPClient/archive/refs/tags/3.2.1.zip
|
arduino-libraries/NTPClient@3.2.1
|
||||||
|
|
||||||
; Extra TCP/IP networking libs for supported devices
|
; Extra TCP/IP networking libs for supported devices
|
||||||
[networking_extra]
|
[networking_extra]
|
||||||
lib_deps =
|
lib_deps =
|
||||||
# renovate: datasource=github-tags depName=Syslog packageName=arcao/Syslog
|
# renovate: datasource=custom.pio depName=Syslog packageName=arcao/library/Syslog
|
||||||
https://github.com/arcao/Syslog/archive/refs/tags/v2.0.zip
|
arcao/Syslog@2.0.0
|
||||||
|
|
||||||
[radiolib_base]
|
[radiolib_base]
|
||||||
lib_deps =
|
lib_deps =
|
||||||
# renovate: datasource=github-tags depName=RadioLib packageName=jgromes/RadioLib
|
# renovate: datasource=custom.pio depName=RadioLib packageName=jgromes/library/RadioLib
|
||||||
https://github.com/jgromes/RadioLib/archive/refs/tags/7.6.0.zip
|
jgromes/RadioLib@7.6.0
|
||||||
|
|
||||||
[device-ui_base]
|
[device-ui_base]
|
||||||
lib_deps =
|
lib_deps =
|
||||||
# renovate: datasource=git-refs depName=meshtastic/device-ui packageName=https://github.com/meshtastic/device-ui gitBranch=master
|
# renovate: datasource=git-refs depName=meshtastic/device-ui packageName=https://github.com/meshtastic/device-ui gitBranch=master
|
||||||
https://github.com/meshtastic/device-ui/archive/1897dd17fceb1f101bb1a3245680aa3439edcfdd.zip
|
https://github.com/meshtastic/device-ui/archive/de2e490882105fc2778d761740d9a1711d1dab78.zip
|
||||||
|
|
||||||
; Common libs for environmental measurements in telemetry module
|
; Common libs for environmental measurements in telemetry module
|
||||||
[environmental_base]
|
[environmental_base]
|
||||||
lib_deps =
|
lib_deps =
|
||||||
# renovate: datasource=github-tags depName=Adafruit BusIO packageName=adafruit/Adafruit_BusIO
|
# renovate: datasource=custom.pio depName=Adafruit BusIO packageName=adafruit/library/Adafruit BusIO
|
||||||
https://github.com/adafruit/Adafruit_BusIO/archive/refs/tags/1.17.4.zip
|
adafruit/Adafruit BusIO@1.17.4
|
||||||
# renovate: datasource=github-tags depName=Adafruit Unified Sensor packageName=adafruit/Adafruit_Sensor
|
# renovate: datasource=custom.pio depName=Adafruit Unified Sensor packageName=adafruit/library/Adafruit Unified Sensor
|
||||||
https://github.com/adafruit/Adafruit_Sensor/archive/refs/tags/1.1.15.zip
|
adafruit/Adafruit Unified Sensor@1.1.15
|
||||||
# renovate: datasource=github-tags depName=Adafruit GFX packageName=adafruit/Adafruit-GFX-Library
|
# renovate: datasource=custom.pio depName=Adafruit BMP280 packageName=adafruit/library/Adafruit BMP280 Library
|
||||||
https://github.com/adafruit/Adafruit-GFX-Library/archive/refs/tags/1.12.6.zip
|
adafruit/Adafruit BMP280 Library@3.0.0
|
||||||
# renovate: datasource=github-tags depName=NeoPixel packageName=adafruit/Adafruit_NeoPixel
|
# renovate: datasource=custom.pio depName=Adafruit BMP085 packageName=adafruit/library/Adafruit BMP085 Library
|
||||||
https://github.com/adafruit/Adafruit_NeoPixel/archive/refs/tags/1.15.4.zip
|
adafruit/Adafruit BMP085 Library@1.2.4
|
||||||
# renovate: datasource=github-tags depName=Adafruit SSD1306 packageName=adafruit/Adafruit_SSD1306
|
# renovate: datasource=custom.pio depName=Adafruit BME280 packageName=adafruit/library/Adafruit BME280 Library
|
||||||
https://github.com/adafruit/Adafruit_SSD1306/archive/refs/tags/2.5.16.zip
|
adafruit/Adafruit BME280 Library@2.3.0
|
||||||
# renovate: datasource=github-tags depName=Adafruit BMP280 packageName=adafruit/Adafruit_BMP280_Library
|
# renovate: datasource=custom.pio depName=Adafruit DPS310 packageName=adafruit/library/Adafruit DPS310
|
||||||
https://github.com/adafruit/Adafruit_BMP280_Library/archive/refs/tags/3.0.0.zip
|
adafruit/Adafruit DPS310@1.1.6
|
||||||
# renovate: datasource=github-tags depName=Adafruit BMP085 packageName=adafruit/Adafruit-BMP085-Library
|
# renovate: datasource=custom.pio depName=Adafruit MCP9808 packageName=adafruit/library/Adafruit MCP9808 Library
|
||||||
https://github.com/adafruit/Adafruit-BMP085-Library/archive/refs/tags/1.2.4.zip
|
adafruit/Adafruit MCP9808 Library@2.0.2
|
||||||
# renovate: datasource=github-tags depName=Adafruit BME280 packageName=adafruit/Adafruit_BME280_Library
|
# renovate: datasource=custom.pio depName=Adafruit INA260 packageName=adafruit/library/Adafruit INA260 Library
|
||||||
https://github.com/adafruit/Adafruit_BME280_Library/archive/refs/tags/2.3.0.zip
|
adafruit/Adafruit INA260 Library@1.5.3
|
||||||
# renovate: datasource=github-tags depName=Adafruit DPS310 packageName=adafruit/Adafruit_DPS310
|
# renovate: datasource=custom.pio depName=Adafruit INA219 packageName=adafruit/library/Adafruit INA219
|
||||||
https://github.com/adafruit/Adafruit_DPS310/archive/refs/tags/1.1.6.zip
|
adafruit/Adafruit INA219@1.2.3
|
||||||
# renovate: datasource=github-tags depName=Adafruit SH110x packageName=adafruit/Adafruit_SH110x
|
# renovate: datasource=custom.pio depName=Adafruit MPU6050 packageName=adafruit/library/Adafruit MPU6050
|
||||||
https://github.com/adafruit/Adafruit_SH110x/archive/refs/tags/2.1.14.zip
|
adafruit/Adafruit MPU6050@2.2.9
|
||||||
# renovate: datasource=github-tags depName=Adafruit MCP9808 packageName=adafruit/Adafruit_MCP9808_Library
|
# renovate: datasource=custom.pio depName=Adafruit LIS3DH packageName=adafruit/library/Adafruit LIS3DH
|
||||||
https://github.com/adafruit/Adafruit_MCP9808_Library/archive/refs/tags/2.0.2.zip
|
adafruit/Adafruit LIS3DH@1.3.0
|
||||||
# renovate: datasource=github-tags depName=Adafruit INA260 packageName=adafruit/Adafruit_INA260
|
# renovate: datasource=custom.pio depName=Adafruit AHTX0 packageName=adafruit/library/Adafruit AHTX0
|
||||||
https://github.com/adafruit/Adafruit_INA260/archive/refs/tags/1.5.3.zip
|
adafruit/Adafruit AHTX0@2.0.6
|
||||||
# renovate: datasource=github-tags depName=Adafruit INA219 packageName=adafruit/Adafruit_INA219
|
# renovate: datasource=custom.pio depName=Adafruit LSM6DS packageName=adafruit/library/Adafruit LSM6DS
|
||||||
https://github.com/adafruit/Adafruit_INA219/archive/refs/tags/1.2.3.zip
|
adafruit/Adafruit LSM6DS@4.7.4
|
||||||
# renovate: datasource=github-tags depName=Adafruit MPU6050 packageName=adafruit/Adafruit_MPU6050
|
# renovate: datasource=custom.pio depName=Adafruit TSL2591 packageName=adafruit/library/Adafruit TSL2591 Library
|
||||||
https://github.com/adafruit/Adafruit_MPU6050/archive/refs/tags/2.2.9.zip
|
adafruit/Adafruit TSL2591 Library@1.4.5
|
||||||
# renovate: datasource=github-tags depName=Adafruit LIS3DH packageName=adafruit/Adafruit_LIS3DH
|
# renovate: datasource=custom.pio depName=EmotiBit MLX90632 packageName=emotibit/library/EmotiBit MLX90632
|
||||||
https://github.com/adafruit/Adafruit_LIS3DH/archive/refs/tags/1.3.0.zip
|
emotibit/EmotiBit MLX90632@1.0.8
|
||||||
# renovate: datasource=github-tags depName=Adafruit AHTX0 packageName=adafruit/Adafruit_AHTX0
|
# renovate: datasource=custom.pio depName=Adafruit MLX90614 packageName=adafruit/library/Adafruit MLX90614 Library
|
||||||
https://github.com/adafruit/Adafruit_AHTX0/archive/refs/tags/2.0.6.zip
|
adafruit/Adafruit MLX90614 Library@2.1.6
|
||||||
# renovate: datasource=github-tags depName=Adafruit LSM6DS packageName=adafruit/Adafruit_LSM6DS
|
|
||||||
https://github.com/adafruit/Adafruit_LSM6DS/archive/refs/tags/4.7.4.zip
|
|
||||||
# renovate: datasource=github-tags depName=Adafruit TSL2591 packageName=adafruit/Adafruit_TSL2591_Library
|
|
||||||
https://github.com/adafruit/Adafruit_TSL2591_Library/archive/refs/tags/1.4.5.zip
|
|
||||||
# renovate: datasource=github-tags depName=EmotiBit MLX90632 packageName=emotibit/EmotiBit_MLX90632
|
|
||||||
https://github.com/EmotiBit/EmotiBit_MLX90632/archive/refs/tags/v1.0.8.zip
|
|
||||||
# renovate: datasource=github-tags depName=Adafruit MLX90614 packageName=adafruit/Adafruit_MLX90614
|
|
||||||
https://github.com/adafruit/Adafruit-MLX90614-Library/archive/refs/tags/2.1.6.zip
|
|
||||||
# renovate: datasource=git-refs depName=INA3221 packageName=https://github.com/sgtwilko/INA3221 gitBranch=FixOverflow
|
# renovate: datasource=git-refs depName=INA3221 packageName=https://github.com/sgtwilko/INA3221 gitBranch=FixOverflow
|
||||||
https://github.com/sgtwilko/INA3221/archive/bb03d7e9bfcc74fc798838a54f4f99738f29fc6a.zip
|
https://github.com/sgtwilko/INA3221/archive/bb03d7e9bfcc74fc798838a54f4f99738f29fc6a.zip
|
||||||
# renovate: datasource=github-tags depName=QMC5883L Compass packageName=mprograms/QMC5883LCompass
|
# renovate: datasource=custom.pio depName=QMC5883L Compass packageName=mprograms/library/QMC5883LCompass
|
||||||
https://github.com/mprograms/QMC5883LCompass/archive/refs/tags/v1.2.3.zip
|
mprograms/QMC5883LCompass@1.2.3
|
||||||
# renovate: datasource=github-tags depName=DFRobot_RTU packageName=dfrobot/DFRobot_RTU
|
# renovate: datasource=custom.pio depName=DFRobot_RTU packageName=dfrobot/library/DFRobot_RTU
|
||||||
https://github.com/DFRobot/DFRobot_RTU/archive/refs/tags/V1.0.6.zip
|
dfrobot/DFRobot_RTU@1.0.6
|
||||||
# renovate: datasource=git-refs depName=DFRobot_RainfallSensor packageName=https://github.com/DFRobot/DFRobot_RainfallSensor gitBranch=master
|
# renovate: datasource=git-refs depName=DFRobot_RainfallSensor packageName=https://github.com/DFRobot/DFRobot_RainfallSensor gitBranch=master
|
||||||
https://github.com/DFRobot/DFRobot_RainfallSensor/archive/38fea5e02b40a5430be6dab39a99a6f6347d667e.zip
|
https://github.com/DFRobot/DFRobot_RainfallSensor/archive/38fea5e02b40a5430be6dab39a99a6f6347d667e.zip
|
||||||
# renovate: datasource=github-tags depName=INA226 packageName=robtillaart/INA226
|
# renovate: datasource=custom.pio depName=INA226 packageName=robtillaart/library/INA226
|
||||||
https://github.com/RobTillaart/INA226/archive/refs/tags/0.6.6.zip
|
robtillaart/INA226@0.6.6
|
||||||
# renovate: datasource=github-tags depName=SparkFun MAX3010x packageName=sparkfun/SparkFun_MAX3010x_Sensor_Library
|
# renovate: datasource=custom.pio depName=SparkFun MAX3010x packageName=sparkfun/library/SparkFun MAX3010x Pulse and Proximity Sensor Library
|
||||||
https://github.com/sparkfun/SparkFun_MAX3010x_Sensor_Library/archive/refs/tags/v1.1.2.zip
|
sparkfun/SparkFun MAX3010x Pulse and Proximity Sensor Library@1.1.2
|
||||||
# renovate: datasource=github-tags depName=SparkFun 9DoF IMU Breakout ICM 20948 packageName=sparkfun/SparkFun_ICM-20948_ArduinoLibrary
|
# renovate: datasource=custom.pio depName=SparkFun 9DoF IMU Breakout ICM 20948 packageName=sparkfun/library/SparkFun 9DoF IMU Breakout - ICM 20948 - Arduino Library
|
||||||
https://github.com/sparkfun/SparkFun_ICM-20948_ArduinoLibrary/archive/refs/tags/v1.3.2.zip
|
sparkfun/SparkFun 9DoF IMU Breakout - ICM 20948 - Arduino Library@1.3.2
|
||||||
# renovate: datasource=github-tags depName=Adafruit LTR390 Library packageName=adafruit/Adafruit_LTR390
|
# renovate: datasource=custom.pio depName=Adafruit LTR390 Library packageName=adafruit/library/Adafruit LTR390 Library
|
||||||
https://github.com/adafruit/Adafruit_LTR390/archive/refs/tags/1.1.2.zip
|
adafruit/Adafruit LTR390 Library@1.1.2
|
||||||
# renovate: datasource=github-tags depName=Adafruit PCT2075 packageName=adafruit/Adafruit_PCT2075
|
# renovate: datasource=custom.pio depName=Adafruit PCT2075 packageName=adafruit/library/Adafruit PCT2075
|
||||||
https://github.com/adafruit/Adafruit_PCT2075/archive/refs/tags/1.0.6.zip
|
adafruit/Adafruit PCT2075@1.0.6
|
||||||
# renovate: datasource=github-tags depName=DFRobot_BMM150 packageName=dfrobot/DFRobot_BMM150
|
# renovate: datasource=custom.pio depName=DFRobot_BMM150 packageName=dfrobot/library/DFRobot_BMM150
|
||||||
https://github.com/DFRobot/DFRobot_BMM150/archive/refs/tags/V1.0.0.zip
|
dfrobot/DFRobot_BMM150@1.0.0
|
||||||
# renovate: datasource=github-tags depName=Adafruit_TSL2561 packageName=adafruit/Adafruit_TSL2561
|
# renovate: datasource=custom.pio depName=Adafruit_TSL2561 packageName=adafruit/library/Adafruit TSL2561
|
||||||
https://github.com/adafruit/Adafruit_TSL2561/archive/refs/tags/1.1.3.zip
|
adafruit/Adafruit TSL2561@1.1.3
|
||||||
# renovate: datasource=github-tags depName=BH1750_WE packageName=wollewald/BH1750_WE
|
# renovate: datasource=custom.pio depName=BH1750_WE packageName=wollewald/library/BH1750_WE
|
||||||
https://github.com/wollewald/BH1750_WE/archive/refs/tags/1.1.10.zip
|
wollewald/BH1750_WE@1.1.10
|
||||||
|
|
||||||
; Common environmental sensor libraries (not included in native / portduino)
|
; Common environmental sensor libraries (not included in native / portduino)
|
||||||
[environmental_extra_common]
|
[environmental_extra_common]
|
||||||
lib_deps =
|
lib_deps =
|
||||||
# renovate: datasource=github-tags depName=Adafruit BMP3XX packageName=adafruit/Adafruit_BMP3XX
|
# renovate: datasource=custom.pio depName=Adafruit BMP3XX packageName=adafruit/library/Adafruit BMP3XX Library
|
||||||
https://github.com/adafruit/Adafruit_BMP3XX/archive/refs/tags/2.1.6.zip
|
adafruit/Adafruit BMP3XX Library@2.1.6
|
||||||
# renovate: datasource=github-tags depName=Adafruit MAX1704X packageName=adafruit/Adafruit_MAX1704X
|
# renovate: datasource=custom.pio depName=Adafruit MAX1704X packageName=adafruit/library/Adafruit MAX1704X
|
||||||
https://github.com/adafruit/Adafruit_MAX1704X/archive/refs/tags/1.0.3.zip
|
adafruit/Adafruit MAX1704X@1.0.3
|
||||||
# renovate: datasource=github-tags depName=Adafruit SHTC3 packageName=adafruit/Adafruit_SHTC3
|
# renovate: datasource=custom.pio depName=Adafruit SHTC3 packageName=adafruit/library/Adafruit SHTC3 Library
|
||||||
https://github.com/adafruit/Adafruit_SHTC3/archive/refs/tags/1.0.2.zip
|
adafruit/Adafruit SHTC3 Library@1.0.2
|
||||||
# renovate: datasource=github-tags depName=Adafruit LPS2X packageName=adafruit/Adafruit_LPS2X
|
# renovate: datasource=custom.pio depName=Adafruit LPS2X packageName=adafruit/library/Adafruit LPS2X
|
||||||
https://github.com/adafruit/Adafruit_LPS2X/archive/refs/tags/2.0.6.zip
|
adafruit/Adafruit LPS2X@2.0.6
|
||||||
# renovate: datasource=github-tags depName=Adafruit SHT31 packageName=adafruit/Adafruit_SHT31
|
# renovate: datasource=custom.pio depName=Adafruit SHT31 packageName=adafruit/library/Adafruit SHT31 Library
|
||||||
https://github.com/adafruit/Adafruit_SHT31/archive/refs/tags/2.2.2.zip
|
adafruit/Adafruit SHT31 Library@2.2.2
|
||||||
# renovate: datasource=github-tags depName=Adafruit VEML7700 packageName=adafruit/Adafruit_VEML7700
|
# renovate: datasource=custom.pio depName=Adafruit VEML7700 packageName=adafruit/library/Adafruit VEML7700 Library
|
||||||
https://github.com/adafruit/Adafruit_VEML7700/archive/refs/tags/2.1.6.zip
|
adafruit/Adafruit VEML7700 Library@2.1.6
|
||||||
# renovate: datasource=github-tags depName=Adafruit SHT4x packageName=adafruit/Adafruit_SHT4X
|
# renovate: datasource=custom.pio depName=Adafruit SHT4x packageName=adafruit/library/Adafruit SHT4x Library
|
||||||
https://github.com/adafruit/Adafruit_SHT4X/archive/refs/tags/1.0.5.zip
|
adafruit/Adafruit SHT4x Library@1.0.5
|
||||||
# renovate: datasource=github-tags depName=SparkFun Qwiic Scale NAU7802 packageName=sparkfun/SparkFun_Qwiic_Scale_NAU7802_Arduino_Library
|
# renovate: datasource=custom.pio depName=SparkFun Qwiic Scale NAU7802 packageName=sparkfun/library/SparkFun Qwiic Scale NAU7802 Arduino Library
|
||||||
https://github.com/sparkfun/SparkFun_Qwiic_Scale_NAU7802_Arduino_Library/archive/refs/tags/v1.0.6.zip
|
sparkfun/SparkFun Qwiic Scale NAU7802 Arduino Library@1.0.6
|
||||||
# renovate: datasource=custom.pio depName=ClosedCube OPT3001 packageName=closedcube/library/ClosedCube OPT3001
|
# renovate: datasource=custom.pio depName=ClosedCube OPT3001 packageName=closedcube/library/ClosedCube OPT3001
|
||||||
closedcube/ClosedCube OPT3001@1.1.2
|
closedcube/ClosedCube OPT3001@1.1.2
|
||||||
# renovate: datasource=git-refs depName=meshtastic-DFRobot_LarkWeatherStation packageName=https://github.com/meshtastic/DFRobot_LarkWeatherStation gitBranch=master
|
# renovate: datasource=git-refs depName=meshtastic-DFRobot_LarkWeatherStation packageName=https://github.com/meshtastic/DFRobot_LarkWeatherStation gitBranch=master
|
||||||
https://github.com/meshtastic/DFRobot_LarkWeatherStation/archive/4de3a9cadef0f6a5220a8a906cf9775b02b0040d.zip
|
https://github.com/meshtastic/DFRobot_LarkWeatherStation/archive/4de3a9cadef0f6a5220a8a906cf9775b02b0040d.zip
|
||||||
# renovate: datasource=github-tags depName=Sensirion Core packageName=sensirion/arduino-core
|
# renovate: datasource=custom.pio depName=Sensirion Core packageName=sensirion/library/Sensirion Core
|
||||||
https://github.com/Sensirion/arduino-core/archive/refs/tags/0.7.3.zip
|
sensirion/Sensirion Core@0.7.3
|
||||||
# renovate: datasource=github-tags depName=Sensirion I2C SCD4x packageName=sensirion/arduino-i2c-scd4x
|
# renovate: datasource=custom.pio depName=Sensirion I2C SCD4x packageName=sensirion/library/Sensirion I2C SCD4x
|
||||||
https://github.com/Sensirion/arduino-i2c-scd4x/archive/refs/tags/1.1.0.zip
|
sensirion/Sensirion I2C SCD4x@1.1.0
|
||||||
# renovate: datasource=github-tags depName=Sensirion I2C SFA3x packageName=sensirion/arduino-i2c-sfa3x
|
# renovate: datasource=custom.pio depName=Sensirion I2C SFA3x packageName=sensirion/library/Sensirion I2C SFA3x
|
||||||
https://github.com/Sensirion/arduino-i2c-sfa3x/archive/refs/tags/1.0.0.zip
|
sensirion/Sensirion I2C SFA3x@1.0.0
|
||||||
# renovate: datasource=github-tags depName=Sensirion I2C SCD30 packageName=sensirion/arduino-i2c-scd30
|
# renovate: datasource=custom.pio depName=Sensirion I2C SCD30 packageName=sensirion/library/Sensirion I2C SCD30
|
||||||
https://github.com/Sensirion/arduino-i2c-scd30/archive/refs/tags/1.0.0.zip
|
sensirion/Sensirion I2C SCD30@1.0.0
|
||||||
# renovate: datasource=github-tags depName=arduino-sht packageName=sensirion/arduino-sht
|
|
||||||
https://github.com/Sensirion/arduino-sht/archive/refs/tags/v1.2.6.zip
|
|
||||||
|
|
||||||
; Environmental sensors with BSEC2 (Bosch proprietary IAQ)
|
; Environmental sensors with BSEC2 (Bosch proprietary IAQ)
|
||||||
[environmental_extra]
|
[environmental_extra]
|
||||||
lib_deps =
|
lib_deps =
|
||||||
${environmental_extra_common.lib_deps}
|
${environmental_extra_common.lib_deps}
|
||||||
# renovate: datasource=github-tags depName=Bosch BSEC2 packageName=boschsensortec/Bosch-BSEC2-Library
|
# renovate: datasource=custom.pio depName=Bosch BSEC2 packageName=boschsensortec/library/bsec2
|
||||||
https://github.com/boschsensortec/Bosch-BSEC2-Library/archive/refs/tags/1.10.2610.zip
|
boschsensortec/bsec2@1.10.2610
|
||||||
# renovate: datasource=github-tags depName=Bosch BME68x packageName=boschsensortec/Bosch-BME68x-Library
|
# renovate: datasource=custom.pio depName=Bosch BME68x packageName=boschsensortec/library/BME68x Sensor Library
|
||||||
https://github.com/boschsensortec/Bosch-BME68x-Library/archive/refs/tags/v1.3.40408.zip
|
boschsensortec/BME68x Sensor Library@1.3.40408
|
||||||
|
|
||||||
; Environmental sensors without BSEC (saves ~3.5KB DRAM for original ESP32 targets)
|
; Environmental sensors without BSEC (saves ~3.5KB DRAM for original ESP32 targets)
|
||||||
[environmental_extra_no_bsec]
|
[environmental_extra_no_bsec]
|
||||||
lib_deps =
|
lib_deps =
|
||||||
${environmental_extra_common.lib_deps}
|
${environmental_extra_common.lib_deps}
|
||||||
# renovate: datasource=github-tags depName=Adafruit_BME680 packageName=adafruit/Adafruit_BME680
|
# renovate: datasource=custom.pio depName=adafruit/Adafruit BME680 Library packageName=adafruit/library/Adafruit BME680
|
||||||
https://github.com/adafruit/Adafruit_BME680/archive/refs/tags/2.0.6.zip
|
adafruit/Adafruit BME680 Library@^2.0.5
|
||||||
|
|||||||
+1
-1
Submodule protobufs updated: e30092e616...cb1f89372a
@@ -4,8 +4,6 @@
|
|||||||
":dependencyDashboard",
|
":dependencyDashboard",
|
||||||
":semanticCommitTypeAll(chore)",
|
":semanticCommitTypeAll(chore)",
|
||||||
":ignoreModulesAndTests",
|
":ignoreModulesAndTests",
|
||||||
":noUnscheduledUpdates",
|
|
||||||
"schedule:daily",
|
|
||||||
"group:recommended",
|
"group:recommended",
|
||||||
"replacements:all",
|
"replacements:all",
|
||||||
"workarounds:all"
|
"workarounds:all"
|
||||||
|
|||||||
@@ -98,6 +98,7 @@ Syslog &Syslog::logMask(uint8_t priMask)
|
|||||||
|
|
||||||
void Syslog::enable()
|
void Syslog::enable()
|
||||||
{
|
{
|
||||||
|
this->_client->begin(this->_port);
|
||||||
this->_enabled = true;
|
this->_enabled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -165,21 +166,14 @@ inline bool Syslog::_sendLog(uint16_t pri, const char *appName, const char *mess
|
|||||||
if ((pri & LOG_FACMASK) == 0)
|
if ((pri & LOG_FACMASK) == 0)
|
||||||
pri = LOG_MAKEPRI(LOG_FAC(this->_priDefault), pri);
|
pri = LOG_MAKEPRI(LOG_FAC(this->_priDefault), pri);
|
||||||
|
|
||||||
// W5100S: acquire UDP socket on-demand to avoid permanent socket consumption
|
|
||||||
if (!this->_client->begin(this->_port)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this->_server != NULL) {
|
if (this->_server != NULL) {
|
||||||
result = this->_client->beginPacket(this->_server, this->_port);
|
result = this->_client->beginPacket(this->_server, this->_port);
|
||||||
} else {
|
} else {
|
||||||
result = this->_client->beginPacket(this->_ip, this->_port);
|
result = this->_client->beginPacket(this->_ip, this->_port);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result != 1) {
|
if (result != 1)
|
||||||
this->_client->stop();
|
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
|
|
||||||
this->_client->print('<');
|
this->_client->print('<');
|
||||||
this->_client->print(pri);
|
this->_client->print(pri);
|
||||||
@@ -199,8 +193,6 @@ inline bool Syslog::_sendLog(uint16_t pri, const char *appName, const char *mess
|
|||||||
this->_client->print(message);
|
this->_client->print(message);
|
||||||
this->_client->endPacket();
|
this->_client->endPacket();
|
||||||
|
|
||||||
this->_client->stop(); // W5100S: release UDP socket for other services
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -35,11 +35,6 @@
|
|||||||
#include "nrfx_power.h"
|
#include "nrfx_power.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(ARCH_NRF52)
|
|
||||||
#include "Nrf52SaadcLock.h"
|
|
||||||
#include "concurrency/LockGuard.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(DEBUG_HEAP_MQTT) && !MESHTASTIC_EXCLUDE_MQTT
|
#if defined(DEBUG_HEAP_MQTT) && !MESHTASTIC_EXCLUDE_MQTT
|
||||||
#include "mqtt/MQTT.h"
|
#include "mqtt/MQTT.h"
|
||||||
#include "target_specific.h"
|
#include "target_specific.h"
|
||||||
@@ -333,9 +328,6 @@ class AnalogBatteryLevel : public HasBatteryLevel
|
|||||||
scaled = esp_adc_cal_raw_to_voltage(raw, adc_characs);
|
scaled = esp_adc_cal_raw_to_voltage(raw, adc_characs);
|
||||||
scaled *= operativeAdcMultiplier;
|
scaled *= operativeAdcMultiplier;
|
||||||
#else // block for all other platforms
|
#else // block for all other platforms
|
||||||
#ifdef ARCH_NRF52
|
|
||||||
concurrency::LockGuard saadcGuard(concurrency::nrf52SaadcLock);
|
|
||||||
#endif
|
|
||||||
for (uint32_t i = 0; i < BATTERY_SENSE_SAMPLES; i++) {
|
for (uint32_t i = 0; i < BATTERY_SENSE_SAMPLES; i++) {
|
||||||
raw += analogRead(BATTERY_PIN);
|
raw += analogRead(BATTERY_PIN);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -137,7 +137,7 @@ void RedirectablePrint::log_to_serial(const char *logLevel, const char *format,
|
|||||||
if (color) {
|
if (color) {
|
||||||
::printf("\u001b[0m");
|
::printf("\u001b[0m");
|
||||||
}
|
}
|
||||||
::printf("| %02d:%02d:%02d %u.%03u ", hour, min, sec, millis() / 1000, millis() % 1000);
|
::printf("| %02d:%02d:%02d %u ", hour, min, sec, millis() / 1000);
|
||||||
#else
|
#else
|
||||||
printf("%s ", logLevel);
|
printf("%s ", logLevel);
|
||||||
if (color) {
|
if (color) {
|
||||||
@@ -151,7 +151,7 @@ void RedirectablePrint::log_to_serial(const char *logLevel, const char *format,
|
|||||||
if (color) {
|
if (color) {
|
||||||
::printf("\u001b[0m");
|
::printf("\u001b[0m");
|
||||||
}
|
}
|
||||||
::printf("| ??:??:?? %u.%03u ", millis() / 1000, millis() % 1000);
|
::printf("| ??:??:?? %u ", millis() / 1000);
|
||||||
#else
|
#else
|
||||||
printf("%s ", logLevel);
|
printf("%s ", logLevel);
|
||||||
if (color) {
|
if (color) {
|
||||||
|
|||||||
+1
-56
@@ -6,11 +6,6 @@
|
|||||||
#include "Tone.h"
|
#include "Tone.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(HAS_I2S)
|
|
||||||
#include "main.h"
|
|
||||||
#include <unordered_map>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(ARCH_PORTDUINO)
|
#if !defined(ARCH_PORTDUINO)
|
||||||
extern "C" void delay(uint32_t dwMs);
|
extern "C" void delay(uint32_t dwMs);
|
||||||
#endif
|
#endif
|
||||||
@@ -55,50 +50,6 @@ const int DURATION_1_2 = 500; // 1/2 note
|
|||||||
const int DURATION_3_4 = 750; // 3/4 note
|
const int DURATION_3_4 = 750; // 3/4 note
|
||||||
const int DURATION_1_1 = 1000; // 1/1 note
|
const int DURATION_1_1 = 1000; // 1/1 note
|
||||||
|
|
||||||
#ifdef HAS_I2S
|
|
||||||
void playTonesRTTTL(const ToneDuration *tone_durations, int size)
|
|
||||||
{
|
|
||||||
// translate ToneDuration[] to RTTTL string and play using audioThread
|
|
||||||
static std::unordered_map<int, std::string> freqToNote = {
|
|
||||||
{NOTE_C3, "c4"}, {NOTE_CS3, "c#4"}, {NOTE_D3, "d4"}, {NOTE_DS3, "d#4"}, {NOTE_E3, "e4"}, {NOTE_F3, "f4"},
|
|
||||||
{NOTE_FS3, "f#4"}, {NOTE_G3, "g4"}, {NOTE_GS3, "g#4"}, {NOTE_A3, "a4"}, {NOTE_AS3, "a#4"}, {NOTE_B3, "b4"},
|
|
||||||
{NOTE_C4, "c5"}, {NOTE_E4, "e5"}, {NOTE_G4, "g5"}, {NOTE_A4, "a5"}, {NOTE_C5, "c6"}, {NOTE_E5, "e6"},
|
|
||||||
{NOTE_G5, "g6"}, {NOTE_F5, "f6"}, {NOTE_G6, "g7"}, {NOTE_E7, "e8"}};
|
|
||||||
|
|
||||||
char rtttl[128] = "tone:d=32,o=4,b=200:"; // default duration and octave
|
|
||||||
for (int i = 0; i < size; i++) {
|
|
||||||
const auto &td = tone_durations[i];
|
|
||||||
std::string note = "b4";
|
|
||||||
if (freqToNote.find(td.frequency_khz) != freqToNote.end()) {
|
|
||||||
note = freqToNote[td.frequency_khz];
|
|
||||||
}
|
|
||||||
int dur = 32; // default duration
|
|
||||||
if (td.duration_ms >= 1000)
|
|
||||||
dur = 1;
|
|
||||||
else if (td.duration_ms >= 500)
|
|
||||||
dur = 2;
|
|
||||||
else if (td.duration_ms >= 250)
|
|
||||||
dur = 4;
|
|
||||||
else if (td.duration_ms >= 125)
|
|
||||||
dur = 8;
|
|
||||||
else if (td.duration_ms >= 62)
|
|
||||||
dur = 16;
|
|
||||||
else
|
|
||||||
dur = 32;
|
|
||||||
|
|
||||||
char noteStr[64];
|
|
||||||
snprintf(noteStr, sizeof(noteStr), "%s,%d", note.c_str(), dur);
|
|
||||||
strncat(rtttl, noteStr, sizeof(rtttl) - strlen(rtttl) - 1);
|
|
||||||
|
|
||||||
audioThread->beginRttl(rtttl, strlen(rtttl));
|
|
||||||
while (audioThread->isPlaying()) {
|
|
||||||
delay(10);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void playTones(const ToneDuration *tone_durations, int size)
|
void playTones(const ToneDuration *tone_durations, int size)
|
||||||
{
|
{
|
||||||
if (config.device.buzzer_mode == meshtastic_Config_DeviceConfig_BuzzerMode_DISABLED ||
|
if (config.device.buzzer_mode == meshtastic_Config_DeviceConfig_BuzzerMode_DISABLED ||
|
||||||
@@ -106,13 +57,7 @@ void playTones(const ToneDuration *tone_durations, int size)
|
|||||||
// Buzzer is disabled or not set to system tones
|
// Buzzer is disabled or not set to system tones
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#ifdef HAS_I2S
|
#ifdef PIN_BUZZER
|
||||||
if (moduleConfig.external_notification.use_i2s_as_buzzer && audioThread) {
|
|
||||||
playTonesRTTTL(tone_durations, size);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#if defined(PIN_BUZZER)
|
|
||||||
if (!config.device.buzzer_gpio)
|
if (!config.device.buzzer_gpio)
|
||||||
config.device.buzzer_gpio = PIN_BUZZER;
|
config.device.buzzer_gpio = PIN_BUZZER;
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,85 +1,10 @@
|
|||||||
#include "concurrency/BinarySemaphorePosix.h"
|
#include "concurrency/BinarySemaphorePosix.h"
|
||||||
#include "configuration.h"
|
#include "configuration.h"
|
||||||
|
|
||||||
#include <errno.h>
|
|
||||||
#include <sys/time.h>
|
|
||||||
|
|
||||||
#ifndef HAS_FREE_RTOS
|
#ifndef HAS_FREE_RTOS
|
||||||
|
|
||||||
namespace concurrency
|
namespace concurrency
|
||||||
{
|
{
|
||||||
#ifdef ARCH_PORTDUINO
|
|
||||||
|
|
||||||
BinarySemaphorePosix::BinarySemaphorePosix()
|
|
||||||
{
|
|
||||||
if (pthread_mutex_init(&mutex, NULL) != 0) {
|
|
||||||
throw std::runtime_error("pthread_mutex_init failed");
|
|
||||||
}
|
|
||||||
if (pthread_cond_init(&cond, NULL) != 0) {
|
|
||||||
pthread_mutex_destroy(&mutex);
|
|
||||||
throw std::runtime_error("pthread_cond_init failed");
|
|
||||||
}
|
|
||||||
signaled = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
BinarySemaphorePosix::~BinarySemaphorePosix()
|
|
||||||
{
|
|
||||||
pthread_cond_destroy(&cond);
|
|
||||||
pthread_mutex_destroy(&mutex);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns false if we timed out
|
|
||||||
*/
|
|
||||||
bool BinarySemaphorePosix::take(uint32_t msec)
|
|
||||||
{
|
|
||||||
pthread_mutex_lock(&mutex);
|
|
||||||
|
|
||||||
if (!signaled) {
|
|
||||||
struct timespec ts;
|
|
||||||
clock_gettime(CLOCK_REALTIME, &ts);
|
|
||||||
|
|
||||||
ts.tv_sec += msec / 1000;
|
|
||||||
ts.tv_nsec += (msec % 1000) * 1000000L;
|
|
||||||
if (ts.tv_nsec >= 1000000000L) {
|
|
||||||
ts.tv_sec += 1;
|
|
||||||
ts.tv_nsec -= 1000000000L;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (!signaled) {
|
|
||||||
int rc = pthread_cond_timedwait(&cond, &mutex, &ts);
|
|
||||||
if (rc == ETIMEDOUT)
|
|
||||||
break;
|
|
||||||
if (rc != 0) {
|
|
||||||
// Some other error occurred
|
|
||||||
pthread_mutex_unlock(&mutex);
|
|
||||||
throw std::runtime_error("pthread_cond_timedwait failed: " + std::to_string(rc));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool wasSignaled = signaled;
|
|
||||||
signaled = false; // consume the signal (binary semaphore)
|
|
||||||
|
|
||||||
pthread_mutex_unlock(&mutex);
|
|
||||||
return wasSignaled;
|
|
||||||
}
|
|
||||||
|
|
||||||
void BinarySemaphorePosix::give()
|
|
||||||
{
|
|
||||||
pthread_mutex_lock(&mutex);
|
|
||||||
signaled = true;
|
|
||||||
pthread_cond_signal(&cond);
|
|
||||||
pthread_mutex_unlock(&mutex);
|
|
||||||
}
|
|
||||||
|
|
||||||
IRAM_ATTR void BinarySemaphorePosix::giveFromISR(BaseType_t *pxHigherPriorityTaskWoken)
|
|
||||||
{
|
|
||||||
give();
|
|
||||||
if (pxHigherPriorityTaskWoken)
|
|
||||||
*pxHigherPriorityTaskWoken = true;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
|
|
||||||
BinarySemaphorePosix::BinarySemaphorePosix() {}
|
BinarySemaphorePosix::BinarySemaphorePosix() {}
|
||||||
|
|
||||||
@@ -97,8 +22,7 @@ bool BinarySemaphorePosix::take(uint32_t msec)
|
|||||||
void BinarySemaphorePosix::give() {}
|
void BinarySemaphorePosix::give() {}
|
||||||
|
|
||||||
IRAM_ATTR void BinarySemaphorePosix::giveFromISR(BaseType_t *pxHigherPriorityTaskWoken) {}
|
IRAM_ATTR void BinarySemaphorePosix::giveFromISR(BaseType_t *pxHigherPriorityTaskWoken) {}
|
||||||
#endif
|
|
||||||
|
|
||||||
} // namespace concurrency
|
} // namespace concurrency
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -2,10 +2,6 @@
|
|||||||
|
|
||||||
#include "../freertosinc.h"
|
#include "../freertosinc.h"
|
||||||
|
|
||||||
#ifdef ARCH_PORTDUINO
|
|
||||||
#include <pthread.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace concurrency
|
namespace concurrency
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -13,12 +9,7 @@ namespace concurrency
|
|||||||
|
|
||||||
class BinarySemaphorePosix
|
class BinarySemaphorePosix
|
||||||
{
|
{
|
||||||
|
// SemaphoreHandle_t semaphore;
|
||||||
#ifdef ARCH_PORTDUINO
|
|
||||||
pthread_mutex_t mutex;
|
|
||||||
pthread_cond_t cond;
|
|
||||||
bool signaled;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
BinarySemaphorePosix();
|
BinarySemaphorePosix();
|
||||||
@@ -36,4 +27,4 @@ class BinarySemaphorePosix
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
} // namespace concurrency
|
} // namespace concurrency
|
||||||
+3
-3
@@ -231,7 +231,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
#define BME_ADDR 0x76
|
#define BME_ADDR 0x76
|
||||||
#define BME_ADDR_ALTERNATE 0x77
|
#define BME_ADDR_ALTERNATE 0x77
|
||||||
#define MCP9808_ADDR 0x18
|
#define MCP9808_ADDR 0x18
|
||||||
#define INA_ADDR 0x40 // same as SHT2X
|
#define INA_ADDR 0x40
|
||||||
#define INA_ADDR_ALTERNATE 0x41
|
#define INA_ADDR_ALTERNATE 0x41
|
||||||
#define INA_ADDR_WAVESHARE_UPS 0x43
|
#define INA_ADDR_WAVESHARE_UPS 0x43
|
||||||
#define INA3221_ADDR 0x42
|
#define INA3221_ADDR 0x42
|
||||||
@@ -244,8 +244,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
#define LPS22HB_ADDR 0x5C
|
#define LPS22HB_ADDR 0x5C
|
||||||
#define LPS22HB_ADDR_ALT 0x5D
|
#define LPS22HB_ADDR_ALT 0x5D
|
||||||
#define SFA30_ADDR 0x5D
|
#define SFA30_ADDR 0x5D
|
||||||
#define SHTXX_ADDR 0x44
|
#define SHT31_4x_ADDR 0x44
|
||||||
#define SHTXX_ADDR_ALT 0x45
|
#define SHT31_4x_ADDR_ALT 0x45
|
||||||
#define PMSA003I_ADDR 0x12
|
#define PMSA003I_ADDR 0x12
|
||||||
#define QMA6100P_ADDR 0x12
|
#define QMA6100P_ADDR 0x12
|
||||||
#define AHT10_ADDR 0x38
|
#define AHT10_ADDR 0x38
|
||||||
|
|||||||
@@ -31,6 +31,9 @@ class ScanI2C
|
|||||||
INA3221,
|
INA3221,
|
||||||
MAX17048,
|
MAX17048,
|
||||||
MCP9808,
|
MCP9808,
|
||||||
|
SHT31,
|
||||||
|
SHT4X,
|
||||||
|
SHTC3,
|
||||||
LPS22HB,
|
LPS22HB,
|
||||||
QMC6310U,
|
QMC6310U,
|
||||||
QMC6310N,
|
QMC6310N,
|
||||||
@@ -91,8 +94,7 @@ class ScanI2C
|
|||||||
SFA30,
|
SFA30,
|
||||||
CW2015,
|
CW2015,
|
||||||
SCD30,
|
SCD30,
|
||||||
ADS1115,
|
ADS1115
|
||||||
SHTXX
|
|
||||||
} DeviceType;
|
} DeviceType;
|
||||||
|
|
||||||
// typedef uint8_t DeviceAddress;
|
// typedef uint8_t DeviceAddress;
|
||||||
|
|||||||
@@ -136,9 +136,7 @@ bool ScanI2CTwoWire::i2cCommandResponseLength(ScanI2C::DeviceAddress addr, uint1
|
|||||||
return match;
|
return match;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if HAS_TELEMETRY && !MESHTASTIC_EXCLUDE_AIR_QUALITY_SENSOR
|
/// for SEN5X detection
|
||||||
// FIXME Move to a separate file for detection of sensors that require more complex interactions?
|
|
||||||
// For SEN5X detection
|
|
||||||
// Note, this code needs to be called before setting the I2C bus speed
|
// Note, this code needs to be called before setting the I2C bus speed
|
||||||
// for the screen at high speed. The speed needs to be at 100kHz, otherwise
|
// for the screen at high speed. The speed needs to be at 100kHz, otherwise
|
||||||
// detection will not work
|
// detection will not work
|
||||||
@@ -176,46 +174,6 @@ String readSEN5xProductName(TwoWire *i2cBus, uint8_t address)
|
|||||||
|
|
||||||
return String(productName);
|
return String(productName);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
#if HAS_TELEMETRY && !MESHTASTIC_EXCLUDE_ENVIRONMENTAL_SENSOR
|
|
||||||
bool detectSHT21SerialNumber(TwoWire *i2cBus, uint8_t address)
|
|
||||||
{
|
|
||||||
|
|
||||||
i2cBus->beginTransmission(address);
|
|
||||||
i2cBus->write(0xFA);
|
|
||||||
i2cBus->write(0x0F);
|
|
||||||
|
|
||||||
if (i2cBus->endTransmission() != 0)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (i2cBus->requestFrom(address, (uint8_t)8) != 8)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Just flush the data
|
|
||||||
while (i2cBus->available() < 8) {
|
|
||||||
i2cBus->read();
|
|
||||||
}
|
|
||||||
|
|
||||||
i2cBus->beginTransmission(address);
|
|
||||||
i2cBus->write(0xFC);
|
|
||||||
i2cBus->write(0xC9);
|
|
||||||
|
|
||||||
if (i2cBus->endTransmission() != 0)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (i2cBus->requestFrom(address, (uint8_t)6) != 6)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Just flush the data
|
|
||||||
while (i2cBus->available() < 6) {
|
|
||||||
i2cBus->read();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Assume we detect the SHT21 if something came back from the request
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define SCAN_SIMPLE_CASE(ADDR, T, ...) \
|
#define SCAN_SIMPLE_CASE(ADDR, T, ...) \
|
||||||
case ADDR: \
|
case ADDR: \
|
||||||
@@ -413,7 +371,7 @@ void ScanI2CTwoWire::scanPort(I2CPort port, uint8_t *address, uint8_t asize)
|
|||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
#if !defined(M5STACK_UNITC6L)
|
#if !defined(M5STACK_UNITC6L)
|
||||||
case INA_ADDR: // Same as SHT2X
|
case INA_ADDR:
|
||||||
case INA_ADDR_ALTERNATE:
|
case INA_ADDR_ALTERNATE:
|
||||||
case INA_ADDR_WAVESHARE_UPS:
|
case INA_ADDR_WAVESHARE_UPS:
|
||||||
registerValue = getRegisterValue(ScanI2CTwoWire::RegisterLocation(addr, 0xFE), 2);
|
registerValue = getRegisterValue(ScanI2CTwoWire::RegisterLocation(addr, 0xFE), 2);
|
||||||
@@ -429,12 +387,7 @@ void ScanI2CTwoWire::scanPort(I2CPort port, uint8_t *address, uint8_t asize)
|
|||||||
logFoundDevice("INA260", (uint8_t)addr.address);
|
logFoundDevice("INA260", (uint8_t)addr.address);
|
||||||
type = INA260;
|
type = INA260;
|
||||||
}
|
}
|
||||||
#if HAS_TELEMETRY && !MESHTASTIC_EXCLUDE_ENVIRONMENTAL_SENSOR
|
} else { // Assume INA219 if INA260 ID is not found
|
||||||
} else if (detectSHT21SerialNumber(i2cBus, (uint8_t)addr.address)) {
|
|
||||||
logFoundDevice("SHTXX (SHT2X)", (uint8_t)addr.address);
|
|
||||||
type = SHTXX;
|
|
||||||
#endif
|
|
||||||
} else { // Assume INA219 if none of the above ones are found
|
|
||||||
logFoundDevice("INA219", (uint8_t)addr.address);
|
logFoundDevice("INA219", (uint8_t)addr.address);
|
||||||
type = INA219;
|
type = INA219;
|
||||||
}
|
}
|
||||||
@@ -495,19 +448,22 @@ void ScanI2CTwoWire::scanPort(I2CPort port, uint8_t *address, uint8_t asize)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SHTXX_ADDR: // same as OPT3001_ADDR_ALT
|
case SHT31_4x_ADDR: // same as OPT3001_ADDR_ALT
|
||||||
case SHTXX_ADDR_ALT: // same as OPT3001_ADDR
|
case SHT31_4x_ADDR_ALT: // same as OPT3001_ADDR
|
||||||
if (getRegisterValue(ScanI2CTwoWire::RegisterLocation(addr, 0x7E), 2) == 0x5449) {
|
if (getRegisterValue(ScanI2CTwoWire::RegisterLocation(addr, 0x7E), 2) == 0x5449) {
|
||||||
type = OPT3001;
|
type = OPT3001;
|
||||||
logFoundDevice("OPT3001", (uint8_t)addr.address);
|
logFoundDevice("OPT3001", (uint8_t)addr.address);
|
||||||
} else { // SHTXX
|
} else if (i2cCommandResponseLength(addr, 0x89, 6)) { // SHT4x serial number (6 bytes inc. CRC)
|
||||||
type = SHTXX;
|
type = SHT4X;
|
||||||
logFoundDevice("SHTXX", (uint8_t)addr.address);
|
logFoundDevice("SHT4X", (uint8_t)addr.address);
|
||||||
|
} else {
|
||||||
|
type = SHT31;
|
||||||
|
logFoundDevice("SHT31", (uint8_t)addr.address);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
SCAN_SIMPLE_CASE(SHTC3_ADDR, SHTXX, "SHTXX", (uint8_t)addr.address)
|
SCAN_SIMPLE_CASE(SHTC3_ADDR, SHTC3, "SHTC3", (uint8_t)addr.address)
|
||||||
case RCWL9620_ADDR:
|
case RCWL9620_ADDR:
|
||||||
// get MAX30102 PARTID
|
// get MAX30102 PARTID
|
||||||
registerValue = getRegisterValue(ScanI2CTwoWire::RegisterLocation(addr, 0xFF), 1);
|
registerValue = getRegisterValue(ScanI2CTwoWire::RegisterLocation(addr, 0xFF), 1);
|
||||||
@@ -719,7 +675,6 @@ void ScanI2CTwoWire::scanPort(I2CPort port, uint8_t *address, uint8_t asize)
|
|||||||
logFoundDevice("BMX160", (uint8_t)addr.address);
|
logFoundDevice("BMX160", (uint8_t)addr.address);
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
#if HAS_TELEMETRY && !MESHTASTIC_EXCLUDE_AIR_QUALITY_SENSOR
|
|
||||||
String prod = "";
|
String prod = "";
|
||||||
prod = readSEN5xProductName(i2cBus, addr.address);
|
prod = readSEN5xProductName(i2cBus, addr.address);
|
||||||
if (prod.startsWith("SEN55")) {
|
if (prod.startsWith("SEN55")) {
|
||||||
@@ -735,7 +690,6 @@ void ScanI2CTwoWire::scanPort(I2CPort port, uint8_t *address, uint8_t asize)
|
|||||||
logFoundDevice("Sensirion SEN50", addr.address);
|
logFoundDevice("Sensirion SEN50", addr.address);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
if (addr.address == BMX160_ADDR) {
|
if (addr.address == BMX160_ADDR) {
|
||||||
type = BMX160;
|
type = BMX160;
|
||||||
logFoundDevice("BMX160", (uint8_t)addr.address);
|
logFoundDevice("BMX160", (uint8_t)addr.address);
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
#include "configuration.h"
|
#include "configuration.h"
|
||||||
#include "detect/ScanI2C.h"
|
#include "detect/ScanI2C.h"
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "modules/NodeInfoModule.h"
|
|
||||||
#include <Throttle.h>
|
#include <Throttle.h>
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
@@ -13,14 +12,6 @@ uint32_t lastSetFromPhoneNtpOrGps = 0;
|
|||||||
static uint32_t lastTimeValidationWarning = 0;
|
static uint32_t lastTimeValidationWarning = 0;
|
||||||
static const uint32_t TIME_VALIDATION_WARNING_INTERVAL_MS = 15000; // 15 seconds
|
static const uint32_t TIME_VALIDATION_WARNING_INTERVAL_MS = 15000; // 15 seconds
|
||||||
|
|
||||||
static void triggerNodeInfoCheckOnTimeSource(RTCQuality oldQuality, RTCQuality newQuality)
|
|
||||||
{
|
|
||||||
if (oldQuality == RTCQualityNone && newQuality > RTCQualityNone && nodeInfoModule) {
|
|
||||||
LOG_DEBUG("Time source acquired (%s -> %s), triggering NodeInfo recheck", RtcName(oldQuality), RtcName(newQuality));
|
|
||||||
nodeInfoModule->triggerImmediateNodeInfoCheck();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
RTCQuality getRTCQuality()
|
RTCQuality getRTCQuality()
|
||||||
{
|
{
|
||||||
return currentQuality;
|
return currentQuality;
|
||||||
@@ -70,11 +61,9 @@ RTCSetResult readFromRTC()
|
|||||||
LOG_DEBUG("Read RTC time from RV3028 getTime as %02d-%02d-%02d %02d:%02d:%02d (%ld)", t.tm_year + 1900, t.tm_mon + 1,
|
LOG_DEBUG("Read RTC time from RV3028 getTime as %02d-%02d-%02d %02d:%02d:%02d (%ld)", t.tm_year + 1900, t.tm_mon + 1,
|
||||||
t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec, printableEpoch);
|
t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec, printableEpoch);
|
||||||
if (currentQuality == RTCQualityNone) {
|
if (currentQuality == RTCQualityNone) {
|
||||||
RTCQuality oldQuality = currentQuality;
|
|
||||||
timeStartMsec = now;
|
timeStartMsec = now;
|
||||||
zeroOffsetSecs = tv.tv_sec;
|
zeroOffsetSecs = tv.tv_sec;
|
||||||
currentQuality = RTCQualityDevice;
|
currentQuality = RTCQualityDevice;
|
||||||
triggerNodeInfoCheckOnTimeSource(oldQuality, currentQuality);
|
|
||||||
}
|
}
|
||||||
return RTCSetResultSuccess;
|
return RTCSetResultSuccess;
|
||||||
} else {
|
} else {
|
||||||
@@ -116,11 +105,9 @@ RTCSetResult readFromRTC()
|
|||||||
LOG_DEBUG("Read RTC time from %s getDateTime as %02d-%02d-%02d %02d:%02d:%02d (%ld)", rtc.getChipName(), t.tm_year + 1900,
|
LOG_DEBUG("Read RTC time from %s getDateTime as %02d-%02d-%02d %02d:%02d:%02d (%ld)", rtc.getChipName(), t.tm_year + 1900,
|
||||||
t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec, printableEpoch);
|
t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec, printableEpoch);
|
||||||
if (currentQuality == RTCQualityNone) {
|
if (currentQuality == RTCQualityNone) {
|
||||||
RTCQuality oldQuality = currentQuality;
|
|
||||||
timeStartMsec = now;
|
timeStartMsec = now;
|
||||||
zeroOffsetSecs = tv.tv_sec;
|
zeroOffsetSecs = tv.tv_sec;
|
||||||
currentQuality = RTCQualityDevice;
|
currentQuality = RTCQualityDevice;
|
||||||
triggerNodeInfoCheckOnTimeSource(oldQuality, currentQuality);
|
|
||||||
}
|
}
|
||||||
return RTCSetResultSuccess;
|
return RTCSetResultSuccess;
|
||||||
} else {
|
} else {
|
||||||
@@ -152,11 +139,9 @@ RTCSetResult readFromRTC()
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (currentQuality == RTCQualityNone) {
|
if (currentQuality == RTCQualityNone) {
|
||||||
RTCQuality oldQuality = currentQuality;
|
|
||||||
timeStartMsec = now;
|
timeStartMsec = now;
|
||||||
zeroOffsetSecs = tv.tv_sec;
|
zeroOffsetSecs = tv.tv_sec;
|
||||||
currentQuality = RTCQualityDevice;
|
currentQuality = RTCQualityDevice;
|
||||||
triggerNodeInfoCheckOnTimeSource(oldQuality, currentQuality);
|
|
||||||
}
|
}
|
||||||
return RTCSetResultSuccess;
|
return RTCSetResultSuccess;
|
||||||
}
|
}
|
||||||
@@ -229,7 +214,6 @@ RTCSetResult perhapsSetRTC(RTCQuality q, const struct timeval *tv, bool forceUpd
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (shouldSet) {
|
if (shouldSet) {
|
||||||
RTCQuality oldQuality = currentQuality;
|
|
||||||
currentQuality = q;
|
currentQuality = q;
|
||||||
lastSetMsec = now;
|
lastSetMsec = now;
|
||||||
if (currentQuality >= RTCQualityNTP) {
|
if (currentQuality >= RTCQualityNTP) {
|
||||||
@@ -297,7 +281,6 @@ RTCSetResult perhapsSetRTC(RTCQuality q, const struct timeval *tv, bool forceUpd
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
readFromRTC();
|
readFromRTC();
|
||||||
triggerNodeInfoCheckOnTimeSource(oldQuality, currentQuality);
|
|
||||||
return RTCSetResultSuccess;
|
return RTCSetResultSuccess;
|
||||||
} else {
|
} else {
|
||||||
return RTCSetResultNotSet; // RTC was already set with a higher quality time
|
return RTCSetResultNotSet; // RTC was already set with a higher quality time
|
||||||
@@ -414,17 +397,6 @@ uint32_t getValidTime(RTCQuality minQuality, bool local)
|
|||||||
return (currentQuality >= minQuality) ? getTime(local) : 0;
|
return (currentQuality >= minQuality) ? getTime(local) : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef PIO_UNIT_TESTING
|
|
||||||
void setBootRelativeTimeForUnitTest(uint32_t secondsSinceBoot)
|
|
||||||
{
|
|
||||||
currentQuality = RTCQualityNone;
|
|
||||||
zeroOffsetSecs = 0;
|
|
||||||
timeStartMsec = millis() - (secondsSinceBoot * 1000);
|
|
||||||
lastSetFromPhoneNtpOrGps = 0;
|
|
||||||
lastTimeValidationWarning = 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
time_t gm_mktime(const struct tm *tm)
|
time_t gm_mktime(const struct tm *tm)
|
||||||
{
|
{
|
||||||
#if !MESHTASTIC_EXCLUDE_TZ
|
#if !MESHTASTIC_EXCLUDE_TZ
|
||||||
|
|||||||
@@ -54,10 +54,6 @@ uint32_t getValidTime(RTCQuality minQuality, bool local = false);
|
|||||||
|
|
||||||
RTCSetResult readFromRTC();
|
RTCSetResult readFromRTC();
|
||||||
|
|
||||||
#ifdef PIO_UNIT_TESTING
|
|
||||||
void setBootRelativeTimeForUnitTest(uint32_t secondsSinceBoot);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
time_t gm_mktime(const struct tm *tm);
|
time_t gm_mktime(const struct tm *tm);
|
||||||
|
|
||||||
#define SEC_PER_DAY 86400
|
#define SEC_PER_DAY 86400
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#include "configuration.h"
|
#include "configuration.h"
|
||||||
|
|
||||||
#if defined(USE_EINK) && !defined(USE_EINK_PARALLELDISPLAY)
|
#ifdef USE_EINK
|
||||||
#include "EInkDisplay2.h"
|
#include "EInkDisplay2.h"
|
||||||
#include "SPILock.h"
|
#include "SPILock.h"
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#if defined(USE_EINK) && !defined(USE_EINK_PARALLELDISPLAY)
|
#ifdef USE_EINK
|
||||||
|
|
||||||
#include "GxEPD2_BW.h"
|
#include "GxEPD2_BW.h"
|
||||||
#include <OLEDDisplay.h>
|
#include <OLEDDisplay.h>
|
||||||
|
|||||||
@@ -1,427 +0,0 @@
|
|||||||
#include "EInkParallelDisplay.h"
|
|
||||||
|
|
||||||
#ifdef USE_EINK_PARALLELDISPLAY
|
|
||||||
|
|
||||||
#include "Wire.h"
|
|
||||||
#include "variant.h"
|
|
||||||
#include <Arduino.h>
|
|
||||||
#include <atomic>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "FastEPD.h"
|
|
||||||
|
|
||||||
// Thresholds for choosing partial vs full update
|
|
||||||
#ifndef EPD_PARTIAL_THRESHOLD_ROWS
|
|
||||||
#define EPD_PARTIAL_THRESHOLD_ROWS 128 // if changed region <= this many rows, prefer partial
|
|
||||||
#endif
|
|
||||||
#ifndef EPD_FULLSLOW_PERIOD
|
|
||||||
#define EPD_FULLSLOW_PERIOD 100 // every N full updates do a slow (CLEAR_SLOW) full refresh
|
|
||||||
#endif
|
|
||||||
#ifndef EPD_RESPONSIVE_MIN_MS
|
|
||||||
#define EPD_RESPONSIVE_MIN_MS 1000 // simple rate-limit (ms) for responsive updates
|
|
||||||
#endif
|
|
||||||
|
|
||||||
EInkParallelDisplay::EInkParallelDisplay(uint16_t width, uint16_t height, EpdRotation rot) : epaper(nullptr), rotation(rot)
|
|
||||||
{
|
|
||||||
LOG_INFO("init EInkParallelDisplay");
|
|
||||||
// Set dimensions in OLEDDisplay base class
|
|
||||||
this->geometry = GEOMETRY_RAWMODE;
|
|
||||||
this->displayWidth = width;
|
|
||||||
this->displayHeight = height;
|
|
||||||
|
|
||||||
// Round shortest side up to nearest byte, to prevent truncation causing an undersized buffer
|
|
||||||
uint16_t shortSide = min(width, height);
|
|
||||||
uint16_t longSide = max(width, height);
|
|
||||||
if (shortSide % 8 != 0)
|
|
||||||
shortSide = (shortSide | 7) + 1;
|
|
||||||
|
|
||||||
this->displayBufferSize = longSide * (shortSide / 8);
|
|
||||||
|
|
||||||
#ifdef EINK_LIMIT_GHOSTING_PX
|
|
||||||
// allocate dirty pixel buffer same size as epaper buffers (rowBytes * height)
|
|
||||||
size_t rowBytes = (this->displayWidth + 7) / 8;
|
|
||||||
dirtyPixelsSize = rowBytes * this->displayHeight;
|
|
||||||
dirtyPixels = (uint8_t *)calloc(dirtyPixelsSize, 1);
|
|
||||||
ghostPixelCount = 0;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
EInkParallelDisplay::~EInkParallelDisplay()
|
|
||||||
{
|
|
||||||
#ifdef EINK_LIMIT_GHOSTING_PX
|
|
||||||
if (dirtyPixels) {
|
|
||||||
free(dirtyPixels);
|
|
||||||
dirtyPixels = nullptr;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
// If an async full update is running, wait for it to finish
|
|
||||||
if (asyncFullRunning.load()) {
|
|
||||||
// wait a short while for task to finish
|
|
||||||
for (int i = 0; i < 50 && asyncFullRunning.load(); ++i) {
|
|
||||||
delay(50);
|
|
||||||
}
|
|
||||||
if (asyncTaskHandle) {
|
|
||||||
// Let it finish or delete it
|
|
||||||
vTaskDelete(asyncTaskHandle);
|
|
||||||
asyncTaskHandle = nullptr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
delete epaper;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Called by the OLEDDisplay::init() path.
|
|
||||||
*/
|
|
||||||
bool EInkParallelDisplay::connect()
|
|
||||||
{
|
|
||||||
LOG_INFO("Do EPD init");
|
|
||||||
if (!epaper) {
|
|
||||||
epaper = new FASTEPD;
|
|
||||||
#if defined(T5_S3_EPAPER_PRO_V1)
|
|
||||||
epaper->initPanel(BB_PANEL_LILYGO_T5PRO, 28000000);
|
|
||||||
#elif defined(T5_S3_EPAPER_PRO_V2)
|
|
||||||
epaper->initPanel(BB_PANEL_LILYGO_T5PRO_V2, 28000000);
|
|
||||||
// initialize all port 0 pins (0-7) as outputs / HIGH
|
|
||||||
for (int i = 0; i < 8; i++) {
|
|
||||||
epaper->ioPinMode(i, OUTPUT);
|
|
||||||
epaper->ioWrite(i, HIGH);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
#error "unsupported EPD device!"
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
// epaper->setRotation(rotation); // does not work, messes up width/height
|
|
||||||
epaper->setMode(BB_MODE_1BPP);
|
|
||||||
epaper->clearWhite();
|
|
||||||
epaper->fullUpdate(true);
|
|
||||||
|
|
||||||
#ifdef EINK_LIMIT_GHOSTING_PX
|
|
||||||
// After a full/clear the dirty tracking should be reset
|
|
||||||
resetGhostPixelTracking();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* sendCommand - simple passthrough (not required for epd_driver-based path)
|
|
||||||
*/
|
|
||||||
void EInkParallelDisplay::sendCommand(uint8_t com)
|
|
||||||
{
|
|
||||||
LOG_DEBUG("EInkParallelDisplay::sendCommand %d", (int)com);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Start a background task that will perform a blocking fullUpdate(). This lets
|
|
||||||
* display() return quickly while the heavy refresh runs in the background.
|
|
||||||
*/
|
|
||||||
void EInkParallelDisplay::startAsyncFullUpdate(int clearMode)
|
|
||||||
{
|
|
||||||
if (asyncFullRunning.load())
|
|
||||||
return; // already running
|
|
||||||
|
|
||||||
asyncFullRunning.store(true);
|
|
||||||
// pass 'this' as parameter
|
|
||||||
BaseType_t rc = xTaskCreatePinnedToCore(EInkParallelDisplay::asyncFullUpdateTask, "epd_full", 4096 / sizeof(StackType_t),
|
|
||||||
this, 2, &asyncTaskHandle,
|
|
||||||
#if CONFIG_FREERTOS_UNICORE
|
|
||||||
0
|
|
||||||
#else
|
|
||||||
1
|
|
||||||
#endif
|
|
||||||
);
|
|
||||||
if (rc != pdPASS) {
|
|
||||||
LOG_WARN("Failed to create async full-update task, falling back to blocking update");
|
|
||||||
epaper->fullUpdate(clearMode, false);
|
|
||||||
epaper->backupPlane();
|
|
||||||
asyncFullRunning.store(false);
|
|
||||||
asyncTaskHandle = nullptr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* FreeRTOS task entry: runs the full update and then backs up plane.
|
|
||||||
*/
|
|
||||||
void EInkParallelDisplay::asyncFullUpdateTask(void *pvParameters)
|
|
||||||
{
|
|
||||||
EInkParallelDisplay *self = static_cast<EInkParallelDisplay *>(pvParameters);
|
|
||||||
if (!self) {
|
|
||||||
vTaskDelete(nullptr);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// choose CLEAR_SLOW occasionally
|
|
||||||
int clearMode = CLEAR_FAST;
|
|
||||||
if (self->fastRefreshCount >= EPD_FULLSLOW_PERIOD) {
|
|
||||||
clearMode = CLEAR_SLOW;
|
|
||||||
self->fastRefreshCount = 0;
|
|
||||||
} else {
|
|
||||||
// when running async full, treat it as a full so reset fast count
|
|
||||||
self->fastRefreshCount = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
self->epaper->fullUpdate(clearMode, false);
|
|
||||||
self->epaper->backupPlane();
|
|
||||||
|
|
||||||
#ifdef EINK_LIMIT_GHOSTING_PX
|
|
||||||
// A full refresh clears ghosting state
|
|
||||||
self->resetGhostPixelTracking();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
self->asyncFullRunning.store(false);
|
|
||||||
self->asyncTaskHandle = nullptr;
|
|
||||||
|
|
||||||
// delete this task
|
|
||||||
vTaskDelete(nullptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Convert the OLEDDisplay buffer (vertical byte layout) into the 1bpp horizontal-bytes
|
|
||||||
* buffer used by the FASTEPD library. For performance we write directly into FASTEPD's
|
|
||||||
* currentBuffer() while comparing against previousBuffer() to detect changed rows.
|
|
||||||
* After conversion we call FASTEPD::partialUpdate() or FASTEPD::fullUpdate() according
|
|
||||||
* to a heuristic so only the minimal region is refreshed.
|
|
||||||
*/
|
|
||||||
void EInkParallelDisplay::display(void)
|
|
||||||
{
|
|
||||||
const uint16_t w = this->displayWidth;
|
|
||||||
const uint16_t h = this->displayHeight;
|
|
||||||
|
|
||||||
// Simple rate limiting: avoid very-frequent responsive updates
|
|
||||||
uint32_t nowMs = millis();
|
|
||||||
if (lastUpdateMs != 0 && (nowMs - lastUpdateMs) < EPD_RESPONSIVE_MIN_MS) {
|
|
||||||
LOG_DEBUG("rate-limited, skipping update");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// bytes per row in epd format (one byte = 8 horizontal pixels)
|
|
||||||
const uint32_t rowBytes = (w + 7) / 8;
|
|
||||||
|
|
||||||
// Get pointers to internal buffers
|
|
||||||
uint8_t *cur = epaper->currentBuffer();
|
|
||||||
const uint8_t *prev = epaper->previousBuffer(); // may be NULL on first init
|
|
||||||
|
|
||||||
// Track changed row range while converting
|
|
||||||
int newTop = h; // min changed row (initialized to out-of-range)
|
|
||||||
int newBottom = -1; // max changed row
|
|
||||||
|
|
||||||
#ifdef FAST_EPD_PARTIAL_UPDATE_BUG
|
|
||||||
// Track changed byte column range (for clipped fullUpdate fallback)
|
|
||||||
int newLeftByte = (int)rowBytes;
|
|
||||||
int newRightByte = -1;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Compute a quick hash of the incoming OLED buffer (so we can skip identical frames)
|
|
||||||
uint32_t imageHash = 0;
|
|
||||||
uint32_t bufBytes = (w / 8) * h; // vertical-byte layout size
|
|
||||||
for (uint32_t bi = 0; bi < bufBytes; ++bi) {
|
|
||||||
imageHash ^= ((uint32_t)buffer[bi]) << (bi & 31);
|
|
||||||
}
|
|
||||||
if (imageHash == previousImageHash) {
|
|
||||||
// LOG_DEBUG("image identical to previous, skipping update");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef EINK_LIMIT_GHOSTING_PX
|
|
||||||
// reset ghost count for this conversion pass; we'll mark bits that change
|
|
||||||
ghostPixelCount = 0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Convert: OLED buffer layout -> FASTEPD 1bpp horizontal-bytes layout into cur,
|
|
||||||
// comparing against prev when available to detect changes.
|
|
||||||
for (uint32_t y = 0; y < h; ++y) {
|
|
||||||
const uint32_t base = (y >> 3) * w; // (y/8) * width
|
|
||||||
const uint8_t bitMask = (uint8_t)(1u << (y & 7)); // mask for this row in vertical-byte layout
|
|
||||||
const uint32_t rowBase = y * rowBytes;
|
|
||||||
|
|
||||||
// process full 8-pixel bytes
|
|
||||||
for (uint32_t xb = 0; xb < rowBytes; ++xb) {
|
|
||||||
uint32_t x0 = xb * 8;
|
|
||||||
// read up to 8 source bytes (vertical-byte per column)
|
|
||||||
uint8_t b0 = (x0 + 0 < w) ? buffer[base + x0 + 0] : 0;
|
|
||||||
uint8_t b1 = (x0 + 1 < w) ? buffer[base + x0 + 1] : 0;
|
|
||||||
uint8_t b2 = (x0 + 2 < w) ? buffer[base + x0 + 2] : 0;
|
|
||||||
uint8_t b3 = (x0 + 3 < w) ? buffer[base + x0 + 3] : 0;
|
|
||||||
uint8_t b4 = (x0 + 4 < w) ? buffer[base + x0 + 4] : 0;
|
|
||||||
uint8_t b5 = (x0 + 5 < w) ? buffer[base + x0 + 5] : 0;
|
|
||||||
uint8_t b6 = (x0 + 6 < w) ? buffer[base + x0 + 6] : 0;
|
|
||||||
uint8_t b7 = (x0 + 7 < w) ? buffer[base + x0 + 7] : 0;
|
|
||||||
|
|
||||||
// build output byte: MSB = leftmost pixel
|
|
||||||
uint8_t out = 0;
|
|
||||||
out |= (uint8_t)((b0 & bitMask) ? 0x80 : 0x00);
|
|
||||||
out |= (uint8_t)((b1 & bitMask) ? 0x40 : 0x00);
|
|
||||||
out |= (uint8_t)((b2 & bitMask) ? 0x20 : 0x00);
|
|
||||||
out |= (uint8_t)((b3 & bitMask) ? 0x10 : 0x00);
|
|
||||||
out |= (uint8_t)((b4 & bitMask) ? 0x08 : 0x00);
|
|
||||||
out |= (uint8_t)((b5 & bitMask) ? 0x04 : 0x00);
|
|
||||||
out |= (uint8_t)((b6 & bitMask) ? 0x02 : 0x00);
|
|
||||||
out |= (uint8_t)((b7 & bitMask) ? 0x01 : 0x00);
|
|
||||||
|
|
||||||
// handle partial byte at end of row by masking off invalid bits
|
|
||||||
uint8_t mask = 0xFF;
|
|
||||||
uint32_t bitsRemain = (w > x0) ? (w - x0) : 0;
|
|
||||||
if (bitsRemain > 0 && bitsRemain < 8) {
|
|
||||||
mask = (uint8_t)(0xFF << (8 - bitsRemain));
|
|
||||||
out &= mask;
|
|
||||||
}
|
|
||||||
|
|
||||||
// invert to FASTEPD polarity
|
|
||||||
out = (~out) & mask;
|
|
||||||
|
|
||||||
uint32_t pos = rowBase + xb;
|
|
||||||
uint8_t prevVal = prev ? (prev[pos] & mask) : 0x00;
|
|
||||||
// Consider this byte changed if previous buffer differs (or prev is null)
|
|
||||||
bool changed = (prev == nullptr) || (prevVal != out);
|
|
||||||
|
|
||||||
#ifdef EINK_LIMIT_GHOSTING_PX
|
|
||||||
if (changed && prev)
|
|
||||||
markDirtyBits(prev, pos, mask, out);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// mark row changed only if the previous buffer differs
|
|
||||||
if (changed) {
|
|
||||||
if (y < (uint32_t)newTop)
|
|
||||||
newTop = y;
|
|
||||||
if ((int)y > newBottom)
|
|
||||||
newBottom = y;
|
|
||||||
#ifdef FAST_EPD_PARTIAL_UPDATE_BUG
|
|
||||||
// record changed column bytes
|
|
||||||
if ((int)xb < newLeftByte)
|
|
||||||
newLeftByte = (int)xb;
|
|
||||||
if ((int)xb > newRightByte)
|
|
||||||
newRightByte = (int)xb;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
// Always write the computed value into the current buffer (avoid leaving stale bytes)
|
|
||||||
cur[pos] = (cur[pos] & ~mask) | out;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If nothing changed, avoid any panel update
|
|
||||||
if (newBottom < 0) {
|
|
||||||
LOG_DEBUG("no pixel changes detected, skipping update (conv)");
|
|
||||||
previousImageHash = imageHash; // still remember that frame
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Choose partial vs full update using heuristic
|
|
||||||
// Decide if we should force a full update after many fast updates
|
|
||||||
bool forceFull = (fastRefreshCount >= EPD_FULLSLOW_PERIOD);
|
|
||||||
|
|
||||||
#ifdef EINK_LIMIT_GHOSTING_PX
|
|
||||||
// If ghost pixels exceed limit, force a full update to clear ghosting
|
|
||||||
if (ghostPixelCount > ghostPixelLimit) {
|
|
||||||
LOG_WARN("ghost pixels %u > limit %u, forcing full refresh", ghostPixelCount, ghostPixelLimit);
|
|
||||||
forceFull = true;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Compute pixel bounds from newTop/newBottom
|
|
||||||
int startRow = (newTop / 8) * 8;
|
|
||||||
int endRow = (newBottom / 8) * 8 + 7;
|
|
||||||
|
|
||||||
LOG_DEBUG("EPD update rows=%d..%d alignedRows=%d..%d rowBytes=%u", newTop, newBottom, startRow, endRow, rowBytes);
|
|
||||||
|
|
||||||
if (epaper->getMode() == BB_MODE_1BPP && !forceFull && (newBottom - newTop) <= EPD_PARTIAL_THRESHOLD_ROWS) {
|
|
||||||
// Prefer partial update path if driver is reliable; otherwise use clipped fullUpdate fallback.
|
|
||||||
#ifdef FAST_EPD_PARTIAL_UPDATE_BUG
|
|
||||||
// Workaround for FastEPD partial update bug: use clipped fullUpdate instead
|
|
||||||
// Build a pixel rectangle for a clipped fullUpdate using the changed columns
|
|
||||||
int startCol = (newLeftByte <= newRightByte) ? (newLeftByte * 8) : 0;
|
|
||||||
int endCol = (newLeftByte <= newRightByte) ? ((newRightByte + 1) * 8 - 1) : (w - 1);
|
|
||||||
|
|
||||||
BB_RECT rect{startCol, startRow, endCol - startCol + 1, endRow - startRow + 1};
|
|
||||||
// LOG_DEBUG("Using clipped fullUpdate rect x=%d y=%d w=%d h=%d", rect.x, rect.y, rect.w, rect.h);
|
|
||||||
epaper->fullUpdate(CLEAR_FAST, false, &rect);
|
|
||||||
#else
|
|
||||||
// Use rows for partial update
|
|
||||||
LOG_DEBUG("calling partialUpdate startRow=%d endRow=%d", startRow, endRow);
|
|
||||||
epaper->partialUpdate(true, startRow, endRow);
|
|
||||||
#endif
|
|
||||||
epaper->backupPlane();
|
|
||||||
fastRefreshCount++;
|
|
||||||
} else {
|
|
||||||
// Full update: run async if possible (startAsyncFullUpdate will fall back to blocking)
|
|
||||||
startAsyncFullUpdate(forceFull ? CLEAR_SLOW : CLEAR_FAST);
|
|
||||||
}
|
|
||||||
|
|
||||||
lastUpdateMs = millis();
|
|
||||||
previousImageHash = imageHash;
|
|
||||||
|
|
||||||
// Keep same behavior as before
|
|
||||||
lastDrawMsec = millis();
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef EINK_LIMIT_GHOSTING_PX
|
|
||||||
// markDirtyBits: mark per-bit dirty flags and update ghostPixelCount
|
|
||||||
void EInkParallelDisplay::markDirtyBits(const uint8_t *prevBuf, uint32_t pos, uint8_t mask, uint8_t out)
|
|
||||||
{
|
|
||||||
// defensive: need dirtyPixels allocated and prevBuf valid
|
|
||||||
if (!dirtyPixels || !prevBuf)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// 'out' is in FASTEPD polarity (1 = black, 0 = white)
|
|
||||||
uint8_t newBlack = out & mask; // bits that will be black now
|
|
||||||
uint8_t newWhite = (~out) & mask; // bits that will be white now
|
|
||||||
|
|
||||||
// previously recorded dirty bits for this byte
|
|
||||||
uint8_t before = dirtyPixels[pos];
|
|
||||||
|
|
||||||
// Ghost bits: bits that were previously marked dirty and are now being driven white
|
|
||||||
uint8_t ghostBits = before & newWhite;
|
|
||||||
if (ghostBits) {
|
|
||||||
ghostPixelCount += __builtin_popcount((unsigned)ghostBits);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Only mark bits dirty when they turn black now (accumulate until a full refresh)
|
|
||||||
uint8_t newlyDirty = newBlack & (~before);
|
|
||||||
if (newlyDirty) {
|
|
||||||
dirtyPixels[pos] |= newlyDirty;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// reset ghost tracking (call after a full refresh)
|
|
||||||
void EInkParallelDisplay::resetGhostPixelTracking()
|
|
||||||
{
|
|
||||||
if (!dirtyPixels)
|
|
||||||
return;
|
|
||||||
memset(dirtyPixels, 0, dirtyPixelsSize);
|
|
||||||
ghostPixelCount = 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* forceDisplay: use lastDrawMsec
|
|
||||||
*/
|
|
||||||
bool EInkParallelDisplay::forceDisplay(uint32_t msecLimit)
|
|
||||||
{
|
|
||||||
uint32_t now = millis();
|
|
||||||
if (lastDrawMsec == 0 || (now - lastDrawMsec) > msecLimit) {
|
|
||||||
display();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void EInkParallelDisplay::endUpdate()
|
|
||||||
{
|
|
||||||
{
|
|
||||||
// ensure any async full update is started/completed
|
|
||||||
if (asyncFullRunning.load()) {
|
|
||||||
// nothing to do; background task will run and call backupPlane when done
|
|
||||||
} else {
|
|
||||||
epaper->fullUpdate(CLEAR_FAST, false);
|
|
||||||
epaper->backupPlane();
|
|
||||||
#ifdef EINK_LIMIT_GHOSTING_PX
|
|
||||||
resetGhostPixelTracking();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,69 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "configuration.h"
|
|
||||||
|
|
||||||
#ifdef USE_EINK_PARALLELDISPLAY
|
|
||||||
#include <OLEDDisplay.h>
|
|
||||||
|
|
||||||
#include <atomic>
|
|
||||||
#include <freertos/FreeRTOS.h>
|
|
||||||
#include <freertos/task.h>
|
|
||||||
|
|
||||||
class FASTEPD;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Adapter for E-Ink 8-bit parallel displays (EPD), specifically devices supported by FastEPD library
|
|
||||||
*/
|
|
||||||
class EInkParallelDisplay : public OLEDDisplay
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
enum EpdRotation {
|
|
||||||
EPD_ROT_LANDSCAPE = 0,
|
|
||||||
EPD_ROT_PORTRAIT = 90,
|
|
||||||
EPD_ROT_INVERTED_LANDSCAPE = 180,
|
|
||||||
EPD_ROT_INVERTED_PORTRAIT = 270,
|
|
||||||
};
|
|
||||||
|
|
||||||
EInkParallelDisplay(uint16_t width, uint16_t height, EpdRotation rotation);
|
|
||||||
virtual ~EInkParallelDisplay();
|
|
||||||
|
|
||||||
// OLEDDisplay virtuals
|
|
||||||
bool connect() override;
|
|
||||||
void sendCommand(uint8_t com) override;
|
|
||||||
int getBufferOffset(void) override { return 0; }
|
|
||||||
|
|
||||||
void display(void) override;
|
|
||||||
bool forceDisplay(uint32_t msecLimit = 1000);
|
|
||||||
void endUpdate();
|
|
||||||
|
|
||||||
protected:
|
|
||||||
uint32_t lastDrawMsec = 0;
|
|
||||||
FASTEPD *epaper;
|
|
||||||
|
|
||||||
private:
|
|
||||||
// Async full-refresh support
|
|
||||||
std::atomic<bool> asyncFullRunning{false};
|
|
||||||
TaskHandle_t asyncTaskHandle = nullptr;
|
|
||||||
void startAsyncFullUpdate(int clearMode);
|
|
||||||
static void asyncFullUpdateTask(void *pvParameters);
|
|
||||||
|
|
||||||
#ifdef EINK_LIMIT_GHOSTING_PX
|
|
||||||
// helpers
|
|
||||||
void resetGhostPixelTracking();
|
|
||||||
void markDirtyBits(const uint8_t *prevBuf, uint32_t pos, uint8_t mask, uint8_t out);
|
|
||||||
void countGhostPixelsAndMaybePromote(int &newTop, int &newBottom, bool &forceFull);
|
|
||||||
|
|
||||||
// per-bit dirty buffer (same format as epaper buffers): one bit == one pixel
|
|
||||||
uint8_t *dirtyPixels = nullptr;
|
|
||||||
size_t dirtyPixelsSize = 0;
|
|
||||||
uint32_t ghostPixelCount = 0;
|
|
||||||
uint32_t ghostPixelLimit = EINK_LIMIT_GHOSTING_PX;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
EpdRotation rotation;
|
|
||||||
uint32_t previousImageHash = 0;
|
|
||||||
uint32_t lastUpdateMs = 0;
|
|
||||||
int fastRefreshCount = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
+3
-12
@@ -27,7 +27,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
#include "configuration.h"
|
#include "configuration.h"
|
||||||
#include "meshUtils.h"
|
#include "meshUtils.h"
|
||||||
#if HAS_SCREEN
|
#if HAS_SCREEN
|
||||||
#include "EInkParallelDisplay.h"
|
|
||||||
#include <OLEDDisplay.h>
|
#include <OLEDDisplay.h>
|
||||||
|
|
||||||
#include "DisplayFormatters.h"
|
#include "DisplayFormatters.h"
|
||||||
@@ -365,14 +364,12 @@ Screen::Screen(ScanI2C::DeviceAddress address, meshtastic_Config_DisplayConfig_O
|
|||||||
defined(RAK14014) || defined(HX8357_CS) || defined(ILI9488_CS) || defined(ST7796_CS) || defined(HACKADAY_COMMUNICATOR)
|
defined(RAK14014) || defined(HX8357_CS) || defined(ILI9488_CS) || defined(ST7796_CS) || defined(HACKADAY_COMMUNICATOR)
|
||||||
dispdev = new TFTDisplay(address.address, -1, -1, geometry,
|
dispdev = new TFTDisplay(address.address, -1, -1, geometry,
|
||||||
(address.port == ScanI2C::I2CPort::WIRE1) ? HW_I2C::I2C_TWO : HW_I2C::I2C_ONE);
|
(address.port == ScanI2C::I2CPort::WIRE1) ? HW_I2C::I2C_TWO : HW_I2C::I2C_ONE);
|
||||||
#elif defined(USE_EINK) && !defined(USE_EINK_DYNAMICDISPLAY) && !defined(USE_EINK_PARALLELDISPLAY)
|
#elif defined(USE_EINK) && !defined(USE_EINK_DYNAMICDISPLAY)
|
||||||
dispdev = new EInkDisplay(address.address, -1, -1, geometry,
|
dispdev = new EInkDisplay(address.address, -1, -1, geometry,
|
||||||
(address.port == ScanI2C::I2CPort::WIRE1) ? HW_I2C::I2C_TWO : HW_I2C::I2C_ONE);
|
(address.port == ScanI2C::I2CPort::WIRE1) ? HW_I2C::I2C_TWO : HW_I2C::I2C_ONE);
|
||||||
#elif defined(USE_EINK) && defined(USE_EINK_DYNAMICDISPLAY)
|
#elif defined(USE_EINK) && defined(USE_EINK_DYNAMICDISPLAY)
|
||||||
dispdev = new EInkDynamicDisplay(address.address, -1, -1, geometry,
|
dispdev = new EInkDynamicDisplay(address.address, -1, -1, geometry,
|
||||||
(address.port == ScanI2C::I2CPort::WIRE1) ? HW_I2C::I2C_TWO : HW_I2C::I2C_ONE);
|
(address.port == ScanI2C::I2CPort::WIRE1) ? HW_I2C::I2C_TWO : HW_I2C::I2C_ONE);
|
||||||
#elif defined(USE_EINK_PARALLELDISPLAY)
|
|
||||||
dispdev = new EInkParallelDisplay(EPD_WIDTH, EPD_HEIGHT, EInkParallelDisplay::EPD_ROT_PORTRAIT);
|
|
||||||
#elif defined(USE_ST7567)
|
#elif defined(USE_ST7567)
|
||||||
dispdev = new ST7567Wire(address.address, -1, -1, geometry,
|
dispdev = new ST7567Wire(address.address, -1, -1, geometry,
|
||||||
(address.port == ScanI2C::I2CPort::WIRE1) ? HW_I2C::I2C_TWO : HW_I2C::I2C_ONE);
|
(address.port == ScanI2C::I2CPort::WIRE1) ? HW_I2C::I2C_TWO : HW_I2C::I2C_ONE);
|
||||||
@@ -762,11 +759,7 @@ void Screen::forceDisplay(bool forceUiUpdate)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Tell EInk class to update the display
|
// Tell EInk class to update the display
|
||||||
#if defined(USE_EINK_PARALLELDISPLAY)
|
|
||||||
static_cast<EInkParallelDisplay *>(dispdev)->forceDisplay();
|
|
||||||
#elif defined(USE_EINK)
|
|
||||||
static_cast<EInkDisplay *>(dispdev)->forceDisplay();
|
static_cast<EInkDisplay *>(dispdev)->forceDisplay();
|
||||||
#endif
|
|
||||||
#else
|
#else
|
||||||
// No delay between UI frame rendering
|
// No delay between UI frame rendering
|
||||||
if (forceUiUpdate) {
|
if (forceUiUpdate) {
|
||||||
@@ -1005,10 +998,8 @@ void Screen::setScreensaverFrames(FrameCallback einkScreensaver)
|
|||||||
ui->update();
|
ui->update();
|
||||||
} while (ui->getUiState()->lastUpdate < startUpdate);
|
} while (ui->getUiState()->lastUpdate < startUpdate);
|
||||||
|
|
||||||
#if defined(USE_EINK_PARALLELDISPLAY)
|
|
||||||
static_cast<EInkParallelDisplay *>(dispdev)->forceDisplay(0);
|
|
||||||
#elif defined(USE_EINK) && !defined(USE_EINK_DYNAMICDISPLAY)
|
|
||||||
// Old EInkDisplay class
|
// Old EInkDisplay class
|
||||||
|
#if !defined(USE_EINK_DYNAMICDISPLAY)
|
||||||
static_cast<EInkDisplay *>(dispdev)->forceDisplay(0); // Screen::forceDisplay(), but override rate-limit
|
static_cast<EInkDisplay *>(dispdev)->forceDisplay(0); // Screen::forceDisplay(), but override rate-limit
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -1020,7 +1011,7 @@ void Screen::setScreensaverFrames(FrameCallback einkScreensaver)
|
|||||||
#ifdef EINK_HASQUIRK_GHOSTING
|
#ifdef EINK_HASQUIRK_GHOSTING
|
||||||
EINK_ADD_FRAMEFLAG(dispdev, COSMETIC); // Really ugly to see ghosting from "screen paused"
|
EINK_ADD_FRAMEFLAG(dispdev, COSMETIC); // Really ugly to see ghosting from "screen paused"
|
||||||
#else
|
#else
|
||||||
EINK_ADD_FRAMEFLAG(dispdev, RESPONSIVE); // Really nice to wake screen with a fast-refresh
|
EINK_ADD_FRAMEFLAG(dispdev, RESPONSIVE); // Really nice to wake screen with a fast-refresh
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
#include "graphics/fonts/OLEDDisplayFontsGR.h"
|
#include "graphics/fonts/OLEDDisplayFontsGR.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (defined(CROWPANEL_ESP32S3_5_EPAPER) || defined(T5_S3_EPAPER_PRO)) && defined(USE_EINK)
|
#if defined(CROWPANEL_ESP32S3_5_EPAPER) && defined(USE_EINK)
|
||||||
#include "graphics/fonts/EinkDisplayFonts.h"
|
#include "graphics/fonts/EinkDisplayFonts.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -90,7 +90,7 @@
|
|||||||
|
|
||||||
#if (defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ILI9342_DRIVER) || defined(ST7701_CS) || defined(ST7735_CS) || \
|
#if (defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ILI9342_DRIVER) || defined(ST7701_CS) || defined(ST7735_CS) || \
|
||||||
defined(ST7789_CS) || defined(USE_ST7789) || defined(HX8357_CS) || defined(ILI9488_CS) || defined(ST7796_CS) || \
|
defined(ST7789_CS) || defined(USE_ST7789) || defined(HX8357_CS) || defined(ILI9488_CS) || defined(ST7796_CS) || \
|
||||||
defined(USE_ST7796) || defined(HACKADAY_COMMUNICATOR)) && \
|
defined(HACKADAY_COMMUNICATOR) || defined(USE_ST7796)) && \
|
||||||
!defined(DISPLAY_FORCE_SMALL_FONTS)
|
!defined(DISPLAY_FORCE_SMALL_FONTS)
|
||||||
// The screen is bigger so use bigger fonts
|
// The screen is bigger so use bigger fonts
|
||||||
#define FONT_SMALL FONT_MEDIUM_LOCAL // Height: 19
|
#define FONT_SMALL FONT_MEDIUM_LOCAL // Height: 19
|
||||||
@@ -106,7 +106,7 @@
|
|||||||
#define FONT_LARGE FONT_LARGE_LOCAL // Height: 28
|
#define FONT_LARGE FONT_LARGE_LOCAL // Height: 28
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CROWPANEL_ESP32S3_5_EPAPER) || defined(T5_S3_EPAPER_PRO)
|
#if defined(CROWPANEL_ESP32S3_5_EPAPER) && defined(USE_EINK)
|
||||||
#undef FONT_SMALL
|
#undef FONT_SMALL
|
||||||
#undef FONT_MEDIUM
|
#undef FONT_MEDIUM
|
||||||
#undef FONT_LARGE
|
#undef FONT_LARGE
|
||||||
|
|||||||
@@ -1254,14 +1254,14 @@ void TFTDisplay::display(bool fromBlank)
|
|||||||
|
|
||||||
// Did we find a pixel that needs updating on this row?
|
// Did we find a pixel that needs updating on this row?
|
||||||
if (x_FirstPixelUpdate < displayWidth) {
|
if (x_FirstPixelUpdate < displayWidth) {
|
||||||
// Align the first pixel for update to an even number so the total alignment of
|
|
||||||
// the data will be at 32-bit boundary, which is required by GDMA SPI transfers.
|
|
||||||
x_FirstPixelUpdate &= ~1;
|
|
||||||
|
|
||||||
// Step 3a: copy rest of the pixels in this row into the pixel line buffer,
|
// Quickly write out the first changed pixel (saves another array lookup)
|
||||||
// while also recording the last pixel in the row that needs updating.
|
linePixelBuffer[x_FirstPixelUpdate] = isset ? colorTftMesh : colorTftBlack;
|
||||||
// Since the first changed pixel will be looked up, the x_LastPixelUpdate will be set.
|
x_LastPixelUpdate = x_FirstPixelUpdate;
|
||||||
for (x = x_FirstPixelUpdate; x < displayWidth; x++) {
|
|
||||||
|
// Step 3: copy all remaining pixels in this row into the pixel line buffer,
|
||||||
|
// while also recording the last pixel in the row that needs updating
|
||||||
|
for (x = x_FirstPixelUpdate + 1; x < displayWidth; x++) {
|
||||||
isset = buffer[x + y_byteIndex] & y_byteMask;
|
isset = buffer[x + y_byteIndex] & y_byteMask;
|
||||||
linePixelBuffer[x] = isset ? colorTftMesh : colorTftBlack;
|
linePixelBuffer[x] = isset ? colorTftMesh : colorTftBlack;
|
||||||
|
|
||||||
@@ -1274,14 +1274,6 @@ void TFTDisplay::display(bool fromBlank)
|
|||||||
x_LastPixelUpdate = x;
|
x_LastPixelUpdate = x;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Step 3b: Round up the last pixel to odd number to maintain 32-bit alignment for SPIs.
|
|
||||||
// Most displays will have even number of pixels in a row -- this will be in bounds
|
|
||||||
// of the displayWidth. (Hopefully odd displays will just ignore that extra pixel.)
|
|
||||||
x_LastPixelUpdate |= 1;
|
|
||||||
// Ensure the last pixel index does not exceed the display width.
|
|
||||||
if (x_LastPixelUpdate >= displayWidth) {
|
|
||||||
x_LastPixelUpdate = displayWidth - 1;
|
|
||||||
}
|
|
||||||
#if defined(HACKADAY_COMMUNICATOR)
|
#if defined(HACKADAY_COMMUNICATOR)
|
||||||
tft->draw16bitBeRGBBitmap(x_FirstPixelUpdate, y, &linePixelBuffer[x_FirstPixelUpdate],
|
tft->draw16bitBeRGBBitmap(x_FirstPixelUpdate, y, &linePixelBuffer[x_FirstPixelUpdate],
|
||||||
(x_LastPixelUpdate - x_FirstPixelUpdate + 1), 1);
|
(x_LastPixelUpdate - x_FirstPixelUpdate + 1), 1);
|
||||||
|
|||||||
@@ -544,9 +544,6 @@ void drawSystemScreen(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x
|
|||||||
#ifndef T_DECK_PRO
|
#ifndef T_DECK_PRO
|
||||||
barsOffset -= 12;
|
barsOffset -= 12;
|
||||||
#endif
|
#endif
|
||||||
#if defined(T5_S3_EPAPER_PRO)
|
|
||||||
barsOffset += 60;
|
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
int barX = x + barsOffset;
|
int barX = x + barsOffset;
|
||||||
if (currentResolution == ScreenResolution::UltraLow) {
|
if (currentResolution == ScreenResolution::UltraLow) {
|
||||||
@@ -596,12 +593,11 @@ void drawSystemScreen(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x
|
|||||||
uint32_t heapUsed = memGet.getHeapSize() - memGet.getFreeHeap();
|
uint32_t heapUsed = memGet.getHeapSize() - memGet.getFreeHeap();
|
||||||
uint32_t heapTotal = memGet.getHeapSize();
|
uint32_t heapTotal = memGet.getHeapSize();
|
||||||
|
|
||||||
uint32_t flashUsed = 0, flashTotal = 0;
|
|
||||||
#ifdef ESP32
|
|
||||||
#ifndef T5_S3_EPAPER_PRO
|
|
||||||
uint32_t psramUsed = memGet.getPsramSize() - memGet.getFreePsram();
|
uint32_t psramUsed = memGet.getPsramSize() - memGet.getFreePsram();
|
||||||
uint32_t psramTotal = memGet.getPsramSize();
|
uint32_t psramTotal = memGet.getPsramSize();
|
||||||
#endif
|
|
||||||
|
uint32_t flashUsed = 0, flashTotal = 0;
|
||||||
|
#ifdef ESP32
|
||||||
flashUsed = FSCom.usedBytes();
|
flashUsed = FSCom.usedBytes();
|
||||||
flashTotal = FSCom.totalBytes();
|
flashTotal = FSCom.totalBytes();
|
||||||
#endif
|
#endif
|
||||||
@@ -620,12 +616,10 @@ void drawSystemScreen(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x
|
|||||||
// === Draw memory rows
|
// === Draw memory rows
|
||||||
drawUsageRow("Heap:", heapUsed, heapTotal, true);
|
drawUsageRow("Heap:", heapUsed, heapTotal, true);
|
||||||
#ifdef ESP32
|
#ifdef ESP32
|
||||||
#ifndef T5_S3_EPAPER_PRO
|
|
||||||
if (psramUsed > 0) {
|
if (psramUsed > 0) {
|
||||||
line += 1;
|
line += 1;
|
||||||
drawUsageRow("PSRAM:", psramUsed, psramTotal);
|
drawUsageRow("PSRAM:", psramUsed, psramTotal);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
if (flashTotal > 0) {
|
if (flashTotal > 0) {
|
||||||
line += 1;
|
line += 1;
|
||||||
drawUsageRow("Flash:", flashUsed, flashTotal);
|
drawUsageRow("Flash:", flashUsed, flashTotal);
|
||||||
|
|||||||
@@ -163,11 +163,9 @@ void menuHandler::LoraRegionPicker(uint32_t duration)
|
|||||||
|
|
||||||
// Guard: without a reboot, reconfigure() applies the region directly.
|
// Guard: without a reboot, reconfigure() applies the region directly.
|
||||||
// Reject LORA_24 on sub-GHz-only hardware — getRadio() used to catch this post-reboot.
|
// Reject LORA_24 on sub-GHz-only hardware — getRadio() used to catch this post-reboot.
|
||||||
// TODO: change this to either use the validateLoraConfig() logic or at least check the region for wideLora
|
|
||||||
// rather than a hardcoded check for LORA_24.
|
|
||||||
if (selectedRegion == meshtastic_Config_LoRaConfig_RegionCode_LORA_24 &&
|
if (selectedRegion == meshtastic_Config_LoRaConfig_RegionCode_LORA_24 &&
|
||||||
!(RadioLibInterface::instance && RadioLibInterface::instance->wideLora())) {
|
!(RadioLibInterface::instance && RadioLibInterface::instance->wideLora())) {
|
||||||
LOG_WARN("Radio hardware does not support 2.4 GHz; ignoring region selection");
|
LOG_WARN("Radio hardware does not support 2.4 GHz; ignoring LORA_24 selection");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1223,11 +1221,9 @@ void menuHandler::positionBaseMenu()
|
|||||||
};
|
};
|
||||||
|
|
||||||
constexpr size_t baseCount = sizeof(baseOptions) / sizeof(baseOptions[0]);
|
constexpr size_t baseCount = sizeof(baseOptions) / sizeof(baseOptions[0]);
|
||||||
static std::array<const char *, baseCount> baseLabels{};
|
|
||||||
#if !MESHTASTIC_EXCLUDE_ACCELEROMETER
|
|
||||||
constexpr size_t calibrateCount = sizeof(calibrateOptions) / sizeof(calibrateOptions[0]);
|
constexpr size_t calibrateCount = sizeof(calibrateOptions) / sizeof(calibrateOptions[0]);
|
||||||
|
static std::array<const char *, baseCount> baseLabels{};
|
||||||
static std::array<const char *, calibrateCount> calibrateLabels{};
|
static std::array<const char *, calibrateCount> calibrateLabels{};
|
||||||
#endif
|
|
||||||
|
|
||||||
auto onSelection = [](const PositionMenuOption &option, int) -> void {
|
auto onSelection = [](const PositionMenuOption &option, int) -> void {
|
||||||
if (option.action == OptionsAction::Back) {
|
if (option.action == OptionsAction::Back) {
|
||||||
@@ -1253,11 +1249,9 @@ void menuHandler::positionBaseMenu()
|
|||||||
screen->runNow();
|
screen->runNow();
|
||||||
break;
|
break;
|
||||||
case PositionAction::CompassCalibrate:
|
case PositionAction::CompassCalibrate:
|
||||||
#if !MESHTASTIC_EXCLUDE_ACCELEROMETER
|
|
||||||
if (accelerometerThread) {
|
if (accelerometerThread) {
|
||||||
accelerometerThread->calibrate(30);
|
accelerometerThread->calibrate(30);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
break;
|
break;
|
||||||
case PositionAction::GPSSmartPosition:
|
case PositionAction::GPSSmartPosition:
|
||||||
menuQueue = GpsSmartPositionMenu;
|
menuQueue = GpsSmartPositionMenu;
|
||||||
@@ -1275,15 +1269,11 @@ void menuHandler::positionBaseMenu()
|
|||||||
};
|
};
|
||||||
|
|
||||||
BannerOverlayOptions bannerOptions;
|
BannerOverlayOptions bannerOptions;
|
||||||
#if !MESHTASTIC_EXCLUDE_ACCELEROMETER
|
|
||||||
if (accelerometerThread) {
|
if (accelerometerThread) {
|
||||||
bannerOptions = createStaticBannerOptions("GPS Action", calibrateOptions, calibrateLabels, onSelection);
|
bannerOptions = createStaticBannerOptions("GPS Action", calibrateOptions, calibrateLabels, onSelection);
|
||||||
} else {
|
} else {
|
||||||
bannerOptions = createStaticBannerOptions("GPS Action", baseOptions, baseLabels, onSelection);
|
bannerOptions = createStaticBannerOptions("GPS Action", baseOptions, baseLabels, onSelection);
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
bannerOptions = createStaticBannerOptions("GPS Action", baseOptions, baseLabels, onSelection);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
screen->showOverlayBanner(bannerOptions);
|
screen->showOverlayBanner(bannerOptions);
|
||||||
}
|
}
|
||||||
@@ -2213,9 +2203,9 @@ void menuHandler::traceRouteMenu()
|
|||||||
void menuHandler::testMenu()
|
void menuHandler::testMenu()
|
||||||
{
|
{
|
||||||
|
|
||||||
enum optionsNumbers { Back, NumberPicker, ShowChirpy, TestAnnounce };
|
enum optionsNumbers { Back, NumberPicker, ShowChirpy };
|
||||||
static const char *optionsArray[5] = {"Back"};
|
static const char *optionsArray[4] = {"Back"};
|
||||||
static int optionsEnumArray[5] = {Back};
|
static int optionsEnumArray[4] = {Back};
|
||||||
int options = 1;
|
int options = 1;
|
||||||
|
|
||||||
optionsArray[options] = "Number Picker";
|
optionsArray[options] = "Number Picker";
|
||||||
@@ -2223,10 +2213,6 @@ void menuHandler::testMenu()
|
|||||||
|
|
||||||
optionsArray[options] = screen->isFrameHidden("chirpy") ? "Show Chirpy" : "Hide Chirpy";
|
optionsArray[options] = screen->isFrameHidden("chirpy") ? "Show Chirpy" : "Hide Chirpy";
|
||||||
optionsEnumArray[options++] = ShowChirpy;
|
optionsEnumArray[options++] = ShowChirpy;
|
||||||
#ifdef HAS_I2S
|
|
||||||
optionsArray[options] = "Test Announce";
|
|
||||||
optionsEnumArray[options++] = TestAnnounce;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
BannerOverlayOptions bannerOptions;
|
BannerOverlayOptions bannerOptions;
|
||||||
bannerOptions.message = "Hidden Test Menu";
|
bannerOptions.message = "Hidden Test Menu";
|
||||||
@@ -2241,10 +2227,6 @@ void menuHandler::testMenu()
|
|||||||
screen->toggleFrameVisibility("chirpy");
|
screen->toggleFrameVisibility("chirpy");
|
||||||
screen->setFrames(Screen::FOCUS_SYSTEM);
|
screen->setFrames(Screen::FOCUS_SYSTEM);
|
||||||
|
|
||||||
} else if (selected == TestAnnounce) {
|
|
||||||
#ifdef HAS_I2S
|
|
||||||
audioThread->readAloud("This is a test of the emergency broadcast system. This is only a test.");
|
|
||||||
#endif
|
|
||||||
} else {
|
} else {
|
||||||
menuQueue = SystemBaseMenu;
|
menuQueue = SystemBaseMenu;
|
||||||
screen->runNow();
|
screen->runNow();
|
||||||
|
|||||||
@@ -15,7 +15,6 @@
|
|||||||
|
|
||||||
#include <GFX.h> // GFXRoot drawing lib
|
#include <GFX.h> // GFXRoot drawing lib
|
||||||
|
|
||||||
#include "mesh/MeshModule.h"
|
|
||||||
#include "mesh/MeshTypes.h"
|
#include "mesh/MeshTypes.h"
|
||||||
|
|
||||||
#include "./AppletFont.h"
|
#include "./AppletFont.h"
|
||||||
|
|||||||
@@ -299,7 +299,6 @@ void InputBroker::Init()
|
|||||||
// Buttons. Moved here cause we need NodeDB to be initialized
|
// Buttons. Moved here cause we need NodeDB to be initialized
|
||||||
// If your variant.h has a BUTTON_PIN defined, go ahead and define BUTTON_ACTIVE_LOW and BUTTON_ACTIVE_PULLUP
|
// If your variant.h has a BUTTON_PIN defined, go ahead and define BUTTON_ACTIVE_LOW and BUTTON_ACTIVE_PULLUP
|
||||||
UserButtonThread = new ButtonThread("UserButton");
|
UserButtonThread = new ButtonThread("UserButton");
|
||||||
#if !MESHTASTIC_EXCLUDE_SCREEN
|
|
||||||
if (screen) {
|
if (screen) {
|
||||||
ButtonConfig userConfig;
|
ButtonConfig userConfig;
|
||||||
userConfig.pinNumber = (uint8_t)_pinNum;
|
userConfig.pinNumber = (uint8_t)_pinNum;
|
||||||
@@ -318,9 +317,7 @@ void InputBroker::Init()
|
|||||||
userConfig.longPressTime = 500;
|
userConfig.longPressTime = 500;
|
||||||
userConfig.longLongPress = INPUT_BROKER_SHUTDOWN;
|
userConfig.longLongPress = INPUT_BROKER_SHUTDOWN;
|
||||||
UserButtonThread->initButton(userConfig);
|
UserButtonThread->initButton(userConfig);
|
||||||
} else
|
} else {
|
||||||
#endif
|
|
||||||
{
|
|
||||||
ButtonConfig userConfigNoScreen;
|
ButtonConfig userConfigNoScreen;
|
||||||
userConfigNoScreen.pinNumber = (uint8_t)_pinNum;
|
userConfigNoScreen.pinNumber = (uint8_t)_pinNum;
|
||||||
userConfigNoScreen.activeLow = BUTTON_ACTIVE_LOW;
|
userConfigNoScreen.activeLow = BUTTON_ACTIVE_LOW;
|
||||||
@@ -382,13 +379,11 @@ void InputBroker::Init()
|
|||||||
}
|
}
|
||||||
#endif // HAS_BUTTON
|
#endif // HAS_BUTTON
|
||||||
#if ARCH_PORTDUINO
|
#if ARCH_PORTDUINO
|
||||||
if (config.display.displaymode != meshtastic_Config_DisplayConfig_DisplayMode_COLOR) {
|
if (config.display.displaymode != meshtastic_Config_DisplayConfig_DisplayMode_COLOR && portduino_config.i2cdev != "") {
|
||||||
if (portduino_config.i2cdev != "") {
|
seesawRotary = new SeesawRotary("SeesawRotary");
|
||||||
seesawRotary = new SeesawRotary("SeesawRotary");
|
if (!seesawRotary->init()) {
|
||||||
if (!seesawRotary->init()) {
|
delete seesawRotary;
|
||||||
delete seesawRotary;
|
seesawRotary = nullptr;
|
||||||
seesawRotary = nullptr;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
aLinuxInputImpl = new LinuxInputImpl();
|
aLinuxInputImpl = new LinuxInputImpl();
|
||||||
aLinuxInputImpl->init();
|
aLinuxInputImpl->init();
|
||||||
|
|||||||
+3
-3
@@ -123,7 +123,7 @@ void printPartitionTable()
|
|||||||
#include "AmbientLightingThread.h"
|
#include "AmbientLightingThread.h"
|
||||||
#include "PowerFSMThread.h"
|
#include "PowerFSMThread.h"
|
||||||
|
|
||||||
#if !defined(ARCH_STM32WL) && !MESHTASTIC_EXCLUDE_I2C && !MESHTASTIC_EXCLUDE_ACCELEROMETER
|
#if !defined(ARCH_STM32WL) && !MESHTASTIC_EXCLUDE_I2C
|
||||||
#include "motion/AccelerometerThread.h"
|
#include "motion/AccelerometerThread.h"
|
||||||
AccelerometerThread *accelerometerThread = nullptr;
|
AccelerometerThread *accelerometerThread = nullptr;
|
||||||
#endif
|
#endif
|
||||||
@@ -657,7 +657,7 @@ void setup()
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(ARCH_STM32WL) && !MESHTASTIC_EXCLUDE_ACCELEROMETER
|
#if !defined(ARCH_STM32WL)
|
||||||
auto acc_info = i2cScanner->firstAccelerometer();
|
auto acc_info = i2cScanner->firstAccelerometer();
|
||||||
accelerometer_found = acc_info.type != ScanI2C::DeviceType::NONE ? acc_info.address : accelerometer_found;
|
accelerometer_found = acc_info.type != ScanI2C::DeviceType::NONE ? acc_info.address : accelerometer_found;
|
||||||
LOG_DEBUG("acc_info = %i", acc_info.type);
|
LOG_DEBUG("acc_info = %i", acc_info.type);
|
||||||
@@ -737,7 +737,7 @@ void setup()
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !MESHTASTIC_EXCLUDE_I2C
|
#if !MESHTASTIC_EXCLUDE_I2C
|
||||||
#if !defined(ARCH_STM32WL) && !MESHTASTIC_EXCLUDE_ACCELEROMETER
|
#if !defined(ARCH_STM32WL)
|
||||||
if (acc_info.type != ScanI2C::DeviceType::NONE) {
|
if (acc_info.type != ScanI2C::DeviceType::NONE) {
|
||||||
accelerometerThread = new AccelerometerThread(acc_info.type);
|
accelerometerThread = new AccelerometerThread(acc_info.type);
|
||||||
}
|
}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user