mirror of
https://github.com/meshtastic/firmware.git
synced 2025-12-18 16:52:27 +00:00
Compare commits
4 Commits
static-buf
...
zps-module
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a7435b85a1 | ||
|
|
729d6c576f | ||
|
|
15b84fca01 | ||
|
|
285b30dff0 |
2
.github/actions/setup-base/action.yml
vendored
2
.github/actions/setup-base/action.yml
vendored
@@ -23,7 +23,7 @@ runs:
|
|||||||
sudo apt-get install -y cppcheck libbluetooth-dev libgpiod-dev libyaml-cpp-dev lsb-release
|
sudo apt-get install -y cppcheck libbluetooth-dev libgpiod-dev libyaml-cpp-dev lsb-release
|
||||||
|
|
||||||
- name: Setup Python
|
- name: Setup Python
|
||||||
uses: actions/setup-python@v6
|
uses: actions/setup-python@v5
|
||||||
with:
|
with:
|
||||||
python-version: 3.x
|
python-version: 3.x
|
||||||
cache: pip
|
cache: pip
|
||||||
|
|||||||
8
.github/workflows/main_matrix.yml
vendored
8
.github/workflows/main_matrix.yml
vendored
@@ -43,7 +43,7 @@ jobs:
|
|||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-24.04
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v5
|
- uses: actions/checkout@v5
|
||||||
- uses: actions/setup-python@v6
|
- uses: actions/setup-python@v5
|
||||||
with:
|
with:
|
||||||
python-version: 3.x
|
python-version: 3.x
|
||||||
cache: pip
|
cache: pip
|
||||||
@@ -370,7 +370,7 @@ jobs:
|
|||||||
uses: actions/checkout@v5
|
uses: actions/checkout@v5
|
||||||
|
|
||||||
- name: Setup Python
|
- name: Setup Python
|
||||||
uses: actions/setup-python@v6
|
uses: actions/setup-python@v5
|
||||||
with:
|
with:
|
||||||
python-version: 3.x
|
python-version: 3.x
|
||||||
|
|
||||||
@@ -439,7 +439,7 @@ jobs:
|
|||||||
uses: actions/checkout@v5
|
uses: actions/checkout@v5
|
||||||
|
|
||||||
- name: Setup Python
|
- name: Setup Python
|
||||||
uses: actions/setup-python@v6
|
uses: actions/setup-python@v5
|
||||||
with:
|
with:
|
||||||
python-version: 3.x
|
python-version: 3.x
|
||||||
|
|
||||||
@@ -494,7 +494,7 @@ jobs:
|
|||||||
uses: actions/checkout@v5
|
uses: actions/checkout@v5
|
||||||
|
|
||||||
- name: Setup Python
|
- name: Setup Python
|
||||||
uses: actions/setup-python@v6
|
uses: actions/setup-python@v5
|
||||||
with:
|
with:
|
||||||
python-version: 3.x
|
python-version: 3.x
|
||||||
|
|
||||||
|
|||||||
2
.github/workflows/package_pio_deps.yml
vendored
2
.github/workflows/package_pio_deps.yml
vendored
@@ -31,7 +31,7 @@ jobs:
|
|||||||
repository: ${{github.event.pull_request.head.repo.full_name}}
|
repository: ${{github.event.pull_request.head.repo.full_name}}
|
||||||
|
|
||||||
- name: Setup Python
|
- name: Setup Python
|
||||||
uses: actions/setup-python@v6
|
uses: actions/setup-python@v5
|
||||||
with:
|
with:
|
||||||
python-version: 3.x
|
python-version: 3.x
|
||||||
|
|
||||||
|
|||||||
2
.github/workflows/pr_enforce_labels.yml
vendored
2
.github/workflows/pr_enforce_labels.yml
vendored
@@ -13,7 +13,7 @@ jobs:
|
|||||||
runs-on: ubuntu-24.04
|
runs-on: ubuntu-24.04
|
||||||
steps:
|
steps:
|
||||||
- name: Check for PR labels
|
- name: Check for PR labels
|
||||||
uses: actions/github-script@v8
|
uses: actions/github-script@v7
|
||||||
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);
|
||||||
|
|||||||
2
.github/workflows/pr_tests.yml
vendored
2
.github/workflows/pr_tests.yml
vendored
@@ -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@v8
|
uses: actions/github-script@v7
|
||||||
with:
|
with:
|
||||||
script: |
|
script: |
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
|
|||||||
2
.github/workflows/release_channels.yml
vendored
2
.github/workflows/release_channels.yml
vendored
@@ -63,7 +63,7 @@ jobs:
|
|||||||
uses: actions/checkout@v5
|
uses: actions/checkout@v5
|
||||||
|
|
||||||
- name: Setup Python
|
- name: Setup Python
|
||||||
uses: actions/setup-python@v6
|
uses: actions/setup-python@v5
|
||||||
with:
|
with:
|
||||||
python-version: 3.x
|
python-version: 3.x
|
||||||
|
|
||||||
|
|||||||
2
.github/workflows/stale_bot.yml
vendored
2
.github/workflows/stale_bot.yml
vendored
@@ -17,7 +17,7 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Stale PR+Issues
|
- name: Stale PR+Issues
|
||||||
uses: actions/stale@v10.0.0
|
uses: actions/stale@v9.1.0
|
||||||
with:
|
with:
|
||||||
days-before-stale: 45
|
days-before-stale: 45
|
||||||
exempt-issue-labels: pinned,3.0
|
exempt-issue-labels: pinned,3.0
|
||||||
|
|||||||
2
.github/workflows/tests.yml
vendored
2
.github/workflows/tests.yml
vendored
@@ -47,7 +47,7 @@ jobs:
|
|||||||
pio upgrade
|
pio upgrade
|
||||||
|
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@v5
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 22
|
node-version: 22
|
||||||
|
|
||||||
|
|||||||
2
.github/workflows/trunk_format_pr.yml
vendored
2
.github/workflows/trunk_format_pr.yml
vendored
@@ -39,7 +39,7 @@ jobs:
|
|||||||
git push
|
git push
|
||||||
|
|
||||||
- name: Comment on PR
|
- name: Comment on PR
|
||||||
uses: actions/github-script@v8
|
uses: actions/github-script@v7
|
||||||
with:
|
with:
|
||||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
script: |
|
script: |
|
||||||
|
|||||||
@@ -8,22 +8,22 @@ plugins:
|
|||||||
uri: https://github.com/trunk-io/plugins
|
uri: https://github.com/trunk-io/plugins
|
||||||
lint:
|
lint:
|
||||||
enabled:
|
enabled:
|
||||||
- checkov@3.2.469
|
- checkov@3.2.465
|
||||||
- renovate@41.94.0
|
- renovate@41.82.10
|
||||||
- prettier@3.6.2
|
- prettier@3.6.2
|
||||||
- trufflehog@3.90.5
|
- trufflehog@3.90.5
|
||||||
- yamllint@1.37.1
|
- yamllint@1.37.1
|
||||||
- bandit@1.8.6
|
- bandit@1.8.6
|
||||||
- trivy@0.66.0
|
- trivy@0.65.0
|
||||||
- taplo@0.10.0
|
- taplo@0.10.0
|
||||||
- ruff@0.12.11
|
- ruff@0.12.10
|
||||||
- isort@6.0.1
|
- isort@6.0.1
|
||||||
- markdownlint@0.45.0
|
- markdownlint@0.45.0
|
||||||
- oxipng@9.1.5
|
- oxipng@9.1.5
|
||||||
- svgo@4.0.0
|
- svgo@4.0.0
|
||||||
- actionlint@1.7.7
|
- actionlint@1.7.7
|
||||||
- flake8@7.3.0
|
- flake8@7.3.0
|
||||||
- hadolint@2.13.1
|
- hadolint@2.12.1-beta
|
||||||
- shfmt@3.6.0
|
- shfmt@3.6.0
|
||||||
- shellcheck@0.11.0
|
- shellcheck@0.11.0
|
||||||
- black@25.1.0
|
- black@25.1.0
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
[portduino_base]
|
[portduino_base]
|
||||||
platform =
|
platform =
|
||||||
# renovate: datasource=git-refs depName=platform-native packageName=https://github.com/meshtastic/platform-native gitBranch=develop
|
# renovate: datasource=git-refs depName=platform-native packageName=https://github.com/meshtastic/platform-native gitBranch=develop
|
||||||
https://github.com/meshtastic/platform-native/archive/c490bcd019e0658404088a61b96e653c9da22c45.zip
|
https://github.com/meshtastic/platform-native/archive/37d986499ce24511952d7146db72d667c6bdaff7.zip
|
||||||
framework = arduino
|
framework = arduino
|
||||||
|
|
||||||
build_src_filter =
|
build_src_filter =
|
||||||
@@ -31,8 +31,6 @@ lib_deps =
|
|||||||
https://github.com/pine64/libch341-spi-userspace/archive/af9bc27c9c30fa90772279925b7c5913dff789b4.zip
|
https://github.com/pine64/libch341-spi-userspace/archive/af9bc27c9c30fa90772279925b7c5913dff789b4.zip
|
||||||
# renovate: datasource=custom.pio depName=adafruit/Adafruit seesaw Library packageName=adafruit/library/Adafruit seesaw Library
|
# renovate: datasource=custom.pio depName=adafruit/Adafruit seesaw Library packageName=adafruit/library/Adafruit seesaw Library
|
||||||
adafruit/Adafruit seesaw Library@1.7.9
|
adafruit/Adafruit seesaw Library@1.7.9
|
||||||
# renovate: datasource=git-refs depName=RAK12034-BMX160 packageName=https://github.com/RAKWireless/RAK12034-BMX160 gitBranch=main
|
|
||||||
https://github.com/RAKWireless/RAK12034-BMX160/archive/dcead07ffa267d3c906e9ca4a1330ab989e957e2.zip
|
|
||||||
|
|
||||||
build_flags =
|
build_flags =
|
||||||
${arduino_base.build_flags}
|
${arduino_base.build_flags}
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ lib_deps =
|
|||||||
${radiolib_base.lib_deps}
|
${radiolib_base.lib_deps}
|
||||||
|
|
||||||
# renovate: datasource=git-refs depName=caveman99-stm32-Crypto packageName=https://github.com/caveman99/Crypto gitBranch=main
|
# renovate: datasource=git-refs depName=caveman99-stm32-Crypto packageName=https://github.com/caveman99/Crypto gitBranch=main
|
||||||
https://github.com/caveman99/Crypto/archive/1aa30eb536bd52a576fde6dfa393bf7349cf102d.zip
|
https://github.com/caveman99/Crypto/archive/eae9c768054118a9399690f8af202853d1ae8516.zip
|
||||||
|
|
||||||
lib_ignore =
|
lib_ignore =
|
||||||
OneButton
|
OneButton
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ SET "DEBUG=0"
|
|||||||
SET "PYTHON="
|
SET "PYTHON="
|
||||||
SET "TFT_BUILD=0"
|
SET "TFT_BUILD=0"
|
||||||
SET "BIGDB8=0"
|
SET "BIGDB8=0"
|
||||||
SET "MUIDB8=0"
|
|
||||||
SET "BIGDB16=0"
|
SET "BIGDB16=0"
|
||||||
SET "ESPTOOL_BAUD=115200"
|
SET "ESPTOOL_BAUD=115200"
|
||||||
SET "ESPTOOL_CMD="
|
SET "ESPTOOL_CMD="
|
||||||
@@ -15,12 +14,11 @@ SET "LOGCOUNTER=0"
|
|||||||
SET "BPS_RESET=0"
|
SET "BPS_RESET=0"
|
||||||
|
|
||||||
@REM FIXME: Determine mcu from PlatformIO variant, this is unmaintainable.
|
@REM FIXME: Determine mcu from PlatformIO variant, this is unmaintainable.
|
||||||
SET "S3=s3 v3 t-deck wireless-paper wireless-tracker station-g2 unphone t-eth-elite tlora-pager mesh-tab dreamcatcher ESP32-S3-Pico seeed-sensecap-indicator heltec_capsule_sensor_v3 vision-master icarus tracksenger elecrow-adv"
|
SET "S3=s3 v3 t-deck wireless-paper wireless-tracker station-g2 unphone"
|
||||||
SET "C3=esp32c3"
|
SET "C3=esp32c3"
|
||||||
@REM FIXME: Determine flash size from PlatformIO variant, this is unmaintainable.
|
@REM FIXME: Determine flash size from PlatformIO variant, this is unmaintainable.
|
||||||
SET "BIGDB_8MB=crowpanel-esp32s3 heltec_capsule_sensor_v3 heltec-v3 heltec-vision-master-e213 heltec-vision-master-e290 heltec-vision-master-t190 heltec-wireless-paper heltec-wireless-tracker heltec-wsl-v3 icarus seeed-xiao-s3 tbeam-s3-core tracksenger"
|
SET "BIGDB_8MB=picomputer-s3 unphone seeed-sensecap-indicator crowpanel-esp32s3 heltec_capsule_sensor_v3 heltec-v3 heltec-vision-master-e213 heltec-vision-master-e290 heltec-vision-master-t190 heltec-wireless-paper heltec-wireless-tracker heltec-wsl-v3 icarus seeed-xiao-s3 tbeam-s3-core tracksenger"
|
||||||
SET "MUIDB_8MB=picomputer-s3 unphone seeed-sensecap-indicator"
|
SET "BIGDB_16MB=t-deck mesh-tab t-energy-s3 dreamcatcher ESP32-S3-Pico m5stack-cores3 station-g2 t-eth-elite t-watch-s3"
|
||||||
SET "BIGDB_16MB=t-deck mesh-tab t-energy-s3 dreamcatcher ESP32-S3-Pico m5stack-cores3 station-g2 t-eth-elite tlora-pager t-watch-s3 elecrow-adv"
|
|
||||||
|
|
||||||
GOTO getopts
|
GOTO getopts
|
||||||
:help
|
:help
|
||||||
@@ -102,6 +100,7 @@ IF NOT "!FILENAME:update=!"=="!FILENAME!" (
|
|||||||
)
|
)
|
||||||
|
|
||||||
:skip-filename
|
:skip-filename
|
||||||
|
SET "ESPTOOL_BAUD=1200"
|
||||||
|
|
||||||
CALL :LOG_MESSAGE DEBUG "Determine the correct esptool command to use..."
|
CALL :LOG_MESSAGE DEBUG "Determine the correct esptool command to use..."
|
||||||
IF NOT "__%PYTHON%__"=="____" (
|
IF NOT "__%PYTHON%__"=="____" (
|
||||||
@@ -121,10 +120,11 @@ IF NOT "__%PYTHON%__"=="____" (
|
|||||||
|
|
||||||
CALL :LOG_MESSAGE DEBUG "Checking esptool command !ESPTOOL_CMD!..."
|
CALL :LOG_MESSAGE DEBUG "Checking esptool command !ESPTOOL_CMD!..."
|
||||||
!ESPTOOL_CMD! >nul 2>&1
|
!ESPTOOL_CMD! >nul 2>&1
|
||||||
IF %ERRORLEVEL% EQU 9009 (
|
IF %ERRORLEVEL% GEQ 2 (
|
||||||
@REM 9009 = command not found on Windows
|
@REM esptool exits with code 1 if help is displayed.
|
||||||
CALL :LOG_MESSAGE ERROR "esptool not found: !ESPTOOL_CMD!"
|
CALL :LOG_MESSAGE ERROR "esptool not found: !ESPTOOL_CMD!"
|
||||||
EXIT /B 1
|
EXIT /B 1
|
||||||
|
GOTO eof
|
||||||
)
|
)
|
||||||
IF %DEBUG% EQU 1 (
|
IF %DEBUG% EQU 1 (
|
||||||
CALL :LOG_MESSAGE DEBUG "Skipping ESPTOOL_CMD steps."
|
CALL :LOG_MESSAGE DEBUG "Skipping ESPTOOL_CMD steps."
|
||||||
@@ -142,7 +142,7 @@ CALL :LOG_MESSAGE INFO "Using esptool baud: !ESPTOOL_BAUD!."
|
|||||||
|
|
||||||
IF %BPS_RESET% EQU 1 (
|
IF %BPS_RESET% EQU 1 (
|
||||||
@REM Attempt to change mode via 1200bps Reset.
|
@REM Attempt to change mode via 1200bps Reset.
|
||||||
CALL :RUN_ESPTOOL 1200 --after no_reset read_flash_status
|
CALL :RUN_ESPTOOL !ESPTOOL_BAUD! --after no_reset read_flash_status
|
||||||
GOTO eof
|
GOTO eof
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -164,15 +164,6 @@ FOR %%a IN (%BIGDB_8MB%) DO (
|
|||||||
)
|
)
|
||||||
:end_loop_bigdb_8mb
|
:end_loop_bigdb_8mb
|
||||||
|
|
||||||
FOR %%a IN (%MUIDB_8MB%) DO (
|
|
||||||
IF NOT "!FILENAME:%%a=!"=="!FILENAME!" (
|
|
||||||
@REM We are working with any of %MUIDB_8MB%.
|
|
||||||
SET "MUIDB8=1"
|
|
||||||
GOTO end_loop_muidb_8mb
|
|
||||||
)
|
|
||||||
)
|
|
||||||
:end_loop_muidb_8mb
|
|
||||||
|
|
||||||
FOR %%a IN (%BIGDB_16MB%) DO (
|
FOR %%a IN (%BIGDB_16MB%) DO (
|
||||||
IF NOT "!FILENAME:%%a=!"=="!FILENAME!" (
|
IF NOT "!FILENAME:%%a=!"=="!FILENAME!" (
|
||||||
@REM We are working with any of %BIGDB_16MB%.
|
@REM We are working with any of %BIGDB_16MB%.
|
||||||
@@ -183,7 +174,6 @@ FOR %%a IN (%BIGDB_16MB%) DO (
|
|||||||
:end_loop_bigdb_16mb
|
:end_loop_bigdb_16mb
|
||||||
|
|
||||||
IF %BIGDB8% EQU 1 CALL :LOG_MESSAGE INFO "BigDB 8mb partition selected."
|
IF %BIGDB8% EQU 1 CALL :LOG_MESSAGE INFO "BigDB 8mb partition selected."
|
||||||
IF %MUIDB8% EQU 1 CALL :LOG_MESSAGE INFO "MUIDB 8mb partition selected."
|
|
||||||
IF %BIGDB16% EQU 1 CALL :LOG_MESSAGE INFO "BigDB 16mb partition selected."
|
IF %BIGDB16% EQU 1 CALL :LOG_MESSAGE INFO "BigDB 16mb partition selected."
|
||||||
|
|
||||||
@REM Extract BASENAME from %FILENAME% for later use.
|
@REM Extract BASENAME from %FILENAME% for later use.
|
||||||
@@ -228,12 +218,6 @@ IF %BIGDB8% EQU 1 (
|
|||||||
SET "SPIFFS_OFFSET=0x670000"
|
SET "SPIFFS_OFFSET=0x670000"
|
||||||
)
|
)
|
||||||
|
|
||||||
@REM Offsets for MUIDB 8mb.
|
|
||||||
IF %MUIDB8% EQU 1 (
|
|
||||||
SET "OTA_OFFSET=0x5D0000"
|
|
||||||
SET "SPIFFS_OFFSET=0x670000"
|
|
||||||
)
|
|
||||||
|
|
||||||
@REM Offsets for BigDB 16mb.
|
@REM Offsets for BigDB 16mb.
|
||||||
IF %BIGDB16% EQU 1 (
|
IF %BIGDB16% EQU 1 (
|
||||||
SET "OTA_OFFSET=0x650000"
|
SET "OTA_OFFSET=0x650000"
|
||||||
|
|||||||
@@ -5,43 +5,38 @@ BPS_RESET=false
|
|||||||
TFT_BUILD=false
|
TFT_BUILD=false
|
||||||
MCU=""
|
MCU=""
|
||||||
|
|
||||||
# Constants
|
|
||||||
RESET_BAUD=1200
|
|
||||||
FIRMWARE_OFFSET=0x00
|
|
||||||
|
|
||||||
# Variant groups
|
# Variant groups
|
||||||
BIGDB_8MB=(
|
BIGDB_8MB=(
|
||||||
"crowpanel-esp32s3"
|
"picomputer-s3"
|
||||||
"heltec_capsule_sensor_v3"
|
"unphone"
|
||||||
"heltec-v3"
|
"seeed-sensecap-indicator"
|
||||||
"heltec-vision-master-e213"
|
"crowpanel-esp32s3"
|
||||||
"heltec-vision-master-e290"
|
"heltec_capsule_sensor_v3"
|
||||||
"heltec-vision-master-t190"
|
"heltec-v3"
|
||||||
"heltec-wireless-paper"
|
"heltec-vision-master-e213"
|
||||||
"heltec-wireless-tracker"
|
"heltec-vision-master-e290"
|
||||||
"heltec-wsl-v3"
|
"heltec-vision-master-t190"
|
||||||
"icarus"
|
"heltec-wireless-paper"
|
||||||
"seeed-xiao-s3"
|
"heltec-wireless-tracker"
|
||||||
"tbeam-s3-core"
|
"heltec-wsl-v3"
|
||||||
"tracksenger"
|
"icarus"
|
||||||
)
|
"seeed-xiao-s3"
|
||||||
MUIDB_8MB=(
|
"tbeam-s3-core"
|
||||||
"picomputer-s3"
|
"tracksenger"
|
||||||
"unphone"
|
|
||||||
"seeed-sensecap-indicator"
|
|
||||||
)
|
)
|
||||||
BIGDB_16MB=(
|
BIGDB_16MB=(
|
||||||
"t-deck"
|
"t-deck"
|
||||||
"mesh-tab"
|
"mesh-tab"
|
||||||
"t-energy-s3"
|
"t-energy-s3"
|
||||||
"dreamcatcher"
|
"dreamcatcher"
|
||||||
"ESP32-S3-Pico"
|
"ESP32-S3-Pico"
|
||||||
"m5stack-cores3"
|
"m5stack-cores3"
|
||||||
"station-g2"
|
"station-g2"
|
||||||
"t-eth-elite"
|
"t-eth-elite"
|
||||||
"tlora-pager"
|
|
||||||
"t-watch-s3"
|
"t-watch-s3"
|
||||||
"elecrow-adv"
|
"elecrow-adv-35-tft"
|
||||||
|
"elecrow-adv-24-28-tft"
|
||||||
|
"elecrow-adv1-43-50-70-tft"
|
||||||
)
|
)
|
||||||
S3_VARIANTS=(
|
S3_VARIANTS=(
|
||||||
"s3"
|
"s3"
|
||||||
@@ -52,7 +47,6 @@ S3_VARIANTS=(
|
|||||||
"station-g2"
|
"station-g2"
|
||||||
"unphone"
|
"unphone"
|
||||||
"t-eth-elite"
|
"t-eth-elite"
|
||||||
"tlora-pager"
|
|
||||||
"mesh-tab"
|
"mesh-tab"
|
||||||
"dreamcatcher"
|
"dreamcatcher"
|
||||||
"ESP32-S3-Pico"
|
"ESP32-S3-Pico"
|
||||||
@@ -112,8 +106,8 @@ while [ $# -gt 0 ]; do
|
|||||||
shift
|
shift
|
||||||
;;
|
;;
|
||||||
--1200bps-reset)
|
--1200bps-reset)
|
||||||
BPS_RESET=true
|
BPS_RESET=true
|
||||||
;;
|
;;
|
||||||
--) # Stop parsing options
|
--) # Stop parsing options
|
||||||
shift
|
shift
|
||||||
break
|
break
|
||||||
@@ -127,7 +121,7 @@ while [ $# -gt 0 ]; do
|
|||||||
done
|
done
|
||||||
|
|
||||||
if [[ $BPS_RESET == true ]]; then
|
if [[ $BPS_RESET == true ]]; then
|
||||||
$ESPTOOL_CMD --baud $RESET_BAUD --after no_reset read_flash_status
|
$ESPTOOL_CMD --baud 1200 --after no_reset read_flash_status
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -164,13 +158,6 @@ if [ -f "${FILENAME}" ] && [ -n "${FILENAME##*"update"*}" ]; then
|
|||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
for variant in "${MUIDB_8MB[@]}"; do
|
|
||||||
if [ -z "${FILENAME##*"$variant"*}" ]; then
|
|
||||||
OFFSET=0x670000
|
|
||||||
OTA_OFFSET=0x5D0000
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
# littlefs* offset for BigDB 16mb and OTA OFFSET.
|
# littlefs* offset for BigDB 16mb and OTA OFFSET.
|
||||||
for variant in "${BIGDB_16MB[@]}"; do
|
for variant in "${BIGDB_16MB[@]}"; do
|
||||||
if [ -z "${FILENAME##*"$variant"*}" ]; then
|
if [ -z "${FILENAME##*"$variant"*}" ]; then
|
||||||
@@ -214,8 +201,8 @@ if [ -f "${FILENAME}" ] && [ -n "${FILENAME##*"update"*}" ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
echo "Trying to flash ${FILENAME}, but first erasing and writing system information"
|
echo "Trying to flash ${FILENAME}, but first erasing and writing system information"
|
||||||
$ESPTOOL_CMD erase-flash
|
$ESPTOOL_CMD erase_flash
|
||||||
$ESPTOOL_CMD write-flash $FIRMWARE_OFFSET "${FILENAME}"
|
$ESPTOOL_CMD write_flash 0x00 "${FILENAME}"
|
||||||
echo "Trying to flash ${OTAFILE} at offset ${OTA_OFFSET}"
|
echo "Trying to flash ${OTAFILE} at offset ${OTA_OFFSET}"
|
||||||
$ESPTOOL_CMD write_flash $OTA_OFFSET "${OTAFILE}"
|
$ESPTOOL_CMD write_flash $OTA_OFFSET "${OTAFILE}"
|
||||||
echo "Trying to flash ${SPIFFSFILE}, at offset ${OFFSET}"
|
echo "Trying to flash ${SPIFFSFILE}, at offset ${OFFSET}"
|
||||||
|
|||||||
@@ -6,8 +6,6 @@ SET "SCRIPT_NAME=%~nx0"
|
|||||||
SET "DEBUG=0"
|
SET "DEBUG=0"
|
||||||
SET "PYTHON="
|
SET "PYTHON="
|
||||||
SET "ESPTOOL_BAUD=115200"
|
SET "ESPTOOL_BAUD=115200"
|
||||||
SET "RESET_BAUD=1200"
|
|
||||||
SET "UPDATE_OFFSET=0x10000"
|
|
||||||
SET "ESPTOOL_CMD="
|
SET "ESPTOOL_CMD="
|
||||||
SET "LOGCOUNTER=0"
|
SET "LOGCOUNTER=0"
|
||||||
SET "CHANGE_MODE=0"
|
SET "CHANGE_MODE=0"
|
||||||
@@ -87,13 +85,14 @@ IF "!FILENAME:update=!"=="!FILENAME!" (
|
|||||||
)
|
)
|
||||||
|
|
||||||
:skip-filename
|
:skip-filename
|
||||||
|
SET "ESPTOOL_BAUD=1200"
|
||||||
|
|
||||||
CALL :LOG_MESSAGE DEBUG "Determine the correct esptool command to use..."
|
CALL :LOG_MESSAGE DEBUG "Determine the correct esptool command to use..."
|
||||||
IF NOT "__%PYTHON%__"=="____" (
|
IF NOT "__%PYTHON%__"=="____" (
|
||||||
SET "ESPTOOL_CMD=""!PYTHON!"" -m esptool"
|
SET "ESPTOOL_CMD=!PYTHON! -m esptool"
|
||||||
CALL :LOG_MESSAGE DEBUG "Python interpreter supplied."
|
CALL :LOG_MESSAGE DEBUG "Python interpreter supplied."
|
||||||
) ELSE (
|
) ELSE (
|
||||||
CALL :LOG_MESSAGE DEBUG "Python interpreter NOT supplied. Looking for esptool..."
|
CALL :LOG_MESSAGE DEBUG "Python interpreter NOT supplied. Looking for esptool...
|
||||||
WHERE esptool >nul 2>&1
|
WHERE esptool >nul 2>&1
|
||||||
IF %ERRORLEVEL% EQU 0 (
|
IF %ERRORLEVEL% EQU 0 (
|
||||||
@REM WHERE exits with code 0 if esptool is found.
|
@REM WHERE exits with code 0 if esptool is found.
|
||||||
@@ -106,11 +105,11 @@ IF NOT "__%PYTHON%__"=="____" (
|
|||||||
|
|
||||||
CALL :LOG_MESSAGE DEBUG "Checking esptool command !ESPTOOL_CMD!..."
|
CALL :LOG_MESSAGE DEBUG "Checking esptool command !ESPTOOL_CMD!..."
|
||||||
!ESPTOOL_CMD! >nul 2>&1
|
!ESPTOOL_CMD! >nul 2>&1
|
||||||
CALL :LOG_MESSAGE DEBUG "esptool exit code: %ERRORLEVEL%"
|
IF %ERRORLEVEL% GEQ 2 (
|
||||||
IF %ERRORLEVEL% EQU 9009 (
|
@REM esptool exits with code 1 if help is displayed.
|
||||||
@REM 9009 = command not found on Windows
|
|
||||||
CALL :LOG_MESSAGE ERROR "esptool not found: !ESPTOOL_CMD!"
|
CALL :LOG_MESSAGE ERROR "esptool not found: !ESPTOOL_CMD!"
|
||||||
EXIT /B 1
|
EXIT /B 1
|
||||||
|
GOTO eof
|
||||||
)
|
)
|
||||||
IF %DEBUG% EQU 1 (
|
IF %DEBUG% EQU 1 (
|
||||||
CALL :LOG_MESSAGE DEBUG "Skipping ESPTOOL_CMD steps."
|
CALL :LOG_MESSAGE DEBUG "Skipping ESPTOOL_CMD steps."
|
||||||
@@ -128,13 +127,13 @@ CALL :LOG_MESSAGE INFO "Using esptool baud: !ESPTOOL_BAUD!."
|
|||||||
|
|
||||||
IF %CHANGE_MODE% EQU 1 (
|
IF %CHANGE_MODE% EQU 1 (
|
||||||
@REM Attempt to change mode via 1200bps Reset.
|
@REM Attempt to change mode via 1200bps Reset.
|
||||||
CALL :RUN_ESPTOOL !RESET_BAUD! --after no_reset read_flash_status
|
CALL :RUN_ESPTOOL !ESPTOOL_BAUD! --after no_reset read_flash_status
|
||||||
GOTO eof
|
GOTO eof
|
||||||
)
|
)
|
||||||
|
|
||||||
@REM Flashing operations.
|
@REM Flashing operations.
|
||||||
CALL :LOG_MESSAGE INFO "Trying to flash update "!FILENAME!" at OFFSET !UPDATE_OFFSET!..."
|
CALL :LOG_MESSAGE INFO "Trying to flash update "!FILENAME!" at OFFSET 0x10000..."
|
||||||
CALL :RUN_ESPTOOL !ESPTOOL_BAUD! write-flash !UPDATE_OFFSET! "!FILENAME!" || GOTO eof
|
CALL :RUN_ESPTOOL !ESPTOOL_BAUD! write_flash 0x10000 "!FILENAME!" || GOTO eof
|
||||||
|
|
||||||
CALL :LOG_MESSAGE INFO "Script complete!."
|
CALL :LOG_MESSAGE INFO "Script complete!."
|
||||||
|
|
||||||
@@ -146,9 +145,9 @@ EXIT /B %ERRORLEVEL%
|
|||||||
:RUN_ESPTOOL
|
:RUN_ESPTOOL
|
||||||
@REM Subroutine used to run ESPTOOL_CMD with arguments.
|
@REM Subroutine used to run ESPTOOL_CMD with arguments.
|
||||||
@REM Also handles %ERRORLEVEL%.
|
@REM Also handles %ERRORLEVEL%.
|
||||||
@REM CALL :RUN_ESPTOOL [Baud] [erase-flash|write-flash] [OFFSET] [Filename]
|
@REM CALL :RUN_ESPTOOL [Baud] [erase_flash|write_flash] [OFFSET] [Filename]
|
||||||
@REM.
|
@REM.
|
||||||
@REM Example:: CALL :RUN_ESPTOOL 115200 write-flash 0x10000 "firmwarefile.bin"
|
@REM Example:: CALL :RUN_ESPTOOL 115200 write_flash 0x10000 "firmwarefile.bin"
|
||||||
IF %DEBUG% EQU 1 CALL :LOG_MESSAGE DEBUG "About to run command: !ESPTOOL_CMD! --baud %~1 %~2 %~3 %~4"
|
IF %DEBUG% EQU 1 CALL :LOG_MESSAGE DEBUG "About to run command: !ESPTOOL_CMD! --baud %~1 %~2 %~3 %~4"
|
||||||
CALL :RESET_ERROR
|
CALL :RESET_ERROR
|
||||||
!ESPTOOL_CMD! --baud %~1 %~2 %~3 %~4
|
!ESPTOOL_CMD! --baud %~1 %~2 %~3 %~4
|
||||||
|
|||||||
@@ -3,11 +3,6 @@
|
|||||||
PYTHON=${PYTHON:-$(which python3 python|head -n 1)}
|
PYTHON=${PYTHON:-$(which python3 python|head -n 1)}
|
||||||
CHANGE_MODE=false
|
CHANGE_MODE=false
|
||||||
|
|
||||||
# Constants
|
|
||||||
FLASH_BAUD=115200
|
|
||||||
RESET_BAUD=1200
|
|
||||||
UPDATE_OFFSET=0x10000
|
|
||||||
|
|
||||||
# Determine the correct esptool command to use
|
# Determine the correct esptool command to use
|
||||||
if "$PYTHON" -m esptool version >/dev/null 2>&1; then
|
if "$PYTHON" -m esptool version >/dev/null 2>&1; then
|
||||||
ESPTOOL_CMD="$PYTHON -m esptool"
|
ESPTOOL_CMD="$PYTHON -m esptool"
|
||||||
@@ -69,7 +64,7 @@ done
|
|||||||
shift "$((OPTIND-1))"
|
shift "$((OPTIND-1))"
|
||||||
|
|
||||||
if [ "$CHANGE_MODE" = true ]; then
|
if [ "$CHANGE_MODE" = true ]; then
|
||||||
$ESPTOOL_CMD --baud $RESET_BAUD --after no_reset read_flash_status
|
$ESPTOOL_CMD --baud 1200 --after no_reset read_flash_status
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -80,7 +75,7 @@ fi
|
|||||||
|
|
||||||
if [ -f "${FILENAME}" ] && [ -z "${FILENAME##*"update"*}" ]; then
|
if [ -f "${FILENAME}" ] && [ -z "${FILENAME##*"update"*}" ]; then
|
||||||
echo "Trying to flash update ${FILENAME}"
|
echo "Trying to flash update ${FILENAME}"
|
||||||
$ESPTOOL_CMD --baud $FLASH_BAUD write-flash $UPDATE_OFFSET "${FILENAME}"
|
$ESPTOOL_CMD --baud 115200 write_flash 0x10000 "${FILENAME}"
|
||||||
else
|
else
|
||||||
show_help
|
show_help
|
||||||
echo "Invalid file: ${FILENAME}"
|
echo "Invalid file: ${FILENAME}"
|
||||||
|
|||||||
@@ -87,15 +87,6 @@
|
|||||||
</screenshots>
|
</screenshots>
|
||||||
|
|
||||||
<releases>
|
<releases>
|
||||||
<release version="2.7.9" date="2025-09-03">
|
|
||||||
<url type="details">https://github.com/meshtastic/firmware/releases?q=tag%3Av2.7.9</url>
|
|
||||||
</release>
|
|
||||||
<release version="2.7.8" date="2025-08-30">
|
|
||||||
<url type="details">https://github.com/meshtastic/firmware/releases?q=tag%3Av2.7.8</url>
|
|
||||||
</release>
|
|
||||||
<release version="2.7.7" date="2025-08-28">
|
|
||||||
<url type="details">https://github.com/meshtastic/firmware/releases?q=tag%3Av2.7.7</url>
|
|
||||||
</release>
|
|
||||||
<release version="2.7.6" date="2025-08-12">
|
<release version="2.7.6" date="2025-08-12">
|
||||||
<url type="details">https://github.com/meshtastic/firmware/releases?q=tag%3Av2.7.6</url>
|
<url type="details">https://github.com/meshtastic/firmware/releases?q=tag%3Av2.7.6</url>
|
||||||
</release>
|
</release>
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
"build": {
|
"build": {
|
||||||
"arduino": {
|
"arduino": {
|
||||||
"ldscript": "esp32s3_out.ld",
|
"ldscript": "esp32s3_out.ld",
|
||||||
"partitions": "partition-table-8MB.csv",
|
"partitions": "default_8MB.csv",
|
||||||
"memory_type": "qio_opi"
|
"memory_type": "qio_opi"
|
||||||
},
|
},
|
||||||
"core": "esp32",
|
"core": "esp32",
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
"arduino": {
|
"arduino": {
|
||||||
"ldscript": "esp32s3_out.ld",
|
"ldscript": "esp32s3_out.ld",
|
||||||
"memory_type": "qio_opi",
|
"memory_type": "qio_opi",
|
||||||
"partitions": "partition-table-8MB.csv"
|
"partitions": "default_8MB.csv"
|
||||||
},
|
},
|
||||||
"core": "esp32",
|
"core": "esp32",
|
||||||
"extra_flags": [
|
"extra_flags": [
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
},
|
},
|
||||||
"core": "stm32",
|
"core": "stm32",
|
||||||
"cpu": "cortex-m4",
|
"cpu": "cortex-m4",
|
||||||
"extra_flags": "-DSTM32WLxx -DSTM32WLE5xx -DARDUINO_RAK3172_MODULE",
|
"extra_flags": "-DSTM32WLxx -DSTM32WLE5xx -DARDUINO_GENERIC_WLE5CCUX",
|
||||||
"f_cpu": "48000000L",
|
"f_cpu": "48000000L",
|
||||||
"mcu": "stm32wle5ccu",
|
"mcu": "stm32wle5ccu",
|
||||||
"variant": "STM32WLxx/WL54CCU_WL55CCU_WLE4C(8-B-C)U_WLE5C(8-B-C)U",
|
"variant": "STM32WLxx/WL54CCU_WL55CCU_WLE4C(8-B-C)U_WLE5C(8-B-C)U",
|
||||||
|
|||||||
11
debian/changelog
vendored
11
debian/changelog
vendored
@@ -1,4 +1,4 @@
|
|||||||
meshtasticd (2.7.9.0) UNRELEASED; urgency=medium
|
meshtasticd (2.7.6.0) UNRELEASED; urgency=medium
|
||||||
|
|
||||||
[ Austin Lane ]
|
[ Austin Lane ]
|
||||||
* Initial packaging
|
* Initial packaging
|
||||||
@@ -39,12 +39,5 @@ meshtasticd (2.7.9.0) UNRELEASED; urgency=medium
|
|||||||
|
|
||||||
[ ]
|
[ ]
|
||||||
* GitHub Actions Automatic version bump
|
* GitHub Actions Automatic version bump
|
||||||
* GitHub Actions Automatic version bump
|
|
||||||
|
|
||||||
[ ]
|
-- <github-actions[bot]@users.noreply.github.com> Tue, 12 Aug 2025 23:48:48 +0000
|
||||||
* GitHub Actions Automatic version bump
|
|
||||||
|
|
||||||
[ ]
|
|
||||||
* GitHub Actions Automatic version bump
|
|
||||||
|
|
||||||
-- <github-actions[bot]@users.noreply.github.com> Wed, 03 Sep 2025 23:39:17 +0000
|
|
||||||
|
|||||||
@@ -1,7 +0,0 @@
|
|||||||
# This is a layout for 8MB of flash for MUI devices
|
|
||||||
# Name, Type, SubType, Offset, Size, Flags
|
|
||||||
nvs, data, nvs, 0x9000, 0x5000,
|
|
||||||
otadata, data, ota, 0xe000, 0x2000,
|
|
||||||
app0, app, ota_0, 0x10000, 0x5C0000,
|
|
||||||
flashApp, app, ota_1, 0x5D0000,0x0A0000,
|
|
||||||
spiffs, data, spiffs, 0x670000,0x180000
|
|
||||||
|
@@ -48,6 +48,7 @@ build_flags = -Wno-missing-field-initializers
|
|||||||
-DRADIOLIB_EXCLUDE_APRS=1
|
-DRADIOLIB_EXCLUDE_APRS=1
|
||||||
-DRADIOLIB_EXCLUDE_LORAWAN=1
|
-DRADIOLIB_EXCLUDE_LORAWAN=1
|
||||||
-DMESHTASTIC_EXCLUDE_DROPZONE=1
|
-DMESHTASTIC_EXCLUDE_DROPZONE=1
|
||||||
|
-DMESHTASTIC_EXCLUDE_ZPS=1
|
||||||
-DMESHTASTIC_EXCLUDE_REMOTEHARDWARE=1
|
-DMESHTASTIC_EXCLUDE_REMOTEHARDWARE=1
|
||||||
-DMESHTASTIC_EXCLUDE_HEALTH_TELEMETRY=1
|
-DMESHTASTIC_EXCLUDE_HEALTH_TELEMETRY=1
|
||||||
-DMESHTASTIC_EXCLUDE_POWERSTRESS=1 ; exclude power stress test module from main firmware
|
-DMESHTASTIC_EXCLUDE_POWERSTRESS=1 ; exclude power stress test module from main firmware
|
||||||
@@ -118,7 +119,7 @@ lib_deps =
|
|||||||
[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/3677476c8a823ee85056b5fb1d146a3e193f8276.zip
|
https://github.com/meshtastic/device-ui/archive/a3e0e1be372d069f47b4c19d718f5267251744d7.zip
|
||||||
|
|
||||||
; Common libs for environmental measurements in telemetry module
|
; Common libs for environmental measurements in telemetry module
|
||||||
[environmental_base]
|
[environmental_base]
|
||||||
@@ -157,8 +158,8 @@ lib_deps =
|
|||||||
emotibit/EmotiBit MLX90632@1.0.8
|
emotibit/EmotiBit MLX90632@1.0.8
|
||||||
# renovate: datasource=custom.pio depName=Adafruit MLX90614 packageName=adafruit/library/Adafruit MLX90614 Library
|
# renovate: datasource=custom.pio depName=Adafruit MLX90614 packageName=adafruit/library/Adafruit MLX90614 Library
|
||||||
adafruit/Adafruit MLX90614 Library@2.1.5
|
adafruit/Adafruit MLX90614 Library@2.1.5
|
||||||
# renovate: datasource=github-tags depName=INA3221 packageName=sgtwilko/INA3221
|
# renovate: datasource=github-tags depName=INA3221 packageName=KodinLanewave/INA3221
|
||||||
https://github.com/sgtwilko/INA3221#bb03d7e9bfcc74fc798838a54f4f99738f29fc6a
|
https://github.com/KodinLanewave/INA3221/archive/1.0.1.zip
|
||||||
# renovate: datasource=custom.pio depName=QMC5883L Compass packageName=mprograms/library/QMC5883LCompass
|
# renovate: datasource=custom.pio depName=QMC5883L Compass packageName=mprograms/library/QMC5883LCompass
|
||||||
mprograms/QMC5883LCompass@1.2.3
|
mprograms/QMC5883LCompass@1.2.3
|
||||||
# renovate: datasource=custom.pio depName=DFRobot_RTU packageName=dfrobot/library/DFRobot_RTU
|
# renovate: datasource=custom.pio depName=DFRobot_RTU packageName=dfrobot/library/DFRobot_RTU
|
||||||
@@ -177,8 +178,6 @@ lib_deps =
|
|||||||
adafruit/Adafruit PCT2075@1.0.5
|
adafruit/Adafruit PCT2075@1.0.5
|
||||||
# renovate: datasource=custom.pio depName=DFRobot_BMM150 packageName=dfrobot/library/DFRobot_BMM150
|
# renovate: datasource=custom.pio depName=DFRobot_BMM150 packageName=dfrobot/library/DFRobot_BMM150
|
||||||
dfrobot/DFRobot_BMM150@1.0.0
|
dfrobot/DFRobot_BMM150@1.0.0
|
||||||
# renovate: datasource=custom.pio depName=Adafruit_TSL2561 packageName=adafruit/library/Adafruit TSL2561
|
|
||||||
adafruit/Adafruit TSL2561@1.1.2
|
|
||||||
|
|
||||||
; (not included in native / portduino)
|
; (not included in native / portduino)
|
||||||
[environmental_extra]
|
[environmental_extra]
|
||||||
|
|||||||
Submodule protobufs updated: a84657c220...8985852d75
@@ -1,14 +1,7 @@
|
|||||||
#include "DisplayFormatters.h"
|
#include "DisplayFormatters.h"
|
||||||
|
|
||||||
const char *DisplayFormatters::getModemPresetDisplayName(meshtastic_Config_LoRaConfig_ModemPreset preset, bool useShortName,
|
const char *DisplayFormatters::getModemPresetDisplayName(meshtastic_Config_LoRaConfig_ModemPreset preset, bool useShortName)
|
||||||
bool usePreset)
|
|
||||||
{
|
{
|
||||||
|
|
||||||
// If use_preset is false, always return "Custom"
|
|
||||||
if (!usePreset) {
|
|
||||||
return "Custom";
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (preset) {
|
switch (preset) {
|
||||||
case meshtastic_Config_LoRaConfig_ModemPreset_SHORT_TURBO:
|
case meshtastic_Config_LoRaConfig_ModemPreset_SHORT_TURBO:
|
||||||
return useShortName ? "ShortT" : "ShortTurbo";
|
return useShortName ? "ShortT" : "ShortTurbo";
|
||||||
|
|||||||
@@ -4,6 +4,5 @@
|
|||||||
class DisplayFormatters
|
class DisplayFormatters
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static const char *getModemPresetDisplayName(meshtastic_Config_LoRaConfig_ModemPreset preset, bool useShortName,
|
static const char *getModemPresetDisplayName(meshtastic_Config_LoRaConfig_ModemPreset preset, bool useShortName);
|
||||||
bool usePreset);
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -128,7 +128,6 @@ RAK9154Sensor rak9154Sensor;
|
|||||||
#ifdef HAS_PPM
|
#ifdef HAS_PPM
|
||||||
// note: XPOWERS_CHIP_XXX must be defined in variant.h
|
// note: XPOWERS_CHIP_XXX must be defined in variant.h
|
||||||
#include <XPowersLib.h>
|
#include <XPowersLib.h>
|
||||||
XPowersPPM *PPM = NULL;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAS_BQ27220
|
#ifdef HAS_BQ27220
|
||||||
@@ -682,7 +681,7 @@ bool Power::setup()
|
|||||||
found = true;
|
found = true;
|
||||||
} else if (lipoChargerInit()) {
|
} else if (lipoChargerInit()) {
|
||||||
found = true;
|
found = true;
|
||||||
} else if (meshSolarInit()) {
|
} else if (meshSolarInit()) {
|
||||||
found = true;
|
found = true;
|
||||||
} else if (analogInit()) {
|
} else if (analogInit()) {
|
||||||
found = true;
|
found = true;
|
||||||
@@ -746,11 +745,7 @@ void Power::shutdown()
|
|||||||
|
|
||||||
#if HAS_SCREEN
|
#if HAS_SCREEN
|
||||||
if (screen) {
|
if (screen) {
|
||||||
#ifdef T_DECK_PRO
|
|
||||||
screen->showSimpleBanner("Device is powered off.\nConnect USB to start!", 0); // T-Deck Pro has no power button
|
|
||||||
#else
|
|
||||||
screen->showSimpleBanner("Shutting Down...", 0); // stays on screen
|
screen->showSimpleBanner("Shutting Down...", 0); // stays on screen
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#if !defined(ARCH_STM32WL)
|
#if !defined(ARCH_STM32WL)
|
||||||
@@ -768,7 +763,7 @@ void Power::shutdown()
|
|||||||
#ifdef PIN_LED3
|
#ifdef PIN_LED3
|
||||||
ledOff(PIN_LED3);
|
ledOff(PIN_LED3);
|
||||||
#endif
|
#endif
|
||||||
doDeepSleep(DELAY_FOREVER, true, true);
|
doDeepSleep(DELAY_FOREVER, false, true);
|
||||||
#elif defined(ARCH_PORTDUINO)
|
#elif defined(ARCH_PORTDUINO)
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
#else
|
#else
|
||||||
@@ -833,25 +828,16 @@ void Power::readPowerStatus()
|
|||||||
newStatus.notifyObservers(&powerStatus2);
|
newStatus.notifyObservers(&powerStatus2);
|
||||||
#ifdef DEBUG_HEAP
|
#ifdef DEBUG_HEAP
|
||||||
if (lastheap != memGet.getFreeHeap()) {
|
if (lastheap != memGet.getFreeHeap()) {
|
||||||
// Use stack-allocated buffer to avoid heap allocations in monitoring code
|
std::string threadlist = "Threads running:";
|
||||||
char threadlist[256] = "Threads running:";
|
|
||||||
int threadlistLen = strlen(threadlist);
|
|
||||||
int running = 0;
|
int running = 0;
|
||||||
for (int i = 0; i < MAX_THREADS; i++) {
|
for (int i = 0; i < MAX_THREADS; i++) {
|
||||||
auto thread = concurrency::mainController.get(i);
|
auto thread = concurrency::mainController.get(i);
|
||||||
if ((thread != nullptr) && (thread->enabled)) {
|
if ((thread != nullptr) && (thread->enabled)) {
|
||||||
// Use snprintf to safely append to stack buffer without heap allocation
|
threadlist += vformat(" %s", thread->ThreadName.c_str());
|
||||||
int remaining = sizeof(threadlist) - threadlistLen - 1;
|
|
||||||
if (remaining > 0) {
|
|
||||||
int written = snprintf(threadlist + threadlistLen, remaining, " %s", thread->ThreadName.c_str());
|
|
||||||
if (written > 0 && written < remaining) {
|
|
||||||
threadlistLen += written;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
running++;
|
running++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
LOG_DEBUG(threadlist);
|
LOG_DEBUG(threadlist.c_str());
|
||||||
LOG_DEBUG("Heap status: %d/%d bytes free (%d), running %d/%d threads", memGet.getFreeHeap(), memGet.getHeapSize(),
|
LOG_DEBUG("Heap status: %d/%d bytes free (%d), running %d/%d threads", memGet.getFreeHeap(), memGet.getHeapSize(),
|
||||||
memGet.getFreeHeap() - lastheap, running, concurrency::mainController.size(false));
|
memGet.getFreeHeap() - lastheap, running, concurrency::mainController.size(false));
|
||||||
lastheap = memGet.getFreeHeap();
|
lastheap = memGet.getFreeHeap();
|
||||||
@@ -865,19 +851,15 @@ void Power::readPowerStatus()
|
|||||||
sprintf(mac, "!%02x%02x%02x%02x", dmac[2], dmac[3], dmac[4], dmac[5]);
|
sprintf(mac, "!%02x%02x%02x%02x", dmac[2], dmac[3], dmac[4], dmac[5]);
|
||||||
|
|
||||||
auto newHeap = memGet.getFreeHeap();
|
auto newHeap = memGet.getFreeHeap();
|
||||||
// Use stack-allocated buffers to avoid heap allocations in monitoring code
|
std::string heapTopic =
|
||||||
char heapTopic[128];
|
(*moduleConfig.mqtt.root ? moduleConfig.mqtt.root : "msh") + std::string("/2/heap/") + std::string(mac);
|
||||||
snprintf(heapTopic, sizeof(heapTopic), "%s/2/heap/%s", (*moduleConfig.mqtt.root ? moduleConfig.mqtt.root : "msh"), mac);
|
std::string heapString = std::to_string(newHeap);
|
||||||
char heapString[16];
|
mqtt->pubSub.publish(heapTopic.c_str(), heapString.c_str(), false);
|
||||||
snprintf(heapString, sizeof(heapString), "%u", newHeap);
|
|
||||||
mqtt->pubSub.publish(heapTopic, heapString, false);
|
|
||||||
|
|
||||||
auto wifiRSSI = WiFi.RSSI();
|
auto wifiRSSI = WiFi.RSSI();
|
||||||
char wifiTopic[128];
|
std::string wifiTopic =
|
||||||
snprintf(wifiTopic, sizeof(wifiTopic), "%s/2/wifi/%s", (*moduleConfig.mqtt.root ? moduleConfig.mqtt.root : "msh"), mac);
|
(*moduleConfig.mqtt.root ? moduleConfig.mqtt.root : "msh") + std::string("/2/wifi/") + std::string(mac);
|
||||||
char wifiString[16];
|
std::string wifiString = std::to_string(wifiRSSI);
|
||||||
snprintf(wifiString, sizeof(wifiString), "%d", wifiRSSI);
|
mqtt->pubSub.publish(wifiTopic.c_str(), wifiString.c_str(), false);
|
||||||
mqtt->pubSub.publish(wifiTopic, wifiString, false);
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -1338,6 +1320,7 @@ bool Power::lipoInit()
|
|||||||
class LipoCharger : public HasBatteryLevel
|
class LipoCharger : public HasBatteryLevel
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
XPowersPPM *ppm = nullptr;
|
||||||
BQ27220 *bq = nullptr;
|
BQ27220 *bq = nullptr;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@@ -1346,41 +1329,41 @@ class LipoCharger : public HasBatteryLevel
|
|||||||
*/
|
*/
|
||||||
bool runOnce()
|
bool runOnce()
|
||||||
{
|
{
|
||||||
if (PPM == nullptr) {
|
if (ppm == nullptr) {
|
||||||
PPM = new XPowersPPM;
|
ppm = new XPowersPPM;
|
||||||
bool result = PPM->init(Wire, I2C_SDA, I2C_SCL, BQ25896_ADDR);
|
bool result = ppm->init(Wire, I2C_SDA, I2C_SCL, BQ25896_ADDR);
|
||||||
if (result) {
|
if (result) {
|
||||||
LOG_INFO("PPM BQ25896 init succeeded");
|
LOG_INFO("PPM BQ25896 init succeeded");
|
||||||
// Set the minimum operating voltage. Below this voltage, the PPM will protect
|
// Set the minimum operating voltage. Below this voltage, the PPM will protect
|
||||||
// PPM->setSysPowerDownVoltage(3100);
|
// ppm->setSysPowerDownVoltage(3100);
|
||||||
|
|
||||||
// Set input current limit, default is 500mA
|
// Set input current limit, default is 500mA
|
||||||
// PPM->setInputCurrentLimit(800);
|
// ppm->setInputCurrentLimit(800);
|
||||||
|
|
||||||
// Disable current limit pin
|
// Disable current limit pin
|
||||||
// PPM->disableCurrentLimitPin();
|
// ppm->disableCurrentLimitPin();
|
||||||
|
|
||||||
// Set the charging target voltage, Range:3840 ~ 4608mV ,step:16 mV
|
// Set the charging target voltage, Range:3840 ~ 4608mV ,step:16 mV
|
||||||
PPM->setChargeTargetVoltage(4288);
|
ppm->setChargeTargetVoltage(4288);
|
||||||
|
|
||||||
// Set the precharge current , Range: 64mA ~ 1024mA ,step:64mA
|
// Set the precharge current , Range: 64mA ~ 1024mA ,step:64mA
|
||||||
// PPM->setPrechargeCurr(64);
|
// ppm->setPrechargeCurr(64);
|
||||||
|
|
||||||
// The premise is that limit pin is disabled, or it will
|
// The premise is that limit pin is disabled, or it will
|
||||||
// only follow the maximum charging current set by limit pin.
|
// only follow the maximum charging current set by limit pin.
|
||||||
// Set the charging current , Range:0~5056mA ,step:64mA
|
// Set the charging current , Range:0~5056mA ,step:64mA
|
||||||
PPM->setChargerConstantCurr(1024);
|
ppm->setChargerConstantCurr(1024);
|
||||||
|
|
||||||
// To obtain voltage data, the ADC must be enabled first
|
// To obtain voltage data, the ADC must be enabled first
|
||||||
PPM->enableMeasure();
|
ppm->enableMeasure();
|
||||||
|
|
||||||
// Turn on charging function
|
// Turn on charging function
|
||||||
// If there is no battery connected, do not turn on the charging function
|
// If there is no battery connected, do not turn on the charging function
|
||||||
PPM->enableCharge();
|
ppm->enableCharge();
|
||||||
} else {
|
} else {
|
||||||
LOG_WARN("PPM BQ25896 init failed");
|
LOG_WARN("PPM BQ25896 init failed");
|
||||||
delete PPM;
|
delete ppm;
|
||||||
PPM = nullptr;
|
ppm = nullptr;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1421,23 +1404,23 @@ class LipoCharger : public HasBatteryLevel
|
|||||||
/**
|
/**
|
||||||
* return true if there is a battery installed in this unit
|
* return true if there is a battery installed in this unit
|
||||||
*/
|
*/
|
||||||
virtual bool isBatteryConnect() override { return PPM->getBattVoltage() > 0; }
|
virtual bool isBatteryConnect() override { return ppm->getBattVoltage() > 0; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* return true if there is an external power source detected
|
* return true if there is an external power source detected
|
||||||
*/
|
*/
|
||||||
virtual bool isVbusIn() override { return PPM->getVbusVoltage() > 0; }
|
virtual bool isVbusIn() override { return ppm->getVbusVoltage() > 0; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* return true if the battery is currently charging
|
* return true if the battery is currently charging
|
||||||
*/
|
*/
|
||||||
virtual bool isCharging() override
|
virtual bool isCharging() override
|
||||||
{
|
{
|
||||||
bool isCharging = PPM->isCharging();
|
bool isCharging = ppm->isCharging();
|
||||||
if (isCharging) {
|
if (isCharging) {
|
||||||
LOG_DEBUG("BQ27220 time to full charge: %d min", bq->getTimeToFull());
|
LOG_DEBUG("BQ27220 time to full charge: %d min", bq->getTimeToFull());
|
||||||
} else {
|
} else {
|
||||||
if (!PPM->isVbusIn()) {
|
if (!ppm->isVbusIn()) {
|
||||||
LOG_DEBUG("BQ27220 time to empty: %d min (%d mAh)", bq->getTimeToEmpty(), bq->getRemainingCapacity());
|
LOG_DEBUG("BQ27220 time to empty: %d min (%d mAh)", bq->getTimeToEmpty(), bq->getRemainingCapacity());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1470,6 +1453,8 @@ bool Power::lipoChargerInit()
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef HELTEC_MESH_SOLAR
|
#ifdef HELTEC_MESH_SOLAR
|
||||||
#include "meshSolarApp.h"
|
#include "meshSolarApp.h"
|
||||||
|
|
||||||
@@ -1507,7 +1492,7 @@ class meshSolarBatteryLevel : public HasBatteryLevel
|
|||||||
/**
|
/**
|
||||||
* return true if there is an external power source detected
|
* return true if there is an external power source detected
|
||||||
*/
|
*/
|
||||||
virtual bool isVbusIn() override { return meshSolarIsVbusIn(); }
|
virtual bool isVbusIn() override { return meshSolarIsVbusIn();}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* return true if the battery is currently charging
|
* return true if the battery is currently charging
|
||||||
|
|||||||
@@ -26,10 +26,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
|
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
|
|
||||||
#if __has_include("Melopero_RV3028.h")
|
#ifdef RV3028_RTC
|
||||||
#include "Melopero_RV3028.h"
|
#include "Melopero_RV3028.h"
|
||||||
#endif
|
#endif
|
||||||
#if __has_include("pcf8563.h")
|
#ifdef PCF8563_RTC
|
||||||
#include "pcf8563.h"
|
#include "pcf8563.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -80,7 +80,6 @@ class ScanI2C
|
|||||||
LTR553ALS,
|
LTR553ALS,
|
||||||
BHI260AP,
|
BHI260AP,
|
||||||
BMM150,
|
BMM150,
|
||||||
TSL2561,
|
|
||||||
DRV2605
|
DRV2605
|
||||||
} DeviceType;
|
} DeviceType;
|
||||||
|
|
||||||
|
|||||||
@@ -461,17 +461,7 @@ void ScanI2CTwoWire::scanPort(I2CPort port, uint8_t *address, uint8_t asize)
|
|||||||
SCAN_SIMPLE_CASE(LSM6DS3_ADDR, LSM6DS3, "LSM6DS3", (uint8_t)addr.address);
|
SCAN_SIMPLE_CASE(LSM6DS3_ADDR, LSM6DS3, "LSM6DS3", (uint8_t)addr.address);
|
||||||
SCAN_SIMPLE_CASE(TCA9555_ADDR, TCA9555, "TCA9555", (uint8_t)addr.address);
|
SCAN_SIMPLE_CASE(TCA9555_ADDR, TCA9555, "TCA9555", (uint8_t)addr.address);
|
||||||
SCAN_SIMPLE_CASE(VEML7700_ADDR, VEML7700, "VEML7700", (uint8_t)addr.address);
|
SCAN_SIMPLE_CASE(VEML7700_ADDR, VEML7700, "VEML7700", (uint8_t)addr.address);
|
||||||
case TSL25911_ADDR:
|
SCAN_SIMPLE_CASE(TSL25911_ADDR, TSL2591, "TSL2591", (uint8_t)addr.address);
|
||||||
registerValue = getRegisterValue(ScanI2CTwoWire::RegisterLocation(addr, 0x12), 1);
|
|
||||||
if (registerValue == 0x50) {
|
|
||||||
type = TSL2591;
|
|
||||||
logFoundDevice("TSL25911", (uint8_t)addr.address);
|
|
||||||
} else {
|
|
||||||
type = TSL2561;
|
|
||||||
logFoundDevice("TSL2561", (uint8_t)addr.address);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
SCAN_SIMPLE_CASE(MLX90632_ADDR, MLX90632, "MLX90632", (uint8_t)addr.address);
|
SCAN_SIMPLE_CASE(MLX90632_ADDR, MLX90632, "MLX90632", (uint8_t)addr.address);
|
||||||
SCAN_SIMPLE_CASE(NAU7802_ADDR, NAU7802, "NAU7802", (uint8_t)addr.address);
|
SCAN_SIMPLE_CASE(NAU7802_ADDR, NAU7802, "NAU7802", (uint8_t)addr.address);
|
||||||
SCAN_SIMPLE_CASE(MAX1704X_ADDR, MAX17048, "MAX17048", (uint8_t)addr.address);
|
SCAN_SIMPLE_CASE(MAX1704X_ADDR, MAX17048, "MAX17048", (uint8_t)addr.address);
|
||||||
|
|||||||
116
src/gps/GPS.cpp
116
src/gps/GPS.cpp
@@ -1,4 +1,5 @@
|
|||||||
#include <cstring> // Include for strstr
|
#include <cstring> // Include for strstr
|
||||||
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "configuration.h"
|
#include "configuration.h"
|
||||||
@@ -842,6 +843,9 @@ void GPS::setPowerState(GPSPowerState newState, uint32_t sleepTime)
|
|||||||
setPowerPMU(true); // Power (PMU): on
|
setPowerPMU(true); // Power (PMU): on
|
||||||
writePinStandby(false); // Standby (pin): awake (not standby)
|
writePinStandby(false); // Standby (pin): awake (not standby)
|
||||||
setPowerUBLOX(true); // Standby (UBLOX): awake
|
setPowerUBLOX(true); // Standby (UBLOX): awake
|
||||||
|
#ifdef GNSS_AIROHA
|
||||||
|
lastFixStartMsec = 0;
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GPS_SOFTSLEEP:
|
case GPS_SOFTSLEEP:
|
||||||
@@ -859,7 +863,9 @@ void GPS::setPowerState(GPSPowerState newState, uint32_t sleepTime)
|
|||||||
writePinStandby(true); // Standby (pin): asleep (not awake)
|
writePinStandby(true); // Standby (pin): asleep (not awake)
|
||||||
setPowerUBLOX(false, sleepTime); // Standby (UBLOX): asleep, timed
|
setPowerUBLOX(false, sleepTime); // Standby (UBLOX): asleep, timed
|
||||||
#ifdef GNSS_AIROHA
|
#ifdef GNSS_AIROHA
|
||||||
digitalWrite(PIN_GPS_EN, LOW);
|
if (config.position.gps_update_interval * 1000 >= GPS_FIX_HOLD_TIME * 2) {
|
||||||
|
digitalWrite(PIN_GPS_EN, LOW);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -871,7 +877,9 @@ void GPS::setPowerState(GPSPowerState newState, uint32_t sleepTime)
|
|||||||
writePinStandby(true); // Standby (pin): asleep
|
writePinStandby(true); // Standby (pin): asleep
|
||||||
setPowerUBLOX(false, 0); // Standby (UBLOX): asleep, indefinitely
|
setPowerUBLOX(false, 0); // Standby (UBLOX): asleep, indefinitely
|
||||||
#ifdef GNSS_AIROHA
|
#ifdef GNSS_AIROHA
|
||||||
digitalWrite(PIN_GPS_EN, LOW);
|
if (config.position.gps_update_interval * 1000 >= GPS_FIX_HOLD_TIME * 2) {
|
||||||
|
digitalWrite(PIN_GPS_EN, LOW);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1054,8 +1062,6 @@ void GPS::down()
|
|||||||
}
|
}
|
||||||
// If update interval long enough (or softsleep unsupported): hardsleep instead
|
// If update interval long enough (or softsleep unsupported): hardsleep instead
|
||||||
setPowerState(GPS_HARDSLEEP, sleepTime);
|
setPowerState(GPS_HARDSLEEP, sleepTime);
|
||||||
// Reset the fix quality to 0, since we're off.
|
|
||||||
fixQual = 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1115,19 +1121,11 @@ int32_t GPS::runOnce()
|
|||||||
shouldPublish = true;
|
shouldPublish = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t prev_fixQual = fixQual;
|
|
||||||
bool gotLoc = lookForLocation();
|
bool gotLoc = lookForLocation();
|
||||||
if (gotLoc && !hasValidLocation) { // declare that we have location ASAP
|
if (gotLoc && !hasValidLocation) { // declare that we have location ASAP
|
||||||
LOG_DEBUG("hasValidLocation RISING EDGE");
|
LOG_DEBUG("hasValidLocation RISING EDGE");
|
||||||
hasValidLocation = true;
|
hasValidLocation = true;
|
||||||
shouldPublish = true;
|
shouldPublish = true;
|
||||||
// Hold for 20secs after getting a lock to download ephemeris etc
|
|
||||||
fixHoldEnds = millis() + 20000;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (gotLoc && prev_fixQual == 0) { // just got a lock after turning back on.
|
|
||||||
fixHoldEnds = millis() + 20000;
|
|
||||||
shouldPublish = true; // Publish immediately, since next publish is at end of hold
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool tooLong = scheduling.searchedTooLong();
|
bool tooLong = scheduling.searchedTooLong();
|
||||||
@@ -1136,7 +1134,8 @@ int32_t GPS::runOnce()
|
|||||||
|
|
||||||
// Once we get a location we no longer desperately want an update
|
// Once we get a location we no longer desperately want an update
|
||||||
if ((gotLoc && gotTime) || tooLong) {
|
if ((gotLoc && gotTime) || tooLong) {
|
||||||
if (tooLong && !gotLoc) {
|
|
||||||
|
if (tooLong) {
|
||||||
// we didn't get a location during this ack window, therefore declare loss of lock
|
// we didn't get a location during this ack window, therefore declare loss of lock
|
||||||
if (hasValidLocation) {
|
if (hasValidLocation) {
|
||||||
LOG_DEBUG("hasValidLocation FALLING EDGE");
|
LOG_DEBUG("hasValidLocation FALLING EDGE");
|
||||||
@@ -1144,15 +1143,9 @@ int32_t GPS::runOnce()
|
|||||||
p = meshtastic_Position_init_default;
|
p = meshtastic_Position_init_default;
|
||||||
hasValidLocation = false;
|
hasValidLocation = false;
|
||||||
}
|
}
|
||||||
if (millis() > fixHoldEnds) {
|
|
||||||
shouldPublish = true; // publish our update at the end of the lock hold
|
down();
|
||||||
publishUpdate();
|
shouldPublish = true; // publish our update for this just finished acquisition window
|
||||||
down();
|
|
||||||
#ifdef GPS_DEBUG
|
|
||||||
} else {
|
|
||||||
LOG_DEBUG("Holding for GPS data download: %d ms (numSats=%d)", fixHoldEnds - millis(), p.sats_in_view);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// If state has changed do a publish
|
// If state has changed do a publish
|
||||||
@@ -1369,42 +1362,34 @@ GnssModel_t GPS::probe(int serialSpeed)
|
|||||||
|
|
||||||
GnssModel_t GPS::getProbeResponse(unsigned long timeout, const std::vector<ChipInfo> &responseMap)
|
GnssModel_t GPS::getProbeResponse(unsigned long timeout, const std::vector<ChipInfo> &responseMap)
|
||||||
{
|
{
|
||||||
char response[256] = {0}; // Fixed buffer instead of String
|
String response = "";
|
||||||
uint16_t responseLen = 0;
|
|
||||||
unsigned long start = millis();
|
unsigned long start = millis();
|
||||||
while (millis() - start < timeout) {
|
while (millis() - start < timeout) {
|
||||||
if (_serial_gps->available()) {
|
if (_serial_gps->available()) {
|
||||||
char c = _serial_gps->read();
|
response += (char)_serial_gps->read();
|
||||||
|
|
||||||
// Add char to buffer if there's space
|
if (response.endsWith(",") || response.endsWith("\r\n")) {
|
||||||
if (responseLen < sizeof(response) - 1) {
|
|
||||||
response[responseLen++] = c;
|
|
||||||
response[responseLen] = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (c == ',' || (responseLen >= 2 && response[responseLen - 2] == '\r' && response[responseLen - 1] == '\n')) {
|
|
||||||
#ifdef GPS_DEBUG
|
#ifdef GPS_DEBUG
|
||||||
LOG_DEBUG(response);
|
LOG_DEBUG(response.c_str());
|
||||||
#endif
|
#endif
|
||||||
// check if we can see our chips
|
// check if we can see our chips
|
||||||
for (const auto &chipInfo : responseMap) {
|
for (const auto &chipInfo : responseMap) {
|
||||||
if (strstr(response, chipInfo.detectionString.c_str()) != nullptr) {
|
if (strstr(response.c_str(), chipInfo.detectionString.c_str()) != nullptr) {
|
||||||
LOG_INFO("%s detected", chipInfo.chipName.c_str());
|
LOG_INFO("%s detected", chipInfo.chipName.c_str());
|
||||||
return chipInfo.driver;
|
return chipInfo.driver;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (responseLen >= 2 && response[responseLen - 2] == '\r' && response[responseLen - 1] == '\n') {
|
if (response.endsWith("\r\n")) {
|
||||||
// Reset the response buffer for the next potential message
|
response.trim();
|
||||||
responseLen = 0;
|
response = ""; // Reset the response string for the next potential message
|
||||||
response[0] = '\0';
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#ifdef GPS_DEBUG
|
#ifdef GPS_DEBUG
|
||||||
LOG_DEBUG(response);
|
LOG_DEBUG(response.c_str());
|
||||||
#endif
|
#endif
|
||||||
return GNSS_MODEL_UNKNOWN; // Return unknown on timeout
|
return GNSS_MODEL_UNKNOWN; // Return empty string on timeout
|
||||||
}
|
}
|
||||||
|
|
||||||
GPS *GPS::createGps()
|
GPS *GPS::createGps()
|
||||||
@@ -1519,10 +1504,28 @@ static int32_t toDegInt(RawDegrees d)
|
|||||||
* Perform any processing that should be done only while the GPS is awake and looking for a fix.
|
* Perform any processing that should be done only while the GPS is awake and looking for a fix.
|
||||||
* Override this method to check for new locations
|
* Override this method to check for new locations
|
||||||
*
|
*
|
||||||
* @return true if we've set a new time
|
* @return true if we've acquired a new location
|
||||||
*/
|
*/
|
||||||
bool GPS::lookForTime()
|
bool GPS::lookForTime()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
#ifdef GNSS_AIROHA
|
||||||
|
uint8_t fix = reader.fixQuality();
|
||||||
|
if (fix >= 1 && fix <= 5) {
|
||||||
|
if (lastFixStartMsec > 0) {
|
||||||
|
if (Throttle::isWithinTimespanMs(lastFixStartMsec, GPS_FIX_HOLD_TIME)) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
clearBuffer();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
lastFixStartMsec = millis();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
auto ti = reader.time;
|
auto ti = reader.time;
|
||||||
auto d = reader.date;
|
auto d = reader.date;
|
||||||
if (ti.isValid() && d.isValid()) { // Note: we don't check for updated, because we'll only be called if needed
|
if (ti.isValid() && d.isValid()) { // Note: we don't check for updated, because we'll only be called if needed
|
||||||
@@ -1539,13 +1542,13 @@ The Unix epoch (or Unix time or POSIX time or Unix timestamp) is the number of s
|
|||||||
t.tm_year = d.year() - 1900;
|
t.tm_year = d.year() - 1900;
|
||||||
t.tm_isdst = false;
|
t.tm_isdst = false;
|
||||||
if (t.tm_mon > -1) {
|
if (t.tm_mon > -1) {
|
||||||
if (perhapsSetRTC(RTCQualityGPS, t) == RTCSetResultSuccess) {
|
LOG_DEBUG("NMEA GPS time %02d-%02d-%02d %02d:%02d:%02d age %d", d.year(), d.month(), t.tm_mday, t.tm_hour, t.tm_min,
|
||||||
LOG_DEBUG("NMEA GPS time set %02d-%02d-%02d %02d:%02d:%02d age %d", d.year(), d.month(), t.tm_mday, t.tm_hour,
|
t.tm_sec, ti.age());
|
||||||
t.tm_min, t.tm_sec, ti.age());
|
if (perhapsSetRTC(RTCQualityGPS, t) == RTCSetResultInvalidTime) {
|
||||||
return true;
|
// Clear the GPS buffer if we got an invalid time
|
||||||
} else {
|
clearBuffer();
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
} else
|
} else
|
||||||
return false;
|
return false;
|
||||||
} else
|
} else
|
||||||
@@ -1560,6 +1563,25 @@ The Unix epoch (or Unix time or POSIX time or Unix timestamp) is the number of s
|
|||||||
*/
|
*/
|
||||||
bool GPS::lookForLocation()
|
bool GPS::lookForLocation()
|
||||||
{
|
{
|
||||||
|
#ifdef GNSS_AIROHA
|
||||||
|
if ((config.position.gps_update_interval * 1000) >= (GPS_FIX_HOLD_TIME * 2)) {
|
||||||
|
uint8_t fix = reader.fixQuality();
|
||||||
|
if (fix >= 1 && fix <= 5) {
|
||||||
|
if (lastFixStartMsec > 0) {
|
||||||
|
if (Throttle::isWithinTimespanMs(lastFixStartMsec, GPS_FIX_HOLD_TIME)) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
clearBuffer();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
lastFixStartMsec = millis();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
// By default, TinyGPS++ does not parse GPGSA lines, which give us
|
// By default, TinyGPS++ does not parse GPGSA lines, which give us
|
||||||
// the 2D/3D fixType (see NMEAGPS.h)
|
// the 2D/3D fixType (see NMEAGPS.h)
|
||||||
// At a minimum, use the fixQuality indicator in GPGGA (FIXME?)
|
// At a minimum, use the fixQuality indicator in GPGGA (FIXME?)
|
||||||
|
|||||||
@@ -159,7 +159,7 @@ class GPS : private concurrency::OSThread
|
|||||||
uint8_t fixType = 0; // fix type from GPGSA
|
uint8_t fixType = 0; // fix type from GPGSA
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
uint32_t fixHoldEnds = 0;
|
uint32_t lastWakeStartMsec = 0, lastSleepStartMsec = 0, lastFixStartMsec = 0;
|
||||||
uint32_t rx_gpio = 0;
|
uint32_t rx_gpio = 0;
|
||||||
uint32_t tx_gpio = 0;
|
uint32_t tx_gpio = 0;
|
||||||
|
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ static uint64_t zeroOffsetSecs; // GPS based time in secs since 1970 - only upda
|
|||||||
* Reads the current date and time from the RTC module and updates the system time.
|
* Reads the current date and time from the RTC module and updates the system time.
|
||||||
* @return True if the RTC was successfully read and the system time was updated, false otherwise.
|
* @return True if the RTC was successfully read and the system time was updated, false otherwise.
|
||||||
*/
|
*/
|
||||||
RTCSetResult readFromRTC()
|
void readFromRTC()
|
||||||
{
|
{
|
||||||
struct timeval tv; /* btw settimeofday() is helpful here too*/
|
struct timeval tv; /* btw settimeofday() is helpful here too*/
|
||||||
#ifdef RV3028_RTC
|
#ifdef RV3028_RTC
|
||||||
@@ -44,23 +44,15 @@ RTCSetResult readFromRTC()
|
|||||||
t.tm_sec = rtc.getSecond();
|
t.tm_sec = rtc.getSecond();
|
||||||
tv.tv_sec = gm_mktime(&t);
|
tv.tv_sec = gm_mktime(&t);
|
||||||
tv.tv_usec = 0;
|
tv.tv_usec = 0;
|
||||||
|
|
||||||
uint32_t printableEpoch = tv.tv_sec; // Print lib only supports 32 bit but time_t can be 64 bit on some platforms
|
uint32_t printableEpoch = tv.tv_sec; // Print lib only supports 32 bit but time_t can be 64 bit on some platforms
|
||||||
|
|
||||||
#ifdef BUILD_EPOCH
|
|
||||||
if (tv.tv_sec < BUILD_EPOCH) {
|
|
||||||
LOG_WARN("Ignore time (%ld) before build epoch (%ld)!", printableEpoch, BUILD_EPOCH);
|
|
||||||
return RTCSetResultInvalidTime;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
LOG_DEBUG("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);
|
||||||
|
timeStartMsec = now;
|
||||||
|
zeroOffsetSecs = tv.tv_sec;
|
||||||
if (currentQuality == RTCQualityNone) {
|
if (currentQuality == RTCQualityNone) {
|
||||||
timeStartMsec = now;
|
|
||||||
zeroOffsetSecs = tv.tv_sec;
|
|
||||||
currentQuality = RTCQualityDevice;
|
currentQuality = RTCQualityDevice;
|
||||||
}
|
}
|
||||||
return RTCSetResultSuccess;
|
|
||||||
}
|
}
|
||||||
#elif defined(PCF8563_RTC)
|
#elif defined(PCF8563_RTC)
|
||||||
if (rtc_found.address == PCF8563_RTC) {
|
if (rtc_found.address == PCF8563_RTC) {
|
||||||
@@ -83,23 +75,15 @@ RTCSetResult readFromRTC()
|
|||||||
t.tm_sec = tc.second;
|
t.tm_sec = tc.second;
|
||||||
tv.tv_sec = gm_mktime(&t);
|
tv.tv_sec = gm_mktime(&t);
|
||||||
tv.tv_usec = 0;
|
tv.tv_usec = 0;
|
||||||
|
|
||||||
uint32_t printableEpoch = tv.tv_sec; // Print lib only supports 32 bit but time_t can be 64 bit on some platforms
|
uint32_t printableEpoch = tv.tv_sec; // Print lib only supports 32 bit but time_t can be 64 bit on some platforms
|
||||||
|
|
||||||
#ifdef BUILD_EPOCH
|
|
||||||
if (tv.tv_sec < BUILD_EPOCH) {
|
|
||||||
LOG_WARN("Ignore time (%ld) before build epoch (%ld)!", printableEpoch, BUILD_EPOCH);
|
|
||||||
return RTCSetResultInvalidTime;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
LOG_DEBUG("Read RTC time from PCF8563 getDateTime as %02d-%02d-%02d %02d:%02d:%02d (%ld)", t.tm_year + 1900, t.tm_mon + 1,
|
LOG_DEBUG("Read RTC time from PCF8563 getDateTime 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);
|
||||||
|
timeStartMsec = now;
|
||||||
|
zeroOffsetSecs = tv.tv_sec;
|
||||||
if (currentQuality == RTCQualityNone) {
|
if (currentQuality == RTCQualityNone) {
|
||||||
timeStartMsec = now;
|
|
||||||
zeroOffsetSecs = tv.tv_sec;
|
|
||||||
currentQuality = RTCQualityDevice;
|
currentQuality = RTCQualityDevice;
|
||||||
}
|
}
|
||||||
return RTCSetResultSuccess;
|
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
if (!gettimeofday(&tv, NULL)) {
|
if (!gettimeofday(&tv, NULL)) {
|
||||||
@@ -108,10 +92,8 @@ RTCSetResult readFromRTC()
|
|||||||
LOG_DEBUG("Read RTC time as %ld", printableEpoch);
|
LOG_DEBUG("Read RTC time as %ld", printableEpoch);
|
||||||
timeStartMsec = now;
|
timeStartMsec = now;
|
||||||
zeroOffsetSecs = tv.tv_sec;
|
zeroOffsetSecs = tv.tv_sec;
|
||||||
return RTCSetResultSuccess;
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
return RTCSetResultNotSet;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -119,7 +101,7 @@ RTCSetResult readFromRTC()
|
|||||||
*
|
*
|
||||||
* @param q The quality of the provided time.
|
* @param q The quality of the provided time.
|
||||||
* @param tv A pointer to a timeval struct containing the time to potentially set the RTC to.
|
* @param tv A pointer to a timeval struct containing the time to potentially set the RTC to.
|
||||||
* @return RTCSetResult
|
* @return True if the RTC was set, false otherwise.
|
||||||
*
|
*
|
||||||
* If we haven't yet set our RTC this boot, set it from a GPS derived time
|
* If we haven't yet set our RTC this boot, set it from a GPS derived time
|
||||||
*/
|
*/
|
||||||
@@ -132,10 +114,6 @@ RTCSetResult perhapsSetRTC(RTCQuality q, const struct timeval *tv, bool forceUpd
|
|||||||
if (tv->tv_sec < BUILD_EPOCH) {
|
if (tv->tv_sec < BUILD_EPOCH) {
|
||||||
LOG_WARN("Ignore time (%ld) before build epoch (%ld)!", printableEpoch, BUILD_EPOCH);
|
LOG_WARN("Ignore time (%ld) before build epoch (%ld)!", printableEpoch, BUILD_EPOCH);
|
||||||
return RTCSetResultInvalidTime;
|
return RTCSetResultInvalidTime;
|
||||||
} else if (tv->tv_sec > (BUILD_EPOCH + FORTY_YEARS)) {
|
|
||||||
LOG_WARN("Ignore time (%ld) too far in the future (build epoch: %ld, max allowed: %ld)!", printableEpoch, BUILD_EPOCH,
|
|
||||||
BUILD_EPOCH + FORTY_YEARS);
|
|
||||||
return RTCSetResultInvalidTime;
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -254,10 +232,6 @@ RTCSetResult perhapsSetRTC(RTCQuality q, struct tm &t)
|
|||||||
if (tv.tv_sec < BUILD_EPOCH) {
|
if (tv.tv_sec < BUILD_EPOCH) {
|
||||||
LOG_WARN("Ignore time (%ld) before build epoch (%ld)!", printableEpoch, BUILD_EPOCH);
|
LOG_WARN("Ignore time (%ld) before build epoch (%ld)!", printableEpoch, BUILD_EPOCH);
|
||||||
return RTCSetResultInvalidTime;
|
return RTCSetResultInvalidTime;
|
||||||
} else if (tv.tv_sec > (BUILD_EPOCH + FORTY_YEARS)) {
|
|
||||||
LOG_WARN("Ignore time (%ld) too far in the future (build epoch: %ld, max allowed: %ld)!", printableEpoch, BUILD_EPOCH,
|
|
||||||
BUILD_EPOCH + FORTY_YEARS);
|
|
||||||
return RTCSetResultInvalidTime;
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -48,13 +48,10 @@ uint32_t getTime(bool local = false);
|
|||||||
/// Return time since 1970 in secs. If quality is RTCQualityNone return zero
|
/// Return time since 1970 in secs. If quality is RTCQualityNone return zero
|
||||||
uint32_t getValidTime(RTCQuality minQuality, bool local = false);
|
uint32_t getValidTime(RTCQuality minQuality, bool local = false);
|
||||||
|
|
||||||
RTCSetResult readFromRTC();
|
void readFromRTC();
|
||||||
|
|
||||||
time_t gm_mktime(struct tm *tm);
|
time_t gm_mktime(struct tm *tm);
|
||||||
|
|
||||||
#define SEC_PER_DAY 86400
|
#define SEC_PER_DAY 86400
|
||||||
#define SEC_PER_HOUR 3600
|
#define SEC_PER_HOUR 3600
|
||||||
#define SEC_PER_MIN 60
|
#define SEC_PER_MIN 60
|
||||||
#ifdef BUILD_EPOCH
|
|
||||||
#define FORTY_YEARS (40UL * 365 * SEC_PER_DAY) // probably time to update your firmware
|
|
||||||
#endif
|
|
||||||
|
|||||||
@@ -1128,15 +1128,6 @@ TFTDisplay::TFTDisplay(uint8_t address, int sda, int scl, OLEDDISPLAY_GEOMETRY g
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
TFTDisplay::~TFTDisplay()
|
|
||||||
{
|
|
||||||
// Clean up allocated line pixel buffer to prevent memory leak
|
|
||||||
if (linePixelBuffer != nullptr) {
|
|
||||||
free(linePixelBuffer);
|
|
||||||
linePixelBuffer = nullptr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write the buffer to the display memory
|
// Write the buffer to the display memory
|
||||||
void TFTDisplay::display(bool fromBlank)
|
void TFTDisplay::display(bool fromBlank)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -20,9 +20,6 @@ class TFTDisplay : public OLEDDisplay
|
|||||||
*/
|
*/
|
||||||
TFTDisplay(uint8_t, int, int, OLEDDISPLAY_GEOMETRY, HW_I2C);
|
TFTDisplay(uint8_t, int, int, OLEDDISPLAY_GEOMETRY, HW_I2C);
|
||||||
|
|
||||||
// Destructor to clean up allocated memory
|
|
||||||
~TFTDisplay();
|
|
||||||
|
|
||||||
// Write the buffer to the display memory
|
// Write the buffer to the display memory
|
||||||
virtual void display() override { display(false); };
|
virtual void display() override { display(false); };
|
||||||
virtual void display(bool fromBlank);
|
virtual void display(bool fromBlank);
|
||||||
|
|||||||
@@ -263,6 +263,12 @@ void drawFrameSettings(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t
|
|||||||
display->drawString(x + 1, y, "USB");
|
display->drawString(x + 1, y, "USB");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// auto mode = DisplayFormatters::getModemPresetDisplayName(config.lora.modem_preset, true);
|
||||||
|
|
||||||
|
// display->drawString(x + SCREEN_WIDTH - display->getStringWidth(mode), y, mode);
|
||||||
|
// if (config.display.heading_bold)
|
||||||
|
// display->drawString(x + SCREEN_WIDTH - display->getStringWidth(mode) - 1, y, mode);
|
||||||
|
|
||||||
uint32_t currentMillis = millis();
|
uint32_t currentMillis = millis();
|
||||||
uint32_t seconds = currentMillis / 1000;
|
uint32_t seconds = currentMillis / 1000;
|
||||||
uint32_t minutes = seconds / 60;
|
uint32_t minutes = seconds / 60;
|
||||||
@@ -392,7 +398,7 @@ void drawLoRaFocused(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x,
|
|||||||
display->drawString(nameX, getTextPositions(display)[line++], shortnameble);
|
display->drawString(nameX, getTextPositions(display)[line++], shortnameble);
|
||||||
|
|
||||||
// === Second Row: Radio Preset ===
|
// === Second Row: Radio Preset ===
|
||||||
auto mode = DisplayFormatters::getModemPresetDisplayName(config.lora.modem_preset, false, config.lora.use_preset);
|
auto mode = DisplayFormatters::getModemPresetDisplayName(config.lora.modem_preset, false);
|
||||||
char regionradiopreset[25];
|
char regionradiopreset[25];
|
||||||
const char *region = myRegion ? myRegion->name : NULL;
|
const char *region = myRegion ? myRegion->name : NULL;
|
||||||
if (region != nullptr) {
|
if (region != nullptr) {
|
||||||
|
|||||||
@@ -40,7 +40,10 @@ bool RotaryEncoderImpl::init()
|
|||||||
|
|
||||||
int32_t RotaryEncoderImpl::runOnce()
|
int32_t RotaryEncoderImpl::runOnce()
|
||||||
{
|
{
|
||||||
InputEvent e{originName, INPUT_BROKER_NONE, 0, 0, 0};
|
InputEvent e;
|
||||||
|
e.inputEvent = INPUT_BROKER_NONE;
|
||||||
|
e.source = this->originName;
|
||||||
|
|
||||||
static uint32_t lastPressed = millis();
|
static uint32_t lastPressed = millis();
|
||||||
if (rotary->readButton() == RotaryEncoder::ButtonState::BUTTON_PRESSED) {
|
if (rotary->readButton() == RotaryEncoder::ButtonState::BUTTON_PRESSED) {
|
||||||
if (lastPressed + 200 < millis()) {
|
if (lastPressed + 200 < millis()) {
|
||||||
@@ -67,7 +70,7 @@ int32_t RotaryEncoderImpl::runOnce()
|
|||||||
this->notifyObservers(&e);
|
this->notifyObservers(&e);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 10;
|
return 20;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -13,11 +13,7 @@ void CardKbI2cImpl::init()
|
|||||||
if (cardkb_found.address == 0x00) {
|
if (cardkb_found.address == 0x00) {
|
||||||
LOG_DEBUG("Rescan for I2C keyboard");
|
LOG_DEBUG("Rescan for I2C keyboard");
|
||||||
uint8_t i2caddr_scan[] = {CARDKB_ADDR, TDECK_KB_ADDR, BBQ10_KB_ADDR, MPR121_KB_ADDR, TCA8418_KB_ADDR};
|
uint8_t i2caddr_scan[] = {CARDKB_ADDR, TDECK_KB_ADDR, BBQ10_KB_ADDR, MPR121_KB_ADDR, TCA8418_KB_ADDR};
|
||||||
#if defined(T_LORA_PAGER)
|
|
||||||
uint8_t i2caddr_asize = sizeof(i2caddr_scan) / sizeof(i2caddr_scan[0]);
|
uint8_t i2caddr_asize = sizeof(i2caddr_scan) / sizeof(i2caddr_scan[0]);
|
||||||
#else
|
|
||||||
uint8_t i2caddr_asize = 5;
|
|
||||||
#endif
|
|
||||||
auto i2cScanner = std::unique_ptr<ScanI2CTwoWire>(new ScanI2CTwoWire());
|
auto i2cScanner = std::unique_ptr<ScanI2CTwoWire>(new ScanI2CTwoWire());
|
||||||
|
|
||||||
#if WIRE_INTERFACES_COUNT == 2
|
#if WIRE_INTERFACES_COUNT == 2
|
||||||
|
|||||||
@@ -419,7 +419,7 @@ void setup()
|
|||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
tv.tv_sec = time(NULL);
|
tv.tv_sec = time(NULL);
|
||||||
tv.tv_usec = 0;
|
tv.tv_usec = 0;
|
||||||
perhapsSetRTC(RTCQualityDevice, &tv);
|
perhapsSetRTC(RTCQualityNTP, &tv);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
powerMonInit();
|
powerMonInit();
|
||||||
@@ -741,7 +741,6 @@ void setup()
|
|||||||
scannerToSensorsMap(i2cScanner, ScanI2C::DeviceType::RAK12035, meshtastic_TelemetrySensorType_RAK12035);
|
scannerToSensorsMap(i2cScanner, ScanI2C::DeviceType::RAK12035, meshtastic_TelemetrySensorType_RAK12035);
|
||||||
scannerToSensorsMap(i2cScanner, ScanI2C::DeviceType::PCT2075, meshtastic_TelemetrySensorType_PCT2075);
|
scannerToSensorsMap(i2cScanner, ScanI2C::DeviceType::PCT2075, meshtastic_TelemetrySensorType_PCT2075);
|
||||||
scannerToSensorsMap(i2cScanner, ScanI2C::DeviceType::SCD4X, meshtastic_TelemetrySensorType_SCD4X);
|
scannerToSensorsMap(i2cScanner, ScanI2C::DeviceType::SCD4X, meshtastic_TelemetrySensorType_SCD4X);
|
||||||
scannerToSensorsMap(i2cScanner, ScanI2C::DeviceType::TSL2561, meshtastic_TelemetrySensorType_TSL2561);
|
|
||||||
|
|
||||||
i2cScanner.reset();
|
i2cScanner.reset();
|
||||||
#endif
|
#endif
|
||||||
@@ -1526,7 +1525,7 @@ extern meshtastic_DeviceMetadata getDeviceMetadata()
|
|||||||
#if ((!HAS_SCREEN || NO_EXT_GPIO) || MESHTASTIC_EXCLUDE_CANNEDMESSAGES) && !defined(MESHTASTIC_INCLUDE_NICHE_GRAPHICS)
|
#if ((!HAS_SCREEN || NO_EXT_GPIO) || MESHTASTIC_EXCLUDE_CANNEDMESSAGES) && !defined(MESHTASTIC_INCLUDE_NICHE_GRAPHICS)
|
||||||
deviceMetadata.excluded_modules |= meshtastic_ExcludedModules_CANNEDMSG_CONFIG;
|
deviceMetadata.excluded_modules |= meshtastic_ExcludedModules_CANNEDMSG_CONFIG;
|
||||||
#endif
|
#endif
|
||||||
#if NO_EXT_GPIO || MESHTASTIC_EXCLUDE_EXTERNALNOTIFICATION
|
#if NO_EXT_GPIO
|
||||||
deviceMetadata.excluded_modules |= meshtastic_ExcludedModules_EXTNOTIF_CONFIG;
|
deviceMetadata.excluded_modules |= meshtastic_ExcludedModules_EXTNOTIF_CONFIG;
|
||||||
#endif
|
#endif
|
||||||
// Only edge case here is if we apply this a device with built in Accelerometer and want to detect interrupts
|
// Only edge case here is if we apply this a device with built in Accelerometer and want to detect interrupts
|
||||||
|
|||||||
@@ -368,7 +368,7 @@ const char *Channels::getName(size_t chIndex)
|
|||||||
// Per mesh.proto spec, if bandwidth is specified we must ignore modemPreset enum, we assume that in that case
|
// Per mesh.proto spec, if bandwidth is specified we must ignore modemPreset enum, we assume that in that case
|
||||||
// the app effed up and forgot to set channelSettings.name
|
// the app effed up and forgot to set channelSettings.name
|
||||||
if (config.lora.use_preset) {
|
if (config.lora.use_preset) {
|
||||||
channelName = DisplayFormatters::getModemPresetDisplayName(config.lora.modem_preset, false, config.lora.use_preset);
|
channelName = DisplayFormatters::getModemPresetDisplayName(config.lora.modem_preset, false);
|
||||||
} else {
|
} else {
|
||||||
channelName = "Custom";
|
channelName = "Custom";
|
||||||
}
|
}
|
||||||
@@ -382,8 +382,7 @@ bool Channels::isDefaultChannel(ChannelIndex chIndex)
|
|||||||
const auto &ch = getByIndex(chIndex);
|
const auto &ch = getByIndex(chIndex);
|
||||||
if (ch.settings.psk.size == 1 && ch.settings.psk.bytes[0] == 1) {
|
if (ch.settings.psk.size == 1 && ch.settings.psk.bytes[0] == 1) {
|
||||||
const char *name = getName(chIndex);
|
const char *name = getName(chIndex);
|
||||||
const char *presetName =
|
const char *presetName = DisplayFormatters::getModemPresetDisplayName(config.lora.modem_preset, false);
|
||||||
DisplayFormatters::getModemPresetDisplayName(config.lora.modem_preset, false, config.lora.use_preset);
|
|
||||||
// Check if the name is the default derived from the modem preset
|
// Check if the name is the default derived from the modem preset
|
||||||
if (strcmp(name, presetName) == 0)
|
if (strcmp(name, presetName) == 0)
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -85,8 +85,11 @@ meshtastic_MeshPacket *MeshModule::allocErrorResponse(meshtastic_Routing_Error e
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MeshModule::callModules(meshtastic_MeshPacket &mp, RxSource src)
|
void MeshModule::callModules(meshtastic_MeshPacket &mp, RxSource src, const char *specificModule)
|
||||||
{
|
{
|
||||||
|
if (specificModule) {
|
||||||
|
LOG_DEBUG("Calling specific module: %s", specificModule);
|
||||||
|
}
|
||||||
// LOG_DEBUG("In call modules");
|
// LOG_DEBUG("In call modules");
|
||||||
bool moduleFound = false;
|
bool moduleFound = false;
|
||||||
|
|
||||||
@@ -100,11 +103,15 @@ void MeshModule::callModules(meshtastic_MeshPacket &mp, RxSource src)
|
|||||||
// Was this message directed to us specifically? Will be false if we are sniffing someone elses packets
|
// Was this message directed to us specifically? Will be false if we are sniffing someone elses packets
|
||||||
auto ourNodeNum = nodeDB->getNodeNum();
|
auto ourNodeNum = nodeDB->getNodeNum();
|
||||||
bool toUs = isBroadcast(mp.to) || isToUs(&mp);
|
bool toUs = isBroadcast(mp.to) || isToUs(&mp);
|
||||||
bool fromUs = mp.from == ourNodeNum;
|
|
||||||
|
|
||||||
for (auto i = modules->begin(); i != modules->end(); ++i) {
|
for (auto i = modules->begin(); i != modules->end(); ++i) {
|
||||||
auto &pi = **i;
|
auto &pi = **i;
|
||||||
|
|
||||||
|
// If specificModule is provided, only call that specific module
|
||||||
|
if (specificModule && (!pi.name || strcmp(pi.name, specificModule) != 0)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
pi.currentRequest = ∓
|
pi.currentRequest = ∓
|
||||||
|
|
||||||
/// We only call modules that are interested in the packet (and the message is destined to us or we are promiscious)
|
/// We only call modules that are interested in the packet (and the message is destined to us or we are promiscious)
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ class MeshModule
|
|||||||
|
|
||||||
/** For use only by MeshService
|
/** For use only by MeshService
|
||||||
*/
|
*/
|
||||||
static void callModules(meshtastic_MeshPacket &mp, RxSource src = RX_SRC_RADIO);
|
static void callModules(meshtastic_MeshPacket &mp, RxSource src = RX_SRC_RADIO, const char *specificModule = nullptr);
|
||||||
|
|
||||||
static std::vector<MeshModule *> GetMeshModulesWithUIFrames(int startIndex);
|
static std::vector<MeshModule *> GetMeshModulesWithUIFrames(int startIndex);
|
||||||
static void observeUIEvents(Observer<const UIFrameEvent *> *observer);
|
static void observeUIEvents(Observer<const UIFrameEvent *> *observer);
|
||||||
|
|||||||
@@ -34,11 +34,8 @@ bool NextHopRouter::shouldFilterReceived(const meshtastic_MeshPacket *p)
|
|||||||
bool weWereNextHop = false;
|
bool weWereNextHop = false;
|
||||||
if (wasSeenRecently(p, true, &wasFallback, &weWereNextHop)) { // Note: this will also add a recent packet record
|
if (wasSeenRecently(p, true, &wasFallback, &weWereNextHop)) { // Note: this will also add a recent packet record
|
||||||
printPacket("Ignore dupe incoming msg", p);
|
printPacket("Ignore dupe incoming msg", p);
|
||||||
|
rxDupe++;
|
||||||
if (p->transport_mechanism == meshtastic_MeshPacket_TransportMechanism_TRANSPORT_LORA) {
|
stopRetransmission(p->from, p->id);
|
||||||
rxDupe++;
|
|
||||||
stopRetransmission(p->from, p->id);
|
|
||||||
}
|
|
||||||
|
|
||||||
// If it was a fallback to flooding, try to relay again
|
// If it was a fallback to flooding, try to relay again
|
||||||
if (wasFallback) {
|
if (wasFallback) {
|
||||||
@@ -74,11 +71,10 @@ void NextHopRouter::sniffReceived(const meshtastic_MeshPacket *p, const meshtast
|
|||||||
if (p->from != 0) {
|
if (p->from != 0) {
|
||||||
meshtastic_NodeInfoLite *origTx = nodeDB->getMeshNode(p->from);
|
meshtastic_NodeInfoLite *origTx = nodeDB->getMeshNode(p->from);
|
||||||
if (origTx) {
|
if (origTx) {
|
||||||
// Either relayer of ACK was also a relayer of the packet, or we were the *only* relayer and the ACK came directly
|
// Either relayer of ACK was also a relayer of the packet, or we were the relayer and the ACK came directly from
|
||||||
// from the destination
|
// the destination
|
||||||
if (wasRelayer(p->relay_node, p->decoded.request_id, p->to) ||
|
if (wasRelayer(p->relay_node, p->decoded.request_id, p->to) ||
|
||||||
(p->hop_start != 0 && p->hop_start == p->hop_limit &&
|
(wasRelayer(ourRelayID, p->decoded.request_id, p->to) && p->hop_start != 0 && p->hop_start == p->hop_limit)) {
|
||||||
wasSoleRelayer(ourRelayID, p->decoded.request_id, p->to))) {
|
|
||||||
if (origTx->next_hop != p->relay_node) { // Not already set
|
if (origTx->next_hop != p->relay_node) { // Not already set
|
||||||
LOG_INFO("Update next hop of 0x%x to 0x%x based on ACK/reply", p->from, p->relay_node);
|
LOG_INFO("Update next hop of 0x%x to 0x%x based on ACK/reply", p->from, p->relay_node);
|
||||||
origTx->next_hop = p->relay_node;
|
origTx->next_hop = p->relay_node;
|
||||||
|
|||||||
@@ -1711,10 +1711,10 @@ bool NodeDB::updateUser(uint32_t nodeId, meshtastic_User &p, uint8_t channelInde
|
|||||||
/// we updateGUI and updateGUIforNode if we think our this change is big enough for a redraw
|
/// we updateGUI and updateGUIforNode if we think our this change is big enough for a redraw
|
||||||
void NodeDB::updateFrom(const meshtastic_MeshPacket &mp)
|
void NodeDB::updateFrom(const meshtastic_MeshPacket &mp)
|
||||||
{
|
{
|
||||||
if (mp.from == getNodeNum()) {
|
// if (mp.from == getNodeNum()) {
|
||||||
LOG_DEBUG("Ignore update from self");
|
// LOG_DEBUG("Ignore update from self");
|
||||||
return;
|
// return;
|
||||||
}
|
// }
|
||||||
if (mp.which_payload_variant == meshtastic_MeshPacket_decoded_tag && mp.from) {
|
if (mp.which_payload_variant == meshtastic_MeshPacket_decoded_tag && mp.from) {
|
||||||
LOG_DEBUG("Update DB node 0x%x, rx_time=%u", mp.from, mp.rx_time);
|
LOG_DEBUG("Update DB node 0x%x, rx_time=%u", mp.from, mp.rx_time);
|
||||||
|
|
||||||
|
|||||||
@@ -294,7 +294,7 @@ void PacketHistory::insert(const PacketRecord &r)
|
|||||||
|
|
||||||
/* Check if a certain node was a relayer of a packet in the history given an ID and sender
|
/* Check if a certain node was a relayer of a packet in the history given an ID and sender
|
||||||
* @return true if node was indeed a relayer, false if not */
|
* @return true if node was indeed a relayer, false if not */
|
||||||
bool PacketHistory::wasRelayer(const uint8_t relayer, const uint32_t id, const NodeNum sender, bool *wasSole)
|
bool PacketHistory::wasRelayer(const uint8_t relayer, const uint32_t id, const NodeNum sender)
|
||||||
{
|
{
|
||||||
if (!initOk()) {
|
if (!initOk()) {
|
||||||
LOG_ERROR("PacketHistory - wasRelayer: NOT INITIALIZED!");
|
LOG_ERROR("PacketHistory - wasRelayer: NOT INITIALIZED!");
|
||||||
@@ -322,42 +322,27 @@ bool PacketHistory::wasRelayer(const uint8_t relayer, const uint32_t id, const N
|
|||||||
found->sender, found->id, found->next_hop, millis() - found->rxTimeMsec, found->relayed_by[0], found->relayed_by[1],
|
found->sender, found->id, found->next_hop, millis() - found->rxTimeMsec, found->relayed_by[0], found->relayed_by[1],
|
||||||
found->relayed_by[2], relayer);
|
found->relayed_by[2], relayer);
|
||||||
#endif
|
#endif
|
||||||
return wasRelayer(relayer, *found, wasSole);
|
return wasRelayer(relayer, *found);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if a certain node was a relayer of a packet in the history given iterator
|
/* Check if a certain node was a relayer of a packet in the history given iterator
|
||||||
* @return true if node was indeed a relayer, false if not */
|
* @return true if node was indeed a relayer, false if not */
|
||||||
bool PacketHistory::wasRelayer(const uint8_t relayer, const PacketRecord &r, bool *wasSole)
|
bool PacketHistory::wasRelayer(const uint8_t relayer, const PacketRecord &r)
|
||||||
{
|
{
|
||||||
bool found = false;
|
for (uint8_t i = 0; i < NUM_RELAYERS; i++) {
|
||||||
bool other_present = false;
|
|
||||||
|
|
||||||
for (uint8_t i = 0; i < NUM_RELAYERS; ++i) {
|
|
||||||
if (r.relayed_by[i] == relayer) {
|
if (r.relayed_by[i] == relayer) {
|
||||||
found = true;
|
#if VERBOSE_PACKET_HISTORY
|
||||||
} else if (r.relayed_by[i] != 0) {
|
LOG_DEBUG("Packet History - was rel.PR.: s=%08x id=%08x rls=%02x %02x %02x / rl=%02x? YES", r.sender, r.id,
|
||||||
other_present = true;
|
r.relayed_by[0], r.relayed_by[1], r.relayed_by[2], relayer);
|
||||||
|
#endif
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wasSole) {
|
|
||||||
*wasSole = (found && !other_present);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if VERBOSE_PACKET_HISTORY
|
#if VERBOSE_PACKET_HISTORY
|
||||||
LOG_DEBUG("Packet History - was rel.PR.: s=%08x id=%08x rls=%02x %02x %02x / rl=%02x? NO", r.sender, r.id, r.relayed_by[0],
|
LOG_DEBUG("Packet History - was rel.PR.: s=%08x id=%08x rls=%02x %02x %02x / rl=%02x? NO", r.sender, r.id, r.relayed_by[0],
|
||||||
r.relayed_by[1], r.relayed_by[2], relayer);
|
r.relayed_by[1], r.relayed_by[2], relayer);
|
||||||
#endif
|
#endif
|
||||||
|
return false;
|
||||||
return found;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if a certain node was the *only* relayer of a packet in the history given an ID and sender
|
|
||||||
bool PacketHistory::wasSoleRelayer(const uint8_t relayer, const uint32_t id, const NodeNum sender)
|
|
||||||
{
|
|
||||||
bool wasSole = false;
|
|
||||||
wasRelayer(relayer, id, sender, &wasSole);
|
|
||||||
return wasSole;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove a relayer from the list of relayers of a packet in the history given an ID and sender
|
// Remove a relayer from the list of relayers of a packet in the history given an ID and sender
|
||||||
|
|||||||
@@ -34,9 +34,8 @@ class PacketHistory
|
|||||||
void insert(const PacketRecord &r); // Insert or replace a packet record in the history
|
void insert(const PacketRecord &r); // Insert or replace a packet record in the history
|
||||||
|
|
||||||
/* Check if a certain node was a relayer of a packet in the history given iterator
|
/* Check if a certain node was a relayer of a packet in the history given iterator
|
||||||
* If wasSole is not nullptr, it will be set to true if the relayer was the only relayer of that packet
|
|
||||||
* @return true if node was indeed a relayer, false if not */
|
* @return true if node was indeed a relayer, false if not */
|
||||||
bool wasRelayer(const uint8_t relayer, const PacketRecord &r, bool *wasSole = nullptr);
|
bool wasRelayer(const uint8_t relayer, const PacketRecord &r);
|
||||||
|
|
||||||
PacketHistory(const PacketHistory &); // non construction-copyable
|
PacketHistory(const PacketHistory &); // non construction-copyable
|
||||||
PacketHistory &operator=(const PacketHistory &); // non copyable
|
PacketHistory &operator=(const PacketHistory &); // non copyable
|
||||||
@@ -55,12 +54,8 @@ class PacketHistory
|
|||||||
bool *weWereNextHop = nullptr);
|
bool *weWereNextHop = nullptr);
|
||||||
|
|
||||||
/* Check if a certain node was a relayer of a packet in the history given an ID and sender
|
/* Check if a certain node was a relayer of a packet in the history given an ID and sender
|
||||||
* If wasSole is not nullptr, it will be set to true if the relayer was the only relayer of that packet
|
|
||||||
* @return true if node was indeed a relayer, false if not */
|
* @return true if node was indeed a relayer, false if not */
|
||||||
bool wasRelayer(const uint8_t relayer, const uint32_t id, const NodeNum sender, bool *wasSole = nullptr);
|
bool wasRelayer(const uint8_t relayer, const uint32_t id, const NodeNum sender);
|
||||||
|
|
||||||
// Check if a certain node was the *only* relayer of a packet in the history given an ID and sender
|
|
||||||
bool wasSoleRelayer(const uint8_t relayer, const uint32_t id, const NodeNum sender);
|
|
||||||
|
|
||||||
// Remove a relayer from the list of relayers of a packet in the history given an ID and sender
|
// Remove a relayer from the list of relayers of a packet in the history given an ID and sender
|
||||||
void removeRelayer(const uint8_t relayer, const uint32_t id, const NodeNum sender);
|
void removeRelayer(const uint8_t relayer, const uint32_t id, const NodeNum sender);
|
||||||
|
|||||||
@@ -586,8 +586,7 @@ void RadioInterface::applyModemConfig()
|
|||||||
|
|
||||||
// Check if we use the default frequency slot
|
// Check if we use the default frequency slot
|
||||||
RadioInterface::uses_default_frequency_slot =
|
RadioInterface::uses_default_frequency_slot =
|
||||||
channel_num ==
|
channel_num == hash(DisplayFormatters::getModemPresetDisplayName(config.lora.modem_preset, false)) % numChannels;
|
||||||
hash(DisplayFormatters::getModemPresetDisplayName(config.lora.modem_preset, false, config.lora.use_preset)) % numChannels;
|
|
||||||
|
|
||||||
// Old frequency selection formula
|
// Old frequency selection formula
|
||||||
// float freq = myRegion->freqStart + ((((myRegion->freqEnd - myRegion->freqStart) / numChannels) / 2) * channel_num);
|
// float freq = myRegion->freqStart + ((((myRegion->freqEnd - myRegion->freqStart) / numChannels) / 2) * channel_num);
|
||||||
|
|||||||
@@ -58,10 +58,7 @@ bool ReliableRouter::shouldFilterReceived(const meshtastic_MeshPacket *p)
|
|||||||
// marked as wantAck
|
// marked as wantAck
|
||||||
sendAckNak(meshtastic_Routing_Error_NONE, getFrom(p), p->id, old->packet->channel);
|
sendAckNak(meshtastic_Routing_Error_NONE, getFrom(p), p->id, old->packet->channel);
|
||||||
|
|
||||||
// Only stop retransmissions if the rebroadcast came via LoRa
|
stopRetransmission(key);
|
||||||
if (p->transport_mechanism == meshtastic_MeshPacket_TransportMechanism_TRANSPORT_LORA) {
|
|
||||||
stopRetransmission(key);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
LOG_DEBUG("Didn't find pending packet");
|
LOG_DEBUG("Didn't find pending packet");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -562,7 +562,7 @@ meshtastic_Routing_Error perhapsEncode(meshtastic_MeshPacket *p)
|
|||||||
// Now that we are encrypting the packet channel should be the hash (no longer the index)
|
// Now that we are encrypting the packet channel should be the hash (no longer the index)
|
||||||
p->channel = hash;
|
p->channel = hash;
|
||||||
if (hash < 0) {
|
if (hash < 0) {
|
||||||
// No suitable channel could be found for
|
// No suitable channel could be found for sending
|
||||||
return meshtastic_Routing_Error_NO_CHANNEL;
|
return meshtastic_Routing_Error_NO_CHANNEL;
|
||||||
}
|
}
|
||||||
crypto->encryptPacket(getFrom(p), p->id, numbytes, bytes);
|
crypto->encryptPacket(getFrom(p), p->id, numbytes, bytes);
|
||||||
@@ -578,7 +578,7 @@ meshtastic_Routing_Error perhapsEncode(meshtastic_MeshPacket *p)
|
|||||||
// Now that we are encrypting the packet channel should be the hash (no longer the index)
|
// Now that we are encrypting the packet channel should be the hash (no longer the index)
|
||||||
p->channel = hash;
|
p->channel = hash;
|
||||||
if (hash < 0) {
|
if (hash < 0) {
|
||||||
// No suitable channel could be found for
|
// No suitable channel could be found for sending
|
||||||
return meshtastic_Routing_Error_NO_CHANNEL;
|
return meshtastic_Routing_Error_NO_CHANNEL;
|
||||||
}
|
}
|
||||||
crypto->encryptPacket(getFrom(p), p->id, numbytes, bytes);
|
crypto->encryptPacket(getFrom(p), p->id, numbytes, bytes);
|
||||||
@@ -671,7 +671,7 @@ void Router::handleReceived(meshtastic_MeshPacket *p, RxSource src)
|
|||||||
mqtt->onSend(*p_encrypted, *p, p->channel);
|
mqtt->onSend(*p_encrypted, *p, p->channel);
|
||||||
#endif
|
#endif
|
||||||
} else if (p->from == nodeDB->getNodeNum() && !skipHandle) {
|
} else if (p->from == nodeDB->getNodeNum() && !skipHandle) {
|
||||||
MeshModule::callModules(*p, src);
|
MeshModule::callModules(*p, src, ROUTING_MODULE);
|
||||||
}
|
}
|
||||||
|
|
||||||
packetPool.release(p_encrypted); // Release the encrypted packet
|
packetPool.release(p_encrypted); // Release the encrypted packet
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
#include "configuration.h"
|
|
||||||
|
|
||||||
#ifdef ARCH_STM32WL
|
|
||||||
#include "STM32WLE5JCInterface.h"
|
#include "STM32WLE5JCInterface.h"
|
||||||
|
#include "configuration.h"
|
||||||
#include "error.h"
|
#include "error.h"
|
||||||
|
|
||||||
#ifndef STM32WLx_MAX_POWER
|
#ifndef STM32WLx_MAX_POWER
|
||||||
#define STM32WLx_MAX_POWER 22
|
#define STM32WLx_MAX_POWER 22
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef ARCH_STM32WL
|
||||||
|
|
||||||
STM32WLE5JCInterface::STM32WLE5JCInterface(LockingArduinoHal *hal, RADIOLIB_PIN_TYPE cs, RADIOLIB_PIN_TYPE irq,
|
STM32WLE5JCInterface::STM32WLE5JCInterface(LockingArduinoHal *hal, RADIOLIB_PIN_TYPE cs, RADIOLIB_PIN_TYPE irq,
|
||||||
RADIOLIB_PIN_TYPE rst, RADIOLIB_PIN_TYPE busy)
|
RADIOLIB_PIN_TYPE rst, RADIOLIB_PIN_TYPE busy)
|
||||||
: SX126xInterface(hal, cs, irq, rst, busy)
|
: SX126xInterface(hal, cs, irq, rst, busy)
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#ifdef ARCH_STM32WL
|
|
||||||
#include "SX126xInterface.h"
|
#include "SX126xInterface.h"
|
||||||
#include "rfswitch.h"
|
|
||||||
|
#ifdef ARCH_STM32WL
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Our adapter for STM32WLE5JC radios
|
* Our adapter for STM32WLE5JC radios
|
||||||
@@ -16,4 +16,13 @@ class STM32WLE5JCInterface : public SX126xInterface<STM32WLx>
|
|||||||
virtual bool init() override;
|
virtual bool init() override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* https://wiki.seeedstudio.com/LoRa-E5_STM32WLE5JC_Module/
|
||||||
|
* Wio-E5 module ONLY transmits through RFO_HP
|
||||||
|
* Receive: PA4=1, PA5=0
|
||||||
|
* Transmit(high output power, SMPS mode): PA4=0, PA5=1 */
|
||||||
|
static const RADIOLIB_PIN_TYPE rfswitch_pins[5] = {PA4, PA5, RADIOLIB_NC, RADIOLIB_NC, RADIOLIB_NC};
|
||||||
|
|
||||||
|
static const Module::RfSwitchMode_t rfswitch_table[4] = {
|
||||||
|
{STM32WLx::MODE_IDLE, {LOW, LOW}}, {STM32WLx::MODE_RX, {HIGH, LOW}}, {STM32WLx::MODE_TX_HP, {LOW, HIGH}}, END_OF_MODE_TABLE};
|
||||||
|
|
||||||
#endif // ARCH_STM32WL
|
#endif // ARCH_STM32WL
|
||||||
@@ -64,12 +64,7 @@ typedef enum _meshtastic_Config_DeviceConfig_Role {
|
|||||||
in areas not already covered by other routers, or to bridge around problematic terrain,
|
in areas not already covered by other routers, or to bridge around problematic terrain,
|
||||||
but should not be given priority over other routers in order to avoid unnecessaraily
|
but should not be given priority over other routers in order to avoid unnecessaraily
|
||||||
consuming hops. */
|
consuming hops. */
|
||||||
meshtastic_Config_DeviceConfig_Role_ROUTER_LATE = 11,
|
meshtastic_Config_DeviceConfig_Role_ROUTER_LATE = 11
|
||||||
/* Description: Treats packets from or to favorited nodes as ROUTER, and all other packets as CLIENT.
|
|
||||||
Technical Details: Used for stronger attic/roof nodes to distribute messages more widely
|
|
||||||
from weaker, indoor, or less-well-positioned nodes. Recommended for users with multiple nodes
|
|
||||||
where one CLIENT_BASE acts as a more powerful base station, such as an attic/roof node. */
|
|
||||||
meshtastic_Config_DeviceConfig_Role_CLIENT_BASE = 12
|
|
||||||
} meshtastic_Config_DeviceConfig_Role;
|
} meshtastic_Config_DeviceConfig_Role;
|
||||||
|
|
||||||
/* Defines the device's behavior for how messages are rebroadcast */
|
/* Defines the device's behavior for how messages are rebroadcast */
|
||||||
@@ -651,8 +646,8 @@ extern "C" {
|
|||||||
|
|
||||||
/* Helper constants for enums */
|
/* Helper constants for enums */
|
||||||
#define _meshtastic_Config_DeviceConfig_Role_MIN meshtastic_Config_DeviceConfig_Role_CLIENT
|
#define _meshtastic_Config_DeviceConfig_Role_MIN meshtastic_Config_DeviceConfig_Role_CLIENT
|
||||||
#define _meshtastic_Config_DeviceConfig_Role_MAX meshtastic_Config_DeviceConfig_Role_CLIENT_BASE
|
#define _meshtastic_Config_DeviceConfig_Role_MAX meshtastic_Config_DeviceConfig_Role_ROUTER_LATE
|
||||||
#define _meshtastic_Config_DeviceConfig_Role_ARRAYSIZE ((meshtastic_Config_DeviceConfig_Role)(meshtastic_Config_DeviceConfig_Role_CLIENT_BASE+1))
|
#define _meshtastic_Config_DeviceConfig_Role_ARRAYSIZE ((meshtastic_Config_DeviceConfig_Role)(meshtastic_Config_DeviceConfig_Role_ROUTER_LATE+1))
|
||||||
|
|
||||||
#define _meshtastic_Config_DeviceConfig_RebroadcastMode_MIN meshtastic_Config_DeviceConfig_RebroadcastMode_ALL
|
#define _meshtastic_Config_DeviceConfig_RebroadcastMode_MIN meshtastic_Config_DeviceConfig_RebroadcastMode_ALL
|
||||||
#define _meshtastic_Config_DeviceConfig_RebroadcastMode_MAX meshtastic_Config_DeviceConfig_RebroadcastMode_CORE_PORTNUMS_ONLY
|
#define _meshtastic_Config_DeviceConfig_RebroadcastMode_MAX meshtastic_Config_DeviceConfig_RebroadcastMode_CORE_PORTNUMS_ONLY
|
||||||
|
|||||||
@@ -360,7 +360,7 @@ extern const pb_msgdesc_t meshtastic_BackupPreferences_msg;
|
|||||||
/* Maximum encoded size of messages (where known) */
|
/* Maximum encoded size of messages (where known) */
|
||||||
/* meshtastic_NodeDatabase_size depends on runtime parameters */
|
/* meshtastic_NodeDatabase_size depends on runtime parameters */
|
||||||
#define MESHTASTIC_MESHTASTIC_DEVICEONLY_PB_H_MAX_SIZE meshtastic_BackupPreferences_size
|
#define MESHTASTIC_MESHTASTIC_DEVICEONLY_PB_H_MAX_SIZE meshtastic_BackupPreferences_size
|
||||||
#define meshtastic_BackupPreferences_size 2273
|
#define meshtastic_BackupPreferences_size 2271
|
||||||
#define meshtastic_ChannelFile_size 718
|
#define meshtastic_ChannelFile_size 718
|
||||||
#define meshtastic_DeviceState_size 1737
|
#define meshtastic_DeviceState_size 1737
|
||||||
#define meshtastic_NodeInfoLite_size 196
|
#define meshtastic_NodeInfoLite_size 196
|
||||||
|
|||||||
@@ -188,7 +188,7 @@ extern const pb_msgdesc_t meshtastic_LocalModuleConfig_msg;
|
|||||||
/* Maximum encoded size of messages (where known) */
|
/* Maximum encoded size of messages (where known) */
|
||||||
#define MESHTASTIC_MESHTASTIC_LOCALONLY_PB_H_MAX_SIZE meshtastic_LocalConfig_size
|
#define MESHTASTIC_MESHTASTIC_LOCALONLY_PB_H_MAX_SIZE meshtastic_LocalConfig_size
|
||||||
#define meshtastic_LocalConfig_size 747
|
#define meshtastic_LocalConfig_size 747
|
||||||
#define meshtastic_LocalModuleConfig_size 671
|
#define meshtastic_LocalModuleConfig_size 669
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
} /* extern "C" */
|
} /* extern "C" */
|
||||||
|
|||||||
@@ -272,8 +272,6 @@ typedef enum _meshtastic_HardwareModel {
|
|||||||
meshtastic_HardwareModel_HELTEC_MESH_SOLAR = 108,
|
meshtastic_HardwareModel_HELTEC_MESH_SOLAR = 108,
|
||||||
/* Lilygo T-Echo Lite */
|
/* Lilygo T-Echo Lite */
|
||||||
meshtastic_HardwareModel_T_ECHO_LITE = 109,
|
meshtastic_HardwareModel_T_ECHO_LITE = 109,
|
||||||
/* New Heltec LoRA32 with ESP32-S3 CPU */
|
|
||||||
meshtastic_HardwareModel_HELTEC_V4 = 110,
|
|
||||||
/* ------------------------------------------------------------------------------------------------------------------------------------------
|
/* ------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
Reserved ID For developing private Ports. These will show up in live traffic sparsely, so we can use a high number. Keep it within 8 bits.
|
Reserved ID For developing private Ports. These will show up in live traffic sparsely, so we can use a high number. Keep it within 8 bits.
|
||||||
------------------------------------------------------------------------------------------------------------------------------------------ */
|
------------------------------------------------------------------------------------------------------------------------------------------ */
|
||||||
|
|||||||
@@ -317,9 +317,6 @@ typedef struct _meshtastic_ModuleConfig_RangeTestConfig {
|
|||||||
/* Bool value indicating that this node should save a RangeTest.csv file.
|
/* Bool value indicating that this node should save a RangeTest.csv file.
|
||||||
ESP32 Only */
|
ESP32 Only */
|
||||||
bool save;
|
bool save;
|
||||||
/* Bool indicating that the node should cleanup / destroy it's RangeTest.csv file.
|
|
||||||
ESP32 Only */
|
|
||||||
bool clear_on_reboot;
|
|
||||||
} meshtastic_ModuleConfig_RangeTestConfig;
|
} meshtastic_ModuleConfig_RangeTestConfig;
|
||||||
|
|
||||||
/* Configuration for both device and environment metrics */
|
/* Configuration for both device and environment metrics */
|
||||||
@@ -522,7 +519,7 @@ extern "C" {
|
|||||||
#define meshtastic_ModuleConfig_SerialConfig_init_default {0, 0, 0, 0, _meshtastic_ModuleConfig_SerialConfig_Serial_Baud_MIN, 0, _meshtastic_ModuleConfig_SerialConfig_Serial_Mode_MIN, 0}
|
#define meshtastic_ModuleConfig_SerialConfig_init_default {0, 0, 0, 0, _meshtastic_ModuleConfig_SerialConfig_Serial_Baud_MIN, 0, _meshtastic_ModuleConfig_SerialConfig_Serial_Mode_MIN, 0}
|
||||||
#define meshtastic_ModuleConfig_ExternalNotificationConfig_init_default {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
#define meshtastic_ModuleConfig_ExternalNotificationConfig_init_default {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||||
#define meshtastic_ModuleConfig_StoreForwardConfig_init_default {0, 0, 0, 0, 0, 0}
|
#define meshtastic_ModuleConfig_StoreForwardConfig_init_default {0, 0, 0, 0, 0, 0}
|
||||||
#define meshtastic_ModuleConfig_RangeTestConfig_init_default {0, 0, 0, 0}
|
#define meshtastic_ModuleConfig_RangeTestConfig_init_default {0, 0, 0}
|
||||||
#define meshtastic_ModuleConfig_TelemetryConfig_init_default {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
#define meshtastic_ModuleConfig_TelemetryConfig_init_default {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||||
#define meshtastic_ModuleConfig_CannedMessageConfig_init_default {0, 0, 0, 0, _meshtastic_ModuleConfig_CannedMessageConfig_InputEventChar_MIN, _meshtastic_ModuleConfig_CannedMessageConfig_InputEventChar_MIN, _meshtastic_ModuleConfig_CannedMessageConfig_InputEventChar_MIN, 0, 0, "", 0}
|
#define meshtastic_ModuleConfig_CannedMessageConfig_init_default {0, 0, 0, 0, _meshtastic_ModuleConfig_CannedMessageConfig_InputEventChar_MIN, _meshtastic_ModuleConfig_CannedMessageConfig_InputEventChar_MIN, _meshtastic_ModuleConfig_CannedMessageConfig_InputEventChar_MIN, 0, 0, "", 0}
|
||||||
#define meshtastic_ModuleConfig_AmbientLightingConfig_init_default {0, 0, 0, 0, 0}
|
#define meshtastic_ModuleConfig_AmbientLightingConfig_init_default {0, 0, 0, 0, 0}
|
||||||
@@ -538,7 +535,7 @@ extern "C" {
|
|||||||
#define meshtastic_ModuleConfig_SerialConfig_init_zero {0, 0, 0, 0, _meshtastic_ModuleConfig_SerialConfig_Serial_Baud_MIN, 0, _meshtastic_ModuleConfig_SerialConfig_Serial_Mode_MIN, 0}
|
#define meshtastic_ModuleConfig_SerialConfig_init_zero {0, 0, 0, 0, _meshtastic_ModuleConfig_SerialConfig_Serial_Baud_MIN, 0, _meshtastic_ModuleConfig_SerialConfig_Serial_Mode_MIN, 0}
|
||||||
#define meshtastic_ModuleConfig_ExternalNotificationConfig_init_zero {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
#define meshtastic_ModuleConfig_ExternalNotificationConfig_init_zero {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||||
#define meshtastic_ModuleConfig_StoreForwardConfig_init_zero {0, 0, 0, 0, 0, 0}
|
#define meshtastic_ModuleConfig_StoreForwardConfig_init_zero {0, 0, 0, 0, 0, 0}
|
||||||
#define meshtastic_ModuleConfig_RangeTestConfig_init_zero {0, 0, 0, 0}
|
#define meshtastic_ModuleConfig_RangeTestConfig_init_zero {0, 0, 0}
|
||||||
#define meshtastic_ModuleConfig_TelemetryConfig_init_zero {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
#define meshtastic_ModuleConfig_TelemetryConfig_init_zero {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||||
#define meshtastic_ModuleConfig_CannedMessageConfig_init_zero {0, 0, 0, 0, _meshtastic_ModuleConfig_CannedMessageConfig_InputEventChar_MIN, _meshtastic_ModuleConfig_CannedMessageConfig_InputEventChar_MIN, _meshtastic_ModuleConfig_CannedMessageConfig_InputEventChar_MIN, 0, 0, "", 0}
|
#define meshtastic_ModuleConfig_CannedMessageConfig_init_zero {0, 0, 0, 0, _meshtastic_ModuleConfig_CannedMessageConfig_InputEventChar_MIN, _meshtastic_ModuleConfig_CannedMessageConfig_InputEventChar_MIN, _meshtastic_ModuleConfig_CannedMessageConfig_InputEventChar_MIN, 0, 0, "", 0}
|
||||||
#define meshtastic_ModuleConfig_AmbientLightingConfig_init_zero {0, 0, 0, 0, 0}
|
#define meshtastic_ModuleConfig_AmbientLightingConfig_init_zero {0, 0, 0, 0, 0}
|
||||||
@@ -613,7 +610,6 @@ extern "C" {
|
|||||||
#define meshtastic_ModuleConfig_RangeTestConfig_enabled_tag 1
|
#define meshtastic_ModuleConfig_RangeTestConfig_enabled_tag 1
|
||||||
#define meshtastic_ModuleConfig_RangeTestConfig_sender_tag 2
|
#define meshtastic_ModuleConfig_RangeTestConfig_sender_tag 2
|
||||||
#define meshtastic_ModuleConfig_RangeTestConfig_save_tag 3
|
#define meshtastic_ModuleConfig_RangeTestConfig_save_tag 3
|
||||||
#define meshtastic_ModuleConfig_RangeTestConfig_clear_on_reboot_tag 4
|
|
||||||
#define meshtastic_ModuleConfig_TelemetryConfig_device_update_interval_tag 1
|
#define meshtastic_ModuleConfig_TelemetryConfig_device_update_interval_tag 1
|
||||||
#define meshtastic_ModuleConfig_TelemetryConfig_environment_update_interval_tag 2
|
#define meshtastic_ModuleConfig_TelemetryConfig_environment_update_interval_tag 2
|
||||||
#define meshtastic_ModuleConfig_TelemetryConfig_environment_measurement_enabled_tag 3
|
#define meshtastic_ModuleConfig_TelemetryConfig_environment_measurement_enabled_tag 3
|
||||||
@@ -807,8 +803,7 @@ X(a, STATIC, SINGULAR, BOOL, is_server, 6)
|
|||||||
#define meshtastic_ModuleConfig_RangeTestConfig_FIELDLIST(X, a) \
|
#define meshtastic_ModuleConfig_RangeTestConfig_FIELDLIST(X, a) \
|
||||||
X(a, STATIC, SINGULAR, BOOL, enabled, 1) \
|
X(a, STATIC, SINGULAR, BOOL, enabled, 1) \
|
||||||
X(a, STATIC, SINGULAR, UINT32, sender, 2) \
|
X(a, STATIC, SINGULAR, UINT32, sender, 2) \
|
||||||
X(a, STATIC, SINGULAR, BOOL, save, 3) \
|
X(a, STATIC, SINGULAR, BOOL, save, 3)
|
||||||
X(a, STATIC, SINGULAR, BOOL, clear_on_reboot, 4)
|
|
||||||
#define meshtastic_ModuleConfig_RangeTestConfig_CALLBACK NULL
|
#define meshtastic_ModuleConfig_RangeTestConfig_CALLBACK NULL
|
||||||
#define meshtastic_ModuleConfig_RangeTestConfig_DEFAULT NULL
|
#define meshtastic_ModuleConfig_RangeTestConfig_DEFAULT NULL
|
||||||
|
|
||||||
@@ -906,7 +901,7 @@ extern const pb_msgdesc_t meshtastic_RemoteHardwarePin_msg;
|
|||||||
#define meshtastic_ModuleConfig_MapReportSettings_size 14
|
#define meshtastic_ModuleConfig_MapReportSettings_size 14
|
||||||
#define meshtastic_ModuleConfig_NeighborInfoConfig_size 10
|
#define meshtastic_ModuleConfig_NeighborInfoConfig_size 10
|
||||||
#define meshtastic_ModuleConfig_PaxcounterConfig_size 30
|
#define meshtastic_ModuleConfig_PaxcounterConfig_size 30
|
||||||
#define meshtastic_ModuleConfig_RangeTestConfig_size 12
|
#define meshtastic_ModuleConfig_RangeTestConfig_size 10
|
||||||
#define meshtastic_ModuleConfig_RemoteHardwareConfig_size 96
|
#define meshtastic_ModuleConfig_RemoteHardwareConfig_size 96
|
||||||
#define meshtastic_ModuleConfig_SerialConfig_size 28
|
#define meshtastic_ModuleConfig_SerialConfig_size 28
|
||||||
#define meshtastic_ModuleConfig_StoreForwardConfig_size 24
|
#define meshtastic_ModuleConfig_StoreForwardConfig_size 24
|
||||||
|
|||||||
@@ -342,11 +342,6 @@ void handleFsBrowseStatic(HTTPRequest *req, HTTPResponse *res)
|
|||||||
res->print(value->Stringify().c_str());
|
res->print(value->Stringify().c_str());
|
||||||
|
|
||||||
delete value;
|
delete value;
|
||||||
|
|
||||||
// Clean up the fileList to prevent memory leak
|
|
||||||
for (auto *val : fileList) {
|
|
||||||
delete val;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void handleFsDeleteStatic(HTTPRequest *req, HTTPResponse *res)
|
void handleFsDeleteStatic(HTTPRequest *req, HTTPResponse *res)
|
||||||
@@ -615,38 +610,33 @@ void handleReport(HTTPRequest *req, HTTPResponse *res)
|
|||||||
res->println("<pre>");
|
res->println("<pre>");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Helper lambda to create JSON array and clean up memory properly
|
|
||||||
auto createJSONArrayFromLog = [](uint32_t *logArray, int count) -> JSONValue * {
|
|
||||||
JSONArray tempArray;
|
|
||||||
for (int i = 0; i < count; i++) {
|
|
||||||
tempArray.push_back(new JSONValue((int)logArray[i]));
|
|
||||||
}
|
|
||||||
JSONValue *result = new JSONValue(tempArray);
|
|
||||||
// Clean up original array to prevent memory leak
|
|
||||||
for (auto *val : tempArray) {
|
|
||||||
delete val;
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
};
|
|
||||||
|
|
||||||
// data->airtime->tx_log
|
// data->airtime->tx_log
|
||||||
|
JSONArray txLogValues;
|
||||||
uint32_t *logArray;
|
uint32_t *logArray;
|
||||||
logArray = airTime->airtimeReport(TX_LOG);
|
logArray = airTime->airtimeReport(TX_LOG);
|
||||||
JSONValue *txLogJsonValue = createJSONArrayFromLog(logArray, airTime->getPeriodsToLog());
|
for (int i = 0; i < airTime->getPeriodsToLog(); i++) {
|
||||||
|
txLogValues.push_back(new JSONValue((int)logArray[i]));
|
||||||
|
}
|
||||||
|
|
||||||
// data->airtime->rx_log
|
// data->airtime->rx_log
|
||||||
|
JSONArray rxLogValues;
|
||||||
logArray = airTime->airtimeReport(RX_LOG);
|
logArray = airTime->airtimeReport(RX_LOG);
|
||||||
JSONValue *rxLogJsonValue = createJSONArrayFromLog(logArray, airTime->getPeriodsToLog());
|
for (int i = 0; i < airTime->getPeriodsToLog(); i++) {
|
||||||
|
rxLogValues.push_back(new JSONValue((int)logArray[i]));
|
||||||
|
}
|
||||||
|
|
||||||
// data->airtime->rx_all_log
|
// data->airtime->rx_all_log
|
||||||
|
JSONArray rxAllLogValues;
|
||||||
logArray = airTime->airtimeReport(RX_ALL_LOG);
|
logArray = airTime->airtimeReport(RX_ALL_LOG);
|
||||||
JSONValue *rxAllLogJsonValue = createJSONArrayFromLog(logArray, airTime->getPeriodsToLog());
|
for (int i = 0; i < airTime->getPeriodsToLog(); i++) {
|
||||||
|
rxAllLogValues.push_back(new JSONValue((int)logArray[i]));
|
||||||
|
}
|
||||||
|
|
||||||
// data->airtime
|
// data->airtime
|
||||||
JSONObject jsonObjAirtime;
|
JSONObject jsonObjAirtime;
|
||||||
jsonObjAirtime["tx_log"] = txLogJsonValue;
|
jsonObjAirtime["tx_log"] = new JSONValue(txLogValues);
|
||||||
jsonObjAirtime["rx_log"] = rxLogJsonValue;
|
jsonObjAirtime["rx_log"] = new JSONValue(rxLogValues);
|
||||||
jsonObjAirtime["rx_all_log"] = rxAllLogJsonValue;
|
jsonObjAirtime["rx_all_log"] = new JSONValue(rxAllLogValues);
|
||||||
jsonObjAirtime["channel_utilization"] = new JSONValue(airTime->channelUtilizationPercent());
|
jsonObjAirtime["channel_utilization"] = new JSONValue(airTime->channelUtilizationPercent());
|
||||||
jsonObjAirtime["utilization_tx"] = new JSONValue(airTime->utilizationTXPercent());
|
jsonObjAirtime["utilization_tx"] = new JSONValue(airTime->utilizationTXPercent());
|
||||||
jsonObjAirtime["seconds_since_boot"] = new JSONValue(int(airTime->getSecondsSinceBoot()));
|
jsonObjAirtime["seconds_since_boot"] = new JSONValue(int(airTime->getSecondsSinceBoot()));
|
||||||
@@ -775,11 +765,6 @@ void handleNodes(HTTPRequest *req, HTTPResponse *res)
|
|||||||
JSONValue *value = new JSONValue(jsonObjOuter);
|
JSONValue *value = new JSONValue(jsonObjOuter);
|
||||||
res->print(value->Stringify().c_str());
|
res->print(value->Stringify().c_str());
|
||||||
delete value;
|
delete value;
|
||||||
|
|
||||||
// Clean up the nodesArray to prevent memory leak
|
|
||||||
for (auto *val : nodesArray) {
|
|
||||||
delete val;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -970,10 +955,5 @@ void handleScanNetworks(HTTPRequest *req, HTTPResponse *res)
|
|||||||
JSONValue *value = new JSONValue(jsonObjOuter);
|
JSONValue *value = new JSONValue(jsonObjOuter);
|
||||||
res->print(value->Stringify().c_str());
|
res->print(value->Stringify().c_str());
|
||||||
delete value;
|
delete value;
|
||||||
|
|
||||||
// Clean up the networkObjs to prevent memory leak
|
|
||||||
for (auto *val : networkObjs) {
|
|
||||||
delete val;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -632,10 +632,10 @@ bool CannedMessageModule::handleMessageSelectorInput(const InputEvent *event, bo
|
|||||||
// Normal canned message selection
|
// Normal canned message selection
|
||||||
if (runState == CANNED_MESSAGE_RUN_STATE_INACTIVE || runState == CANNED_MESSAGE_RUN_STATE_DISABLED) {
|
if (runState == CANNED_MESSAGE_RUN_STATE_INACTIVE || runState == CANNED_MESSAGE_RUN_STATE_DISABLED) {
|
||||||
} else {
|
} else {
|
||||||
#if CANNED_MESSAGE_ADD_CONFIRMATION
|
|
||||||
// Show confirmation dialog before sending canned message
|
// Show confirmation dialog before sending canned message
|
||||||
NodeNum destNode = dest;
|
NodeNum destNode = dest;
|
||||||
ChannelIndex chan = channel;
|
ChannelIndex chan = channel;
|
||||||
|
#if CANNED_MESSAGE_ADD_CONFIRMATION
|
||||||
graphics::menuHandler::showConfirmationBanner("Send message?", [this, destNode, chan, current]() {
|
graphics::menuHandler::showConfirmationBanner("Send message?", [this, destNode, chan, current]() {
|
||||||
this->sendText(destNode, chan, current, false);
|
this->sendText(destNode, chan, current, false);
|
||||||
payload = runState;
|
payload = runState;
|
||||||
@@ -991,6 +991,7 @@ int32_t CannedMessageModule::runOnce()
|
|||||||
this->runState = CANNED_MESSAGE_RUN_STATE_INACTIVE;
|
this->runState = CANNED_MESSAGE_RUN_STATE_INACTIVE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
e.action = UIFrameEvent::Action::REGENERATE_FRAMESET;
|
||||||
this->currentMessageIndex = -1;
|
this->currentMessageIndex = -1;
|
||||||
this->freetext = "";
|
this->freetext = "";
|
||||||
this->cursor = 0;
|
this->cursor = 0;
|
||||||
|
|||||||
@@ -364,10 +364,9 @@ ExternalNotificationModule::ExternalNotificationModule()
|
|||||||
// moduleConfig.external_notification.alert_message_buzzer = true;
|
// moduleConfig.external_notification.alert_message_buzzer = true;
|
||||||
|
|
||||||
if (moduleConfig.external_notification.enabled) {
|
if (moduleConfig.external_notification.enabled) {
|
||||||
#if !defined(MESHTASTIC_EXCLUDE_INPUTBROKER)
|
|
||||||
if (inputBroker) // put our callback in the inputObserver list
|
if (inputBroker) // put our callback in the inputObserver list
|
||||||
inputObserver.observe(inputBroker);
|
inputObserver.observe(inputBroker);
|
||||||
#endif
|
|
||||||
if (nodeDB->loadProto(rtttlConfigFile, meshtastic_RTTTLConfig_size, sizeof(meshtastic_RTTTLConfig),
|
if (nodeDB->loadProto(rtttlConfigFile, meshtastic_RTTTLConfig_size, sizeof(meshtastic_RTTTLConfig),
|
||||||
&meshtastic_RTTTLConfig_msg, &rtttlConfig) != LoadFileResult::LOAD_SUCCESS) {
|
&meshtastic_RTTTLConfig_msg, &rtttlConfig) != LoadFileResult::LOAD_SUCCESS) {
|
||||||
memset(rtttlConfig.ringtone, 0, sizeof(rtttlConfig.ringtone));
|
memset(rtttlConfig.ringtone, 0, sizeof(rtttlConfig.ringtone));
|
||||||
|
|||||||
@@ -88,7 +88,7 @@
|
|||||||
#include "modules/StoreForwardModule.h"
|
#include "modules/StoreForwardModule.h"
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(ARCH_ESP32) || defined(ARCH_NRF52) || defined(ARCH_RP2040) || defined(ARCH_PORTDUINO)
|
||||||
#if !MESHTASTIC_EXCLUDE_EXTERNALNOTIFICATION
|
#if !MESHTASTIC_EXCLUDE_EXTERNALNOTIFICATION
|
||||||
#include "modules/ExternalNotificationModule.h"
|
#include "modules/ExternalNotificationModule.h"
|
||||||
#endif
|
#endif
|
||||||
@@ -98,11 +98,16 @@
|
|||||||
#if !defined(CONFIG_IDF_TARGET_ESP32S2) && !MESHTASTIC_EXCLUDE_SERIAL
|
#if !defined(CONFIG_IDF_TARGET_ESP32S2) && !MESHTASTIC_EXCLUDE_SERIAL
|
||||||
#include "modules/SerialModule.h"
|
#include "modules/SerialModule.h"
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#if !MESHTASTIC_EXCLUDE_DROPZONE
|
#if !MESHTASTIC_EXCLUDE_DROPZONE
|
||||||
#include "modules/DropzoneModule.h"
|
#include "modules/DropzoneModule.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if !MESHTASTIC_EXCLUDE_ZPS
|
||||||
|
#include "modules/esp32/ZPSModule.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create module instances here. If you are adding a new module, you must 'new' it here (or somewhere else)
|
* Create module instances here. If you are adding a new module, you must 'new' it here (or somewhere else)
|
||||||
*/
|
*/
|
||||||
@@ -141,10 +146,7 @@ void setupModules()
|
|||||||
detectionSensorModule = new DetectionSensorModule();
|
detectionSensorModule = new DetectionSensorModule();
|
||||||
#endif
|
#endif
|
||||||
#if !MESHTASTIC_EXCLUDE_ATAK
|
#if !MESHTASTIC_EXCLUDE_ATAK
|
||||||
if (IS_ONE_OF(config.device.role, meshtastic_Config_DeviceConfig_Role_TAK,
|
atakPluginModule = new AtakPluginModule();
|
||||||
meshtastic_Config_DeviceConfig_Role_TAK_TRACKER)) {
|
|
||||||
atakPluginModule = new AtakPluginModule();
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
#if !MESHTASTIC_EXCLUDE_PKI
|
#if !MESHTASTIC_EXCLUDE_PKI
|
||||||
keyVerificationModule = new KeyVerificationModule();
|
keyVerificationModule = new KeyVerificationModule();
|
||||||
@@ -152,6 +154,9 @@ void setupModules()
|
|||||||
#if !MESHTASTIC_EXCLUDE_DROPZONE
|
#if !MESHTASTIC_EXCLUDE_DROPZONE
|
||||||
dropzoneModule = new DropzoneModule();
|
dropzoneModule = new DropzoneModule();
|
||||||
#endif
|
#endif
|
||||||
|
#if !MESHTASTIC_EXCLUDE_ZPS
|
||||||
|
zpsModule = new ZPSModule();
|
||||||
|
#endif
|
||||||
#if !MESHTASTIC_EXCLUDE_GENERIC_THREAD_MODULE
|
#if !MESHTASTIC_EXCLUDE_GENERIC_THREAD_MODULE
|
||||||
new GenericThreadModule();
|
new GenericThreadModule();
|
||||||
#endif
|
#endif
|
||||||
@@ -248,8 +253,8 @@ void setupModules()
|
|||||||
#if HAS_TELEMETRY && !MESHTASTIC_EXCLUDE_POWER_TELEMETRY && !MESHTASTIC_EXCLUDE_ENVIRONMENTAL_SENSOR
|
#if HAS_TELEMETRY && !MESHTASTIC_EXCLUDE_POWER_TELEMETRY && !MESHTASTIC_EXCLUDE_ENVIRONMENTAL_SENSOR
|
||||||
new PowerTelemetryModule();
|
new PowerTelemetryModule();
|
||||||
#endif
|
#endif
|
||||||
#if (defined(ARCH_ESP32) || defined(ARCH_NRF52) || defined(ARCH_RP2040) || defined(ARCH_STM32WL)) && \
|
#if (defined(ARCH_ESP32) || defined(ARCH_NRF52) || defined(ARCH_RP2040)) && !defined(CONFIG_IDF_TARGET_ESP32S2) && \
|
||||||
!defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32C3)
|
!defined(CONFIG_IDF_TARGET_ESP32C3)
|
||||||
#if !MESHTASTIC_EXCLUDE_SERIAL
|
#if !MESHTASTIC_EXCLUDE_SERIAL
|
||||||
if (config.display.displaymode != meshtastic_Config_DisplayConfig_DisplayMode_COLOR) {
|
if (config.display.displaymode != meshtastic_Config_DisplayConfig_DisplayMode_COLOR) {
|
||||||
new SerialModule();
|
new SerialModule();
|
||||||
@@ -270,11 +275,13 @@ void setupModules()
|
|||||||
storeForwardModule = new StoreForwardModule();
|
storeForwardModule = new StoreForwardModule();
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(ARCH_ESP32) || defined(ARCH_NRF52) || defined(ARCH_RP2040) || defined(ARCH_PORTDUINO)
|
||||||
#if !MESHTASTIC_EXCLUDE_EXTERNALNOTIFICATION
|
#if !MESHTASTIC_EXCLUDE_EXTERNALNOTIFICATION
|
||||||
externalNotificationModule = new ExternalNotificationModule();
|
externalNotificationModule = new ExternalNotificationModule();
|
||||||
#endif
|
#endif
|
||||||
#if !MESHTASTIC_EXCLUDE_RANGETEST && !MESHTASTIC_EXCLUDE_GPS
|
#if !MESHTASTIC_EXCLUDE_RANGETEST && !MESHTASTIC_EXCLUDE_GPS
|
||||||
new RangeTestModule();
|
new RangeTestModule();
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
#if !MESHTASTIC_EXCLUDE_ADMIN
|
#if !MESHTASTIC_EXCLUDE_ADMIN
|
||||||
|
|||||||
@@ -105,15 +105,14 @@ void NeighborInfoModule::sendNeighborInfo(NodeNum dest, bool wantReplies)
|
|||||||
{
|
{
|
||||||
meshtastic_NeighborInfo neighborInfo = meshtastic_NeighborInfo_init_zero;
|
meshtastic_NeighborInfo neighborInfo = meshtastic_NeighborInfo_init_zero;
|
||||||
collectNeighborInfo(&neighborInfo);
|
collectNeighborInfo(&neighborInfo);
|
||||||
// only send neighbours if we have some to send
|
meshtastic_MeshPacket *p = allocDataProtobuf(neighborInfo);
|
||||||
if (neighborInfo.neighbors_count > 0) {
|
// send regardless of whether or not we have neighbors in our DB,
|
||||||
meshtastic_MeshPacket *p = allocDataProtobuf(neighborInfo);
|
// because we want to get neighbors for the next cycle
|
||||||
p->to = dest;
|
p->to = dest;
|
||||||
p->decoded.want_response = wantReplies;
|
p->decoded.want_response = wantReplies;
|
||||||
p->priority = meshtastic_MeshPacket_Priority_BACKGROUND;
|
p->priority = meshtastic_MeshPacket_Priority_BACKGROUND;
|
||||||
printNeighborInfo("SENDING", &neighborInfo);
|
printNeighborInfo("SENDING", &neighborInfo);
|
||||||
service->sendToMesh(p, RX_SRC_LOCAL, true);
|
service->sendToMesh(p, RX_SRC_LOCAL, true);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -215,4 +214,4 @@ meshtastic_Neighbor *NeighborInfoModule::getOrCreateNeighbor(NodeNum originalSen
|
|||||||
neighbors.push_back(new_nbr);
|
neighbors.push_back(new_nbr);
|
||||||
}
|
}
|
||||||
return &neighbors.back();
|
return &neighbors.back();
|
||||||
}
|
}
|
||||||
@@ -31,7 +31,7 @@ uint32_t packetSequence = 0;
|
|||||||
|
|
||||||
int32_t RangeTestModule::runOnce()
|
int32_t RangeTestModule::runOnce()
|
||||||
{
|
{
|
||||||
#if defined(ARCH_ESP32) || defined(ARCH_NRF52) || defined(ARCH_STM32WL) || defined(ARCH_PORTDUINO)
|
#if defined(ARCH_ESP32) || defined(ARCH_NRF52) || defined(ARCH_PORTDUINO)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Uncomment the preferences below if you want to use the module
|
Uncomment the preferences below if you want to use the module
|
||||||
@@ -130,7 +130,7 @@ void RangeTestModuleRadio::sendPayload(NodeNum dest, bool wantReplies)
|
|||||||
|
|
||||||
ProcessMessage RangeTestModuleRadio::handleReceived(const meshtastic_MeshPacket &mp)
|
ProcessMessage RangeTestModuleRadio::handleReceived(const meshtastic_MeshPacket &mp)
|
||||||
{
|
{
|
||||||
#if defined(ARCH_ESP32) || defined(ARCH_NRF52) || defined(ARCH_STM32WL) || defined(ARCH_PORTDUINO)
|
#if defined(ARCH_ESP32) || defined(ARCH_NRF52) || defined(ARCH_PORTDUINO)
|
||||||
|
|
||||||
if (moduleConfig.range_test.enabled) {
|
if (moduleConfig.range_test.enabled) {
|
||||||
|
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ uint8_t RoutingModule::getHopLimitForResponse(uint8_t hopStart, uint8_t hopLimit
|
|||||||
return Default::getConfiguredOrDefaultHopLimit(config.lora.hop_limit); // Use the default hop limit
|
return Default::getConfiguredOrDefaultHopLimit(config.lora.hop_limit); // Use the default hop limit
|
||||||
}
|
}
|
||||||
|
|
||||||
RoutingModule::RoutingModule() : ProtobufModule("routing", meshtastic_PortNum_ROUTING_APP, &meshtastic_Routing_msg)
|
RoutingModule::RoutingModule() : ProtobufModule(ROUTING_MODULE, meshtastic_PortNum_ROUTING_APP, &meshtastic_Routing_msg)
|
||||||
{
|
{
|
||||||
isPromiscuous = true;
|
isPromiscuous = true;
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,8 @@
|
|||||||
#include "Channels.h"
|
#include "Channels.h"
|
||||||
#include "ProtobufModule.h"
|
#include "ProtobufModule.h"
|
||||||
|
|
||||||
|
static const char *ROUTING_MODULE = "routing";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Routing module for router control messages
|
* Routing module for router control messages
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -49,8 +49,8 @@
|
|||||||
#include "meshSolarApp.h"
|
#include "meshSolarApp.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (defined(ARCH_ESP32) || defined(ARCH_NRF52) || defined(ARCH_RP2040) || defined(ARCH_STM32WL)) && \
|
#if (defined(ARCH_ESP32) || defined(ARCH_NRF52) || defined(ARCH_RP2040)) && !defined(CONFIG_IDF_TARGET_ESP32S2) && \
|
||||||
!defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32C3)
|
!defined(CONFIG_IDF_TARGET_ESP32C3)
|
||||||
|
|
||||||
#define RX_BUFFER 256
|
#define RX_BUFFER 256
|
||||||
#define TIMEOUT 250
|
#define TIMEOUT 250
|
||||||
@@ -67,7 +67,7 @@ SerialModuleRadio *serialModuleRadio;
|
|||||||
defined(ELECROW_ThinkNode_M5) || defined(HELTEC_MESH_SOLAR) || defined(T_ECHO_LITE)
|
defined(ELECROW_ThinkNode_M5) || defined(HELTEC_MESH_SOLAR) || defined(T_ECHO_LITE)
|
||||||
SerialModule::SerialModule() : StreamAPI(&Serial), concurrency::OSThread("Serial") {}
|
SerialModule::SerialModule() : StreamAPI(&Serial), concurrency::OSThread("Serial") {}
|
||||||
static Print *serialPrint = &Serial;
|
static Print *serialPrint = &Serial;
|
||||||
#elif defined(CONFIG_IDF_TARGET_ESP32C6) || defined(RAK3172)
|
#elif defined(CONFIG_IDF_TARGET_ESP32C6)
|
||||||
SerialModule::SerialModule() : StreamAPI(&Serial1), concurrency::OSThread("Serial") {}
|
SerialModule::SerialModule() : StreamAPI(&Serial1), concurrency::OSThread("Serial") {}
|
||||||
static Print *serialPrint = &Serial1;
|
static Print *serialPrint = &Serial1;
|
||||||
#else
|
#else
|
||||||
@@ -173,18 +173,7 @@ int32_t SerialModule::runOnce()
|
|||||||
Serial.begin(baud);
|
Serial.begin(baud);
|
||||||
Serial.setTimeout(moduleConfig.serial.timeout > 0 ? moduleConfig.serial.timeout : TIMEOUT);
|
Serial.setTimeout(moduleConfig.serial.timeout > 0 ? moduleConfig.serial.timeout : TIMEOUT);
|
||||||
}
|
}
|
||||||
#elif defined(ARCH_STM32WL)
|
|
||||||
#ifndef RAK3172
|
|
||||||
HardwareSerial *serialInstance = &Serial2;
|
|
||||||
#else
|
|
||||||
HardwareSerial *serialInstance = &Serial1;
|
|
||||||
#endif
|
|
||||||
if (moduleConfig.serial.rxd && moduleConfig.serial.txd) {
|
|
||||||
serialInstance->setTx(moduleConfig.serial.txd);
|
|
||||||
serialInstance->setRx(moduleConfig.serial.rxd);
|
|
||||||
}
|
|
||||||
serialInstance->begin(baud);
|
|
||||||
serialInstance->setTimeout(moduleConfig.serial.timeout > 0 ? moduleConfig.serial.timeout : TIMEOUT);
|
|
||||||
#elif defined(ARCH_ESP32)
|
#elif defined(ARCH_ESP32)
|
||||||
|
|
||||||
if (moduleConfig.serial.rxd && moduleConfig.serial.txd) {
|
if (moduleConfig.serial.rxd && moduleConfig.serial.txd) {
|
||||||
@@ -271,13 +260,8 @@ int32_t SerialModule::runOnce()
|
|||||||
while (Serial1.available()) {
|
while (Serial1.available()) {
|
||||||
serialPayloadSize = Serial1.readBytes(serialBytes, meshtastic_Constants_DATA_PAYLOAD_LEN);
|
serialPayloadSize = Serial1.readBytes(serialBytes, meshtastic_Constants_DATA_PAYLOAD_LEN);
|
||||||
#else
|
#else
|
||||||
#ifndef RAK3172
|
while (Serial2.available()) {
|
||||||
HardwareSerial *serialInstance = &Serial2;
|
serialPayloadSize = Serial2.readBytes(serialBytes, meshtastic_Constants_DATA_PAYLOAD_LEN);
|
||||||
#else
|
|
||||||
HardwareSerial *serialInstance = &Serial1;
|
|
||||||
#endif
|
|
||||||
while (serialInstance->available()) {
|
|
||||||
serialPayloadSize = serialInstance->readBytes(serialBytes, meshtastic_Constants_DATA_PAYLOAD_LEN);
|
|
||||||
#endif
|
#endif
|
||||||
serialModuleRadio->sendPayload();
|
serialModuleRadio->sendPayload();
|
||||||
}
|
}
|
||||||
@@ -527,7 +511,7 @@ ParsedLine parseLine(const char *line)
|
|||||||
void SerialModule::processWXSerial()
|
void SerialModule::processWXSerial()
|
||||||
{
|
{
|
||||||
#if !defined(TTGO_T_ECHO) && !defined(T_ECHO_LITE) && !defined(CANARYONE) && !defined(CONFIG_IDF_TARGET_ESP32C6) && \
|
#if !defined(TTGO_T_ECHO) && !defined(T_ECHO_LITE) && !defined(CANARYONE) && !defined(CONFIG_IDF_TARGET_ESP32C6) && \
|
||||||
!defined(MESHLINK) && !defined(ELECROW_ThinkNode_M1) && !defined(ELECROW_ThinkNode_M5) && !defined(ARCH_STM32WL)
|
!defined(MESHLINK) && !defined(ELECROW_ThinkNode_M1) && !defined(ELECROW_ThinkNode_M5)
|
||||||
static unsigned int lastAveraged = 0;
|
static unsigned int lastAveraged = 0;
|
||||||
static unsigned int averageIntervalMillis = 300000; // 5 minutes hard coded.
|
static unsigned int averageIntervalMillis = 300000; // 5 minutes hard coded.
|
||||||
static double dir_sum_sin = 0;
|
static double dir_sum_sin = 0;
|
||||||
|
|||||||
@@ -8,8 +8,8 @@
|
|||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
|
|
||||||
#if (defined(ARCH_ESP32) || defined(ARCH_NRF52) || defined(ARCH_RP2040) || defined(ARCH_STM32WL)) && \
|
#if (defined(ARCH_ESP32) || defined(ARCH_NRF52) || defined(ARCH_RP2040)) && !defined(CONFIG_IDF_TARGET_ESP32S2) && \
|
||||||
!defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32C3)
|
!defined(CONFIG_IDF_TARGET_ESP32C3)
|
||||||
|
|
||||||
class SerialModule : public StreamAPI, private concurrency::OSThread
|
class SerialModule : public StreamAPI, private concurrency::OSThread
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -198,13 +198,6 @@ T1000xSensor t1000xSensor;
|
|||||||
IndicatorSensor indicatorSensor;
|
IndicatorSensor indicatorSensor;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if __has_include(<Adafruit_TSL2561_U.h>)
|
|
||||||
#include "Sensor/TSL2561Sensor.h"
|
|
||||||
TSL2561Sensor tsl2561Sensor;
|
|
||||||
#else
|
|
||||||
NullSensor tsl2561Sensor;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define FAILED_STATE_SENSOR_READ_MULTIPLIER 10
|
#define FAILED_STATE_SENSOR_READ_MULTIPLIER 10
|
||||||
#define DISPLAY_RECEIVEID_MEASUREMENTS_ON_SCREEN true
|
#define DISPLAY_RECEIVEID_MEASUREMENTS_ON_SCREEN true
|
||||||
|
|
||||||
@@ -303,8 +296,6 @@ int32_t EnvironmentTelemetryModule::runOnce()
|
|||||||
result = max17048Sensor.runOnce();
|
result = max17048Sensor.runOnce();
|
||||||
if (cgRadSens.hasSensor())
|
if (cgRadSens.hasSensor())
|
||||||
result = cgRadSens.runOnce();
|
result = cgRadSens.runOnce();
|
||||||
if (tsl2561Sensor.hasSensor())
|
|
||||||
result = tsl2561Sensor.runOnce();
|
|
||||||
if (pct2075Sensor.hasSensor())
|
if (pct2075Sensor.hasSensor())
|
||||||
result = pct2075Sensor.runOnce();
|
result = pct2075Sensor.runOnce();
|
||||||
// this only works on the wismesh hub with the solar option. This is not an I2C sensor, so we don't need the
|
// this only works on the wismesh hub with the solar option. This is not an I2C sensor, so we don't need the
|
||||||
@@ -651,10 +642,6 @@ bool EnvironmentTelemetryModule::getEnvironmentTelemetry(meshtastic_Telemetry *m
|
|||||||
valid = valid && nau7802Sensor.getMetrics(m);
|
valid = valid && nau7802Sensor.getMetrics(m);
|
||||||
hasSensor = true;
|
hasSensor = true;
|
||||||
}
|
}
|
||||||
if (tsl2561Sensor.hasSensor()) {
|
|
||||||
valid = valid && tsl2561Sensor.getMetrics(m);
|
|
||||||
hasSensor = true;
|
|
||||||
}
|
|
||||||
if (aht10Sensor.hasSensor()) {
|
if (aht10Sensor.hasSensor()) {
|
||||||
if (!bmp280Sensor.hasSensor() && !bmp3xxSensor.hasSensor()) {
|
if (!bmp280Sensor.hasSensor() && !bmp3xxSensor.hasSensor()) {
|
||||||
valid = valid && aht10Sensor.getMetrics(m);
|
valid = valid && aht10Sensor.getMetrics(m);
|
||||||
|
|||||||
@@ -1,41 +0,0 @@
|
|||||||
#include "configuration.h"
|
|
||||||
|
|
||||||
#if !MESHTASTIC_EXCLUDE_ENVIRONMENTAL_SENSOR && __has_include(<Adafruit_TSL2561_U.h>)
|
|
||||||
|
|
||||||
#include "../mesh/generated/meshtastic/telemetry.pb.h"
|
|
||||||
#include "TSL2561Sensor.h"
|
|
||||||
#include "TelemetrySensor.h"
|
|
||||||
#include <Adafruit_TSL2561_U.h>
|
|
||||||
|
|
||||||
TSL2561Sensor::TSL2561Sensor() : TelemetrySensor(meshtastic_TelemetrySensorType_TSL2561, "TSL2561") {}
|
|
||||||
|
|
||||||
int32_t TSL2561Sensor::runOnce()
|
|
||||||
{
|
|
||||||
LOG_INFO("Init sensor: %s", sensorName);
|
|
||||||
if (!hasSensor()) {
|
|
||||||
return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS;
|
|
||||||
}
|
|
||||||
|
|
||||||
status = tsl.begin(nodeTelemetrySensorsMap[sensorType].second);
|
|
||||||
|
|
||||||
return initI2CSensor();
|
|
||||||
}
|
|
||||||
|
|
||||||
void TSL2561Sensor::setup()
|
|
||||||
{
|
|
||||||
tsl.setGain(TSL2561_GAIN_1X);
|
|
||||||
tsl.setIntegrationTime(TSL2561_INTEGRATIONTIME_101MS);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool TSL2561Sensor::getMetrics(meshtastic_Telemetry *measurement)
|
|
||||||
{
|
|
||||||
measurement->variant.environment_metrics.has_lux = true;
|
|
||||||
sensors_event_t event;
|
|
||||||
tsl.getEvent(&event);
|
|
||||||
measurement->variant.environment_metrics.lux = event.light;
|
|
||||||
LOG_INFO("Lux: %f", measurement->variant.environment_metrics.lux);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
#include "configuration.h"
|
|
||||||
|
|
||||||
#if !MESHTASTIC_EXCLUDE_ENVIRONMENTAL_SENSOR && __has_include(<Adafruit_TSL2561_U.h>)
|
|
||||||
|
|
||||||
#include "../mesh/generated/meshtastic/telemetry.pb.h"
|
|
||||||
#include "TelemetrySensor.h"
|
|
||||||
#include <Adafruit_TSL2561_U.h>
|
|
||||||
|
|
||||||
class TSL2561Sensor : public TelemetrySensor
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
// The magic number is a sensor id, the actual value doesn't matter
|
|
||||||
Adafruit_TSL2561_Unified tsl = Adafruit_TSL2561_Unified(TSL2561_ADDR_LOW, 12345);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
virtual void setup() override;
|
|
||||||
|
|
||||||
public:
|
|
||||||
TSL2561Sensor();
|
|
||||||
virtual int32_t runOnce() override;
|
|
||||||
virtual bool getMetrics(meshtastic_Telemetry *measurement) override;
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
419
src/modules/esp32/ZPSModule.cpp
Normal file
419
src/modules/esp32/ZPSModule.cpp
Normal file
@@ -0,0 +1,419 @@
|
|||||||
|
/*
|
||||||
|
* ZPS - Zero-GPS Positioning System for standalone Meshtastic devices
|
||||||
|
* - experimental tools for estimating own position without a GPS -
|
||||||
|
*
|
||||||
|
* Copyright 2021 all rights reserved by https://github.com/a-f-G-U-C
|
||||||
|
* Released under GPL v3 (see LICENSE file for details)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ZPSModule.h"
|
||||||
|
#include "Default.h"
|
||||||
|
#include "MeshService.h"
|
||||||
|
#include "NodeDB.h"
|
||||||
|
#include "NodeStatus.h"
|
||||||
|
#include "Router.h"
|
||||||
|
#include "configuration.h"
|
||||||
|
#include "gps/RTC.h"
|
||||||
|
#include <WiFi.h>
|
||||||
|
|
||||||
|
#if !defined(MESHTASTIC_EXCLUDE_BLUETOOTH)
|
||||||
|
|
||||||
|
#include "NimBLEDevice.h"
|
||||||
|
|
||||||
|
#define BLE_MAX_REC 15
|
||||||
|
#define BLE_NO_RESULTS -1 // Indicates a BLE scan is in progress
|
||||||
|
|
||||||
|
uint8_t bleCounter = 0; // used internally by the ble scanner
|
||||||
|
uint64_t bleResult[BLE_MAX_REC + 1];
|
||||||
|
int bleResSize = BLE_NO_RESULTS;
|
||||||
|
|
||||||
|
uint64_t scanStart = 0;
|
||||||
|
|
||||||
|
ZPSModule *zpsModule;
|
||||||
|
|
||||||
|
// Mini BLE scanner, NIMBLE based and modelled loosely after the Wifi scanner
|
||||||
|
static int ble_scan(uint32_t duration, bool passive = true, bool dedup = true);
|
||||||
|
|
||||||
|
// ZPSModule::ZPSModule()
|
||||||
|
// : ProtobufModule("ZPS", ZPS_PORTNUM, Position_fields), concurrency::OSThread("ZPSModule")
|
||||||
|
ZPSModule::ZPSModule() : SinglePortModule("ZPS", ZPS_PORTNUM), concurrency::OSThread("ZPSModule")
|
||||||
|
{
|
||||||
|
setIntervalFromNow(ZPS_STARTUP_DELAY); // Delay startup by 10 seconds, no need to race :)
|
||||||
|
|
||||||
|
wantBSS = true;
|
||||||
|
wantBLE = true;
|
||||||
|
|
||||||
|
WiFi.mode(WIFI_STA);
|
||||||
|
WiFi.disconnect();
|
||||||
|
WiFi.scanNetworks(true, true); // nonblock, showhidden
|
||||||
|
scanState = SCAN_BSS_RUN;
|
||||||
|
}
|
||||||
|
|
||||||
|
ProcessMessage ZPSModule::handleReceived(const meshtastic_MeshPacket &mp)
|
||||||
|
{
|
||||||
|
meshtastic_Position pos = meshtastic_Position_init_default;
|
||||||
|
|
||||||
|
auto &pd = mp.decoded;
|
||||||
|
uint8_t nRecs = pd.payload.size >> 3;
|
||||||
|
|
||||||
|
LOG_DEBUG("handleReceived %s 0x%0x->0x%0x, id=0x%x, port=%d, len=%d, rec=%d\n", name, mp.from, mp.to, mp.id, pd.portnum,
|
||||||
|
pd.payload.size, nRecs);
|
||||||
|
if (nRecs > ZPS_DATAPKT_MAXITEMS)
|
||||||
|
nRecs = ZPS_DATAPKT_MAXITEMS;
|
||||||
|
memcpy(&netData, pd.payload.bytes, nRecs << 3);
|
||||||
|
|
||||||
|
// Currently we are unable to act as a position server, so we're
|
||||||
|
// not interested in broadcasts (this will change later)
|
||||||
|
if (mp.to != nodeDB->getNodeNum()) {
|
||||||
|
// Message is not for us, won't process
|
||||||
|
return ProcessMessage::CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef ZPS_EXTRAVERBOSE
|
||||||
|
for (int i = 0; i < nRecs; i++) {
|
||||||
|
LOG_DEBUG("ZPS[%d]: %08x"
|
||||||
|
"%08x\n",
|
||||||
|
i, (uint32_t)(netData[i] >> 32), (uint32_t)netData[i]);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if ((netData[0] & 0x800000000000) && (nRecs >= 2)) {
|
||||||
|
// message contains a position
|
||||||
|
pos.PDOP = (netData[0] >> 40) & 0x7f;
|
||||||
|
pos.timestamp = netData[0] & 0xffffffff;
|
||||||
|
// second int64 encodes lat and lon
|
||||||
|
pos.longitude_i = (int32_t)(netData[1] & 0xffffffff);
|
||||||
|
pos.latitude_i = (int32_t)((netData[1] >> 32) & 0xffffffff);
|
||||||
|
|
||||||
|
// FIXME should be conditional, to ensure we don't overwrite a good GPS fix!
|
||||||
|
LOG_DEBUG("ZPS lat/lon/dop/pts %d/%d/%d/%d\n", pos.latitude_i, pos.longitude_i, pos.PDOP, pos.timestamp);
|
||||||
|
|
||||||
|
// Some required fields
|
||||||
|
pos.time = getTime();
|
||||||
|
pos.location_source = meshtastic_Position_LocSource_LOC_EXTERNAL;
|
||||||
|
|
||||||
|
// don't update position if my gps fix is valid
|
||||||
|
if (nodeDB->hasValidPosition(nodeDB->getMeshNode(nodeDB->getNodeNum()))) {
|
||||||
|
LOG_DEBUG("ZPSModule::handleReceived: ignoring position update, GPS is valid\n");
|
||||||
|
return ProcessMessage::CONTINUE;
|
||||||
|
}
|
||||||
|
nodeDB->updatePosition(nodeDB->getNodeNum(), pos);
|
||||||
|
} else {
|
||||||
|
// nothing we can do - for now
|
||||||
|
return ProcessMessage::CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ProcessMessage::CONTINUE; // Let others look at this message also if they want
|
||||||
|
}
|
||||||
|
|
||||||
|
meshtastic_MeshPacket *ZPSModule::allocReply()
|
||||||
|
{
|
||||||
|
meshtastic_MeshPacket *p = allocDataPacket();
|
||||||
|
p->decoded.payload.size = (netRecs + 2) << 3; // actually can be only +1 if no GPS data
|
||||||
|
|
||||||
|
LOG_DEBUG("Allocating dataPacket for %d items, %d bytes\n", netRecs, p->decoded.payload.size);
|
||||||
|
memcpy(p->decoded.payload.bytes, &netData, p->decoded.payload.size);
|
||||||
|
|
||||||
|
return (p);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ZPSModule::sendDataPacket(NodeNum dest, bool wantReplies)
|
||||||
|
{
|
||||||
|
// cancel any not yet sent (now stale) position packets
|
||||||
|
if (prevPacketId)
|
||||||
|
service->cancelSending(prevPacketId);
|
||||||
|
|
||||||
|
meshtastic_MeshPacket *p = allocReply();
|
||||||
|
p->to = dest;
|
||||||
|
p->decoded.portnum = meshtastic_PortNum_ZPS_APP;
|
||||||
|
p->decoded.want_response = wantReplies;
|
||||||
|
p->priority = meshtastic_MeshPacket_Priority_BACKGROUND;
|
||||||
|
prevPacketId = p->id;
|
||||||
|
|
||||||
|
service->sendToMesh(p, RX_SRC_LOCAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t ZPSModule::runOnce()
|
||||||
|
{
|
||||||
|
meshtastic_NodeInfoLite *node = nodeDB->getMeshNode(nodeDB->getNodeNum());
|
||||||
|
assert(node);
|
||||||
|
|
||||||
|
// LOG_DEBUG("ZPSModule::runOnce() START, scanState: %d\n", (int) scanState);
|
||||||
|
|
||||||
|
int numWifi = 0;
|
||||||
|
|
||||||
|
if (scanState == SCAN_BSS_RUN) {
|
||||||
|
// check completion status of any running Wifi scan
|
||||||
|
numWifi = WiFi.scanComplete();
|
||||||
|
|
||||||
|
if (numWifi >= 0) {
|
||||||
|
// scan is complete
|
||||||
|
LOG_DEBUG("%d BSS found\n", numWifi);
|
||||||
|
LOG_DEBUG("BSS scan done in %d millis\n", millis() - scanStart);
|
||||||
|
|
||||||
|
if (wantBSS && haveBSS) {
|
||||||
|
// old data exists, overwrite it
|
||||||
|
netRecs = 0;
|
||||||
|
haveBSS = haveBLE = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < numWifi; i++) {
|
||||||
|
// pack each Wifi network record into a 64-bit int
|
||||||
|
uint64_t netBytes = encodeBSS(WiFi.BSSID(i), WiFi.channel(i), abs(WiFi.RSSI(i)));
|
||||||
|
|
||||||
|
if (wantBSS) {
|
||||||
|
// load into outbound array if needed
|
||||||
|
outBufAdd(netBytes);
|
||||||
|
haveBSS = true;
|
||||||
|
}
|
||||||
|
#ifdef ZPS_EXTRAVERBOSE
|
||||||
|
LOG_DEBUG("BSS[%02d]: %08x"
|
||||||
|
"%08x\n",
|
||||||
|
i, (uint32_t)(netBytes >> 32), (uint32_t)netBytes);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
WiFi.scanDelete();
|
||||||
|
scanState = SCAN_BSS_DONE;
|
||||||
|
|
||||||
|
#ifdef ZPS_EXTRAVERBOSE
|
||||||
|
} else if (numWifi == -1) {
|
||||||
|
// LOG_DEBUG("BSS scan in-progress\n");
|
||||||
|
} else {
|
||||||
|
LOG_DEBUG("BSS scan state=%d\n", numWifi);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((scanState == SCAN_BLE_RUN) && (bleResSize >= 0)) {
|
||||||
|
// completion status checked above (bleResSize >= 0)
|
||||||
|
LOG_DEBUG("BLE scan done in %d millis\n", millis() - scanStart);
|
||||||
|
scanState = SCAN_BLE_DONE;
|
||||||
|
|
||||||
|
if (wantBLE && haveBLE) {
|
||||||
|
// old data exists, overwrite it
|
||||||
|
netRecs = 0;
|
||||||
|
haveBSS = haveBLE = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < bleResSize; i++) {
|
||||||
|
// load data into output array if needed
|
||||||
|
if (wantBLE) {
|
||||||
|
outBufAdd(bleResult[i]);
|
||||||
|
haveBLE = true;
|
||||||
|
}
|
||||||
|
#ifdef ZPS_EXTRAVERBOSE
|
||||||
|
LOG_DEBUG("BLE[%d]: %08x"
|
||||||
|
"%08x\n",
|
||||||
|
i, (uint32_t)(bleResult[i] >> 32), (uint32_t)bleResult[i]);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset the counter once we're done with the dataset
|
||||||
|
bleResSize = BLE_NO_RESULTS;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Are we finished assembling that packet? Then send it out
|
||||||
|
if ((wantBSS == haveBSS) && (wantBLE == haveBLE) &&
|
||||||
|
airTime->isTxAllowedChannelUtil(config.device.role != meshtastic_Config_DeviceConfig_Role_SENSOR) &&
|
||||||
|
airTime->isTxAllowedAirUtil() &&
|
||||||
|
(lastSend == 0 || millis() - lastSend >= Default::getConfiguredOrDefaultMsScaled(config.position.position_broadcast_secs,
|
||||||
|
default_broadcast_interval_secs,
|
||||||
|
nodeStatus->getNumOnline()))) {
|
||||||
|
|
||||||
|
haveBSS = haveBLE = false;
|
||||||
|
sendDataPacket(NODENUM_BROADCAST, false); // no replies
|
||||||
|
lastSend = millis();
|
||||||
|
netRecs = 0; // reset packet
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* State machine transitions
|
||||||
|
*
|
||||||
|
* FIXME could be managed better, for example: check if we require
|
||||||
|
* each type of scan (wantBSS/wantBLE), and if not, don't start it!
|
||||||
|
*/
|
||||||
|
if (scanState == SCAN_BLE_DONE) {
|
||||||
|
// BLE done, transition to BSS scanning
|
||||||
|
scanStart = millis();
|
||||||
|
LOG_DEBUG("BSS scan start t=%d\n", scanStart);
|
||||||
|
if (WiFi.scanNetworks(true, true) == WIFI_SCAN_RUNNING) // nonblock, showhidden
|
||||||
|
scanState = SCAN_BSS_RUN;
|
||||||
|
|
||||||
|
} else if (scanState == SCAN_BSS_DONE) {
|
||||||
|
// BSS done, transition to BLE scanning
|
||||||
|
scanStart = millis();
|
||||||
|
LOG_DEBUG("BLE scan start t=%d\n", scanStart);
|
||||||
|
if (ble_scan(ZPS_BLE_SCANTIME) == 0)
|
||||||
|
scanState = SCAN_BLE_RUN;
|
||||||
|
}
|
||||||
|
|
||||||
|
// LOG_DEBUG("ZPSModule::runOnce() DONE, scanState=%d\n", scanState);
|
||||||
|
if ((scanState == SCAN_BSS_RUN) || (scanState == SCAN_BLE_RUN)) {
|
||||||
|
return 1000; // scan in progress, re-check soon
|
||||||
|
}
|
||||||
|
|
||||||
|
return 5000;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t encodeBSS(uint8_t *bssid, uint8_t chan, uint8_t absRSSI)
|
||||||
|
{
|
||||||
|
uint64_t netBytes = absRSSI & 0xff;
|
||||||
|
netBytes <<= 8;
|
||||||
|
netBytes |= (chan & 0xff);
|
||||||
|
|
||||||
|
for (uint8_t b = 0; b < 6; b++) {
|
||||||
|
netBytes <<= 8;
|
||||||
|
netBytes |= bssid[b];
|
||||||
|
}
|
||||||
|
|
||||||
|
return netBytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t encodeBLE(uint8_t *addr, uint8_t absRSSI)
|
||||||
|
{
|
||||||
|
uint64_t netBytes = absRSSI & 0xff;
|
||||||
|
netBytes <<= 8;
|
||||||
|
netBytes |= 0xff; // "channel" byte reserved in BLE records
|
||||||
|
|
||||||
|
for (uint8_t b = 0; b < 6; b++) {
|
||||||
|
netBytes <<= 8;
|
||||||
|
netBytes |= addr[5 - b] & 0xff;
|
||||||
|
}
|
||||||
|
|
||||||
|
return netBytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Event handler
|
||||||
|
*/
|
||||||
|
static int ble_gap_event(struct ble_gap_event *event, void *arg)
|
||||||
|
{
|
||||||
|
// Adverts matching certain patterns are useless for positioning purposes
|
||||||
|
// (ephemeral MAC etc), so try excluding them if possible
|
||||||
|
//
|
||||||
|
// TODO: Expand the list of reject patterns for BLE adverts.
|
||||||
|
// There are likely more than 10 patterns to test and reject, including most Apple devices and others.
|
||||||
|
//
|
||||||
|
// TODO: Implement full packet search for reject patterns (use memmem() or similar),
|
||||||
|
// not just at the beginning (currently uses memcmp()).
|
||||||
|
|
||||||
|
const uint8_t rejPat[] = {0x1e, 0xff, 0x06, 0x00, 0x01}; // one of many
|
||||||
|
|
||||||
|
struct ble_hs_adv_fields fields;
|
||||||
|
int rc;
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
uint64_t netBytes = 0;
|
||||||
|
|
||||||
|
switch (event->type) {
|
||||||
|
case BLE_GAP_EVENT_DISC:
|
||||||
|
// called once for every BLE advert received
|
||||||
|
rc = ble_hs_adv_parse_fields(&fields, event->disc.data, event->disc.length_data);
|
||||||
|
if (rc != 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (bleResSize != BLE_NO_RESULTS)
|
||||||
|
// as far as we know, we're not in the middle of a BLE scan!
|
||||||
|
LOG_DEBUG("Unexpected BLE_GAP_EVENT_DISC!\n");
|
||||||
|
|
||||||
|
#ifdef ZPS_EXTRAVERBOSE
|
||||||
|
// Dump the advertisement packet
|
||||||
|
DEBUG_PORT.hexDump("DEBUG", (unsigned char *)event->disc.data, event->disc.length_data);
|
||||||
|
#endif
|
||||||
|
// Reject beacons known to be unreliable (ephemeral etc)
|
||||||
|
if (memcmp(event->disc.data, rejPat, sizeof(rejPat)) == 0) {
|
||||||
|
LOG_DEBUG("(BLE item filtered by pattern)\n");
|
||||||
|
return 0; // Processing-wise, it's still a success
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// STORE THE RESULTS IN A SORTED LIST
|
||||||
|
//
|
||||||
|
|
||||||
|
// first, pack each BLE item reading into a 64-bit int
|
||||||
|
netBytes = encodeBLE(event->disc.addr.val, abs(event->disc.rssi));
|
||||||
|
|
||||||
|
// SOME DUPLICATES SURVIVE through filter_duplicates = 1, catch them here
|
||||||
|
// Duplicate filtering is now handled in the sorting loop below,
|
||||||
|
// but right now we write for clarity not optimization
|
||||||
|
for (i = 0; i < bleCounter; i++) {
|
||||||
|
if ((bleResult[i] & 0xffffffffffff) == (netBytes & 0xffffffffffff)) {
|
||||||
|
LOG_DEBUG("(BLE duplicate filtered)\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef ZPS_EXTRAVERBOSE
|
||||||
|
// redundant extraverbosity, but I need it for duplicate hunting
|
||||||
|
LOG_DEBUG("BL_[%02d]: %08x"
|
||||||
|
"%08x\n",
|
||||||
|
bleCounter, (uint32_t)(netBytes >> 32), (uint32_t)netBytes);
|
||||||
|
#endif
|
||||||
|
// then insert item into a list (up to BLE_MAX_REC records), sorted by RSSI
|
||||||
|
for (i = 0; i < bleCounter; i++) {
|
||||||
|
// find first element greater than ours, that will be our insertion point
|
||||||
|
if (bleResult[i] > netBytes)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// any other records move down one position to vacate res[i]
|
||||||
|
for (int j = bleCounter; j > i; j--)
|
||||||
|
bleResult[j] = bleResult[j - 1];
|
||||||
|
// write new element at insertion point
|
||||||
|
bleResult[i] = netBytes;
|
||||||
|
|
||||||
|
// advance tail of list, but not beyond limit
|
||||||
|
if (bleCounter < BLE_MAX_REC)
|
||||||
|
bleCounter++;
|
||||||
|
|
||||||
|
return 0; // SUCCESS
|
||||||
|
|
||||||
|
case BLE_GAP_EVENT_DISC_COMPLETE:
|
||||||
|
LOG_DEBUG("EVENT_DISC_COMPLETE in %d millis\n", (millis() - scanStart));
|
||||||
|
LOG_DEBUG("%d BLE found\n", bleCounter);
|
||||||
|
bleResSize = bleCounter;
|
||||||
|
|
||||||
|
bleCounter = 0; // reset counter
|
||||||
|
return 0; // SUCCESS
|
||||||
|
|
||||||
|
default:
|
||||||
|
return 0; // SUCCESS
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initiates the GAP general discovery procedure (non-blocking)
|
||||||
|
*/
|
||||||
|
static int ble_scan(uint32_t duration, bool passive, bool dedup)
|
||||||
|
{
|
||||||
|
uint8_t own_addr_type;
|
||||||
|
struct ble_gap_disc_params disc_params;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
// Figure out address type to use
|
||||||
|
rc = ble_hs_id_infer_auto(0, &own_addr_type);
|
||||||
|
if (rc != 0) {
|
||||||
|
LOG_DEBUG("error determining address type; rc=%d\n", rc);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Scanning parameters, these are mostly default
|
||||||
|
disc_params.itvl = 0;
|
||||||
|
disc_params.window = 0;
|
||||||
|
disc_params.filter_policy = 0;
|
||||||
|
disc_params.limited = 0;
|
||||||
|
|
||||||
|
// These two params are the more interesting ones
|
||||||
|
disc_params.filter_duplicates = dedup; // self-explanatory
|
||||||
|
disc_params.passive = passive; // passive uses less power
|
||||||
|
|
||||||
|
// Start scanning process (non-blocking) and return
|
||||||
|
rc = ble_gap_disc(own_addr_type, duration, &disc_params, ble_gap_event, NULL);
|
||||||
|
if (rc != 0) {
|
||||||
|
LOG_DEBUG("error initiating GAP discovery; rc=%d\n", rc);
|
||||||
|
}
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // MESHTASTIC_EXCLUDE_BLUETOOTH
|
||||||
86
src/modules/esp32/ZPSModule.h
Normal file
86
src/modules/esp32/ZPSModule.h
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "SinglePortModule.h"
|
||||||
|
#include "concurrency/OSThread.h"
|
||||||
|
#include "gps/RTC.h"
|
||||||
|
|
||||||
|
#define ZPS_PORTNUM meshtastic_PortNum_ZPS_APP
|
||||||
|
|
||||||
|
#define ZPS_DATAPKT_MAXITEMS 20 // max number of records to pack in an outbound packet (~10)
|
||||||
|
#define ZPS_STARTUP_DELAY 10000 // Module startup delay in millis
|
||||||
|
|
||||||
|
// Duration of a BLE scan in millis.
|
||||||
|
// We want this number to be SLIGHTLY UNDER an integer number of seconds,
|
||||||
|
// to be able to catch the result as fresh as possible on a 1-second polling loop
|
||||||
|
#define ZPS_BLE_SCANTIME 2900 // millis
|
||||||
|
|
||||||
|
enum SCANSTATE { SCAN_NONE, SCAN_BSS_RUN, SCAN_BSS_DONE, SCAN_BLE_RUN, SCAN_BLE_DONE };
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Data packing "compression" functions
|
||||||
|
* Ingest a WiFi BSSID, channel and RSSI (or BLE address and RSSI)
|
||||||
|
* and encode them into a packed uint64
|
||||||
|
*/
|
||||||
|
uint64_t encodeBSS(uint8_t *bssid, uint8_t chan, uint8_t absRSSI);
|
||||||
|
uint64_t encodeBLE(uint8_t *addr, uint8_t absRSSI);
|
||||||
|
|
||||||
|
class ZPSModule : public SinglePortModule, private concurrency::OSThread
|
||||||
|
{
|
||||||
|
/// The id of the last packet we sent, to allow us to cancel it if we make something fresher
|
||||||
|
PacketId prevPacketId = 0;
|
||||||
|
|
||||||
|
/// We limit our broadcasts to a max rate
|
||||||
|
uint32_t lastSend = 0;
|
||||||
|
|
||||||
|
bool wantBSS = true;
|
||||||
|
bool haveBSS = false;
|
||||||
|
|
||||||
|
bool wantBLE = true;
|
||||||
|
bool haveBLE = false;
|
||||||
|
|
||||||
|
public:
|
||||||
|
/** Constructor
|
||||||
|
* name is for debugging output
|
||||||
|
*/
|
||||||
|
ZPSModule();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send our radio environment data into the mesh
|
||||||
|
*/
|
||||||
|
void sendDataPacket(NodeNum dest = NODENUM_BROADCAST, bool wantReplies = false);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
/** Called to handle a particular incoming message
|
||||||
|
@return true if you've guaranteed you've handled this message and no other handlers should be considered for it
|
||||||
|
*/
|
||||||
|
virtual ProcessMessage handleReceived(const meshtastic_MeshPacket &mp);
|
||||||
|
|
||||||
|
/** Messages can be received that have the want_response bit set. If set, this callback will be invoked
|
||||||
|
* so that subclasses can (optionally) send a response back to the original sender. */
|
||||||
|
virtual meshtastic_MeshPacket *allocReply();
|
||||||
|
|
||||||
|
/** Does our periodic broadcast */
|
||||||
|
virtual int32_t runOnce();
|
||||||
|
|
||||||
|
private:
|
||||||
|
// outbound data packet staging buffer and record counter
|
||||||
|
uint64_t netData[ZPS_DATAPKT_MAXITEMS + 2] = {0};
|
||||||
|
uint8_t netRecs = 0;
|
||||||
|
|
||||||
|
// mini state machine to alternate between BSS(Wifi) and BLE scanning
|
||||||
|
SCANSTATE scanState = SCAN_NONE;
|
||||||
|
|
||||||
|
inline void outBufAdd(uint64_t netBytes)
|
||||||
|
{
|
||||||
|
// If this is the first record, initialize the header with the current time and reset the record count.
|
||||||
|
if (!netRecs) {
|
||||||
|
netData[0] = getTime();
|
||||||
|
netData[1] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// push to buffer and update counter
|
||||||
|
if (netRecs < ZPS_DATAPKT_MAXITEMS)
|
||||||
|
netData[2 + (netRecs++)] = netBytes;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
extern ZPSModule *zpsModule;
|
||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
#if !defined(ARCH_STM32WL) && !MESHTASTIC_EXCLUDE_I2C
|
#if !defined(ARCH_STM32WL) && !MESHTASTIC_EXCLUDE_I2C
|
||||||
|
|
||||||
#if !defined(RAK2560) && __has_include(<Rak_BMX160.h>)
|
#if defined(RAK_4631) && !defined(RAK2560) && __has_include(<Rak_BMX160.h>)
|
||||||
|
|
||||||
#include "Fusion/Fusion.h"
|
#include "Fusion/Fusion.h"
|
||||||
#include <Rak_BMX160.h>
|
#include <Rak_BMX160.h>
|
||||||
|
|||||||
@@ -32,16 +32,6 @@ esp_sleep_source_t wakeCause; // the reason we booted this time
|
|||||||
#endif
|
#endif
|
||||||
#include "Throttle.h"
|
#include "Throttle.h"
|
||||||
|
|
||||||
#ifdef USE_XL9555
|
|
||||||
#include "ExtensionIOXL9555.hpp"
|
|
||||||
extern ExtensionIOXL9555 io;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAS_PPM
|
|
||||||
#include <XPowersLib.h>
|
|
||||||
extern XPowersPPM *PPM;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef INCLUDE_vTaskSuspend
|
#ifndef INCLUDE_vTaskSuspend
|
||||||
#define INCLUDE_vTaskSuspend 0
|
#define INCLUDE_vTaskSuspend 0
|
||||||
#endif
|
#endif
|
||||||
@@ -307,14 +297,6 @@ void doDeepSleep(uint32_t msecToWake, bool skipPreflight = false, bool skipSaveN
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAS_PPM
|
|
||||||
if (PPM) {
|
|
||||||
LOG_INFO("PMM shutdown");
|
|
||||||
console->flush();
|
|
||||||
PPM->shutdown();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAS_PMU
|
#ifdef HAS_PMU
|
||||||
if (pmu_found && PMU) {
|
if (pmu_found && PMU) {
|
||||||
// Obsolete comment: from back when we we used to receive lora packets while CPU was in deep sleep.
|
// Obsolete comment: from back when we we used to receive lora packets while CPU was in deep sleep.
|
||||||
@@ -430,7 +412,6 @@ esp_sleep_wakeup_cause_t doLightSleep(uint64_t sleepMsec) // FIXME, use a more r
|
|||||||
if (pmu_found)
|
if (pmu_found)
|
||||||
gpio_wakeup_enable((gpio_num_t)PMU_IRQ, GPIO_INTR_LOW_LEVEL); // pmu irq
|
gpio_wakeup_enable((gpio_num_t)PMU_IRQ, GPIO_INTR_LOW_LEVEL); // pmu irq
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
auto res = esp_sleep_enable_gpio_wakeup();
|
auto res = esp_sleep_enable_gpio_wakeup();
|
||||||
if (res != ESP_OK) {
|
if (res != ESP_OK) {
|
||||||
LOG_ERROR("esp_sleep_enable_gpio_wakeup result %d", res);
|
LOG_ERROR("esp_sleep_enable_gpio_wakeup result %d", res);
|
||||||
|
|||||||
@@ -1,9 +1,20 @@
|
|||||||
#include "../test_helpers.h"
|
#include "../test_helpers.h"
|
||||||
|
|
||||||
// Helper function for all encrypted packet assertions
|
// Test encrypted packet serialization
|
||||||
void assert_encrypted_packet(const std::string &json, meshtastic_MeshPacket packet)
|
void test_encrypted_packet_serialization()
|
||||||
{
|
{
|
||||||
// Parse and validate JSON
|
meshtastic_MeshPacket packet = meshtastic_MeshPacket_init_zero;
|
||||||
|
packet.from = 0x11223344;
|
||||||
|
packet.to = 0x55667788;
|
||||||
|
packet.id = 0x9999;
|
||||||
|
packet.which_payload_variant = meshtastic_MeshPacket_encrypted_tag;
|
||||||
|
|
||||||
|
// Add some dummy encrypted data
|
||||||
|
const char *encrypted_data = "encrypted_payload_data";
|
||||||
|
packet.encrypted.size = strlen(encrypted_data);
|
||||||
|
memcpy(packet.encrypted.bytes, encrypted_data, packet.encrypted.size);
|
||||||
|
|
||||||
|
std::string json = MeshPacketSerializer::JsonSerializeEncrypted(&packet);
|
||||||
TEST_ASSERT_TRUE(json.length() > 0);
|
TEST_ASSERT_TRUE(json.length() > 0);
|
||||||
|
|
||||||
JSONValue *root = JSON::Parse(json.c_str());
|
JSONValue *root = JSON::Parse(json.c_str());
|
||||||
@@ -12,48 +23,28 @@ void assert_encrypted_packet(const std::string &json, meshtastic_MeshPacket pack
|
|||||||
|
|
||||||
JSONObject jsonObj = root->AsObject();
|
JSONObject jsonObj = root->AsObject();
|
||||||
|
|
||||||
// Assert basic packet fields
|
// Check basic packet fields
|
||||||
TEST_ASSERT_TRUE(jsonObj.find("from") != jsonObj.end());
|
TEST_ASSERT_TRUE(jsonObj.find("from") != jsonObj.end());
|
||||||
TEST_ASSERT_EQUAL(packet.from, (uint32_t)jsonObj.at("from")->AsNumber());
|
TEST_ASSERT_EQUAL(0x11223344, (uint32_t)jsonObj["from"]->AsNumber());
|
||||||
|
|
||||||
TEST_ASSERT_TRUE(jsonObj.find("to") != jsonObj.end());
|
TEST_ASSERT_TRUE(jsonObj.find("to") != jsonObj.end());
|
||||||
TEST_ASSERT_EQUAL(packet.to, (uint32_t)jsonObj.at("to")->AsNumber());
|
TEST_ASSERT_EQUAL(0x55667788, (uint32_t)jsonObj["to"]->AsNumber());
|
||||||
|
|
||||||
TEST_ASSERT_TRUE(jsonObj.find("id") != jsonObj.end());
|
TEST_ASSERT_TRUE(jsonObj.find("id") != jsonObj.end());
|
||||||
TEST_ASSERT_EQUAL(packet.id, (uint32_t)jsonObj.at("id")->AsNumber());
|
TEST_ASSERT_EQUAL(0x9999, (uint32_t)jsonObj["id"]->AsNumber());
|
||||||
|
|
||||||
// Assert encrypted data fields
|
// Check that it has encrypted data fields (not "payload" but "bytes" and "size")
|
||||||
TEST_ASSERT_TRUE(jsonObj.find("bytes") != jsonObj.end());
|
TEST_ASSERT_TRUE(jsonObj.find("bytes") != jsonObj.end());
|
||||||
TEST_ASSERT_TRUE(jsonObj.at("bytes")->IsString());
|
TEST_ASSERT_TRUE(jsonObj["bytes"]->IsString());
|
||||||
|
|
||||||
TEST_ASSERT_TRUE(jsonObj.find("size") != jsonObj.end());
|
TEST_ASSERT_TRUE(jsonObj.find("size") != jsonObj.end());
|
||||||
TEST_ASSERT_EQUAL(packet.encrypted.size, (int)jsonObj.at("size")->AsNumber());
|
TEST_ASSERT_EQUAL(22, (int)jsonObj["size"]->AsNumber()); // strlen("encrypted_payload_data") = 22
|
||||||
|
|
||||||
// Assert hex encoding
|
// The encrypted data should be hex-encoded
|
||||||
std::string encrypted_hex = jsonObj["bytes"]->AsString();
|
std::string encrypted_hex = jsonObj["bytes"]->AsString();
|
||||||
TEST_ASSERT_EQUAL(packet.encrypted.size * 2, encrypted_hex.length());
|
TEST_ASSERT_TRUE(encrypted_hex.length() > 0);
|
||||||
|
// Should be twice the size of the original data (hex encoding)
|
||||||
|
TEST_ASSERT_EQUAL(44, encrypted_hex.length()); // 22 * 2 = 44
|
||||||
|
|
||||||
delete root;
|
delete root;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test encrypted packet serialization
|
|
||||||
void test_encrypted_packet_serialization()
|
|
||||||
{
|
|
||||||
const char *data = "encrypted_payload_data";
|
|
||||||
meshtastic_MeshPacket packet =
|
|
||||||
create_test_packet(meshtastic_PortNum_TEXT_MESSAGE_APP, reinterpret_cast<const uint8_t *>(data), strlen(data),
|
|
||||||
meshtastic_MeshPacket_encrypted_tag);
|
|
||||||
std::string json = MeshPacketSerializer::JsonSerializeEncrypted(&packet);
|
|
||||||
|
|
||||||
assert_encrypted_packet(json, packet);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Test empty encrypted packet
|
|
||||||
void test_empty_encrypted_packet()
|
|
||||||
{
|
|
||||||
meshtastic_MeshPacket packet =
|
|
||||||
create_test_packet(meshtastic_PortNum_TEXT_MESSAGE_APP, nullptr, 0, meshtastic_MeshPacket_encrypted_tag);
|
|
||||||
std::string json = MeshPacketSerializer::JsonSerializeEncrypted(&packet);
|
|
||||||
|
|
||||||
assert_encrypted_packet(json, packet);
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -11,8 +11,7 @@
|
|||||||
#include <unity.h>
|
#include <unity.h>
|
||||||
|
|
||||||
// Helper function to create a test packet with the given port and payload
|
// Helper function to create a test packet with the given port and payload
|
||||||
static meshtastic_MeshPacket create_test_packet(meshtastic_PortNum port, const uint8_t *payload, size_t payload_size,
|
static meshtastic_MeshPacket create_test_packet(meshtastic_PortNum port, const uint8_t *payload, size_t payload_size)
|
||||||
int payload_variant = meshtastic_MeshPacket_decoded_tag)
|
|
||||||
{
|
{
|
||||||
meshtastic_MeshPacket packet = meshtastic_MeshPacket_init_zero;
|
meshtastic_MeshPacket packet = meshtastic_MeshPacket_init_zero;
|
||||||
|
|
||||||
@@ -30,12 +29,8 @@ static meshtastic_MeshPacket create_test_packet(meshtastic_PortNum port, const u
|
|||||||
packet.delayed = meshtastic_MeshPacket_Delayed_NO_DELAY;
|
packet.delayed = meshtastic_MeshPacket_Delayed_NO_DELAY;
|
||||||
|
|
||||||
// Set decoded variant
|
// Set decoded variant
|
||||||
packet.which_payload_variant = payload_variant;
|
packet.which_payload_variant = meshtastic_MeshPacket_decoded_tag;
|
||||||
packet.decoded.portnum = port;
|
packet.decoded.portnum = port;
|
||||||
if (payload_variant == meshtastic_MeshPacket_encrypted_tag && payload) {
|
|
||||||
packet.encrypted.size = payload_size;
|
|
||||||
memcpy(packet.encrypted.bytes, payload, packet.encrypted.size);
|
|
||||||
}
|
|
||||||
memcpy(packet.decoded.payload.bytes, payload, payload_size);
|
memcpy(packet.decoded.payload.bytes, payload, payload_size);
|
||||||
packet.decoded.payload.size = payload_size;
|
packet.decoded.payload.size = payload_size;
|
||||||
packet.decoded.want_response = false;
|
packet.decoded.want_response = false;
|
||||||
|
|||||||
@@ -4,10 +4,6 @@
|
|||||||
|
|
||||||
// Forward declarations for test functions
|
// Forward declarations for test functions
|
||||||
void test_text_message_serialization();
|
void test_text_message_serialization();
|
||||||
void test_text_message_serialization_null();
|
|
||||||
void test_text_message_serialization_long_text();
|
|
||||||
void test_text_message_serialization_oversized();
|
|
||||||
void test_text_message_serialization_invalid_utf8();
|
|
||||||
void test_position_serialization();
|
void test_position_serialization();
|
||||||
void test_nodeinfo_serialization();
|
void test_nodeinfo_serialization();
|
||||||
void test_waypoint_serialization();
|
void test_waypoint_serialization();
|
||||||
@@ -18,7 +14,6 @@ void test_telemetry_environment_metrics_missing_fields();
|
|||||||
void test_telemetry_environment_metrics_complete_coverage();
|
void test_telemetry_environment_metrics_complete_coverage();
|
||||||
void test_telemetry_environment_metrics_unset_fields();
|
void test_telemetry_environment_metrics_unset_fields();
|
||||||
void test_encrypted_packet_serialization();
|
void test_encrypted_packet_serialization();
|
||||||
void test_empty_encrypted_packet();
|
|
||||||
|
|
||||||
void setup()
|
void setup()
|
||||||
{
|
{
|
||||||
@@ -26,10 +21,6 @@ void setup()
|
|||||||
|
|
||||||
// Text message tests
|
// Text message tests
|
||||||
RUN_TEST(test_text_message_serialization);
|
RUN_TEST(test_text_message_serialization);
|
||||||
RUN_TEST(test_text_message_serialization_null);
|
|
||||||
RUN_TEST(test_text_message_serialization_long_text);
|
|
||||||
RUN_TEST(test_text_message_serialization_oversized);
|
|
||||||
RUN_TEST(test_text_message_serialization_invalid_utf8);
|
|
||||||
|
|
||||||
// Position tests
|
// Position tests
|
||||||
RUN_TEST(test_position_serialization);
|
RUN_TEST(test_position_serialization);
|
||||||
@@ -50,7 +41,6 @@ void setup()
|
|||||||
|
|
||||||
// Encrypted packet test
|
// Encrypted packet test
|
||||||
RUN_TEST(test_encrypted_packet_serialization);
|
RUN_TEST(test_encrypted_packet_serialization);
|
||||||
RUN_TEST(test_empty_encrypted_packet);
|
|
||||||
|
|
||||||
UNITY_END();
|
UNITY_END();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +0,0 @@
|
|||||||
; 9M2IBR APRS LoRa Tracker: ESP32-WROOM-32 + EBYTE E22-400M30S
|
|
||||||
; https://shopee.com.my/product/1095224/21692283917
|
|
||||||
[env:9m2ibr_aprs_lora_tracker]
|
|
||||||
extends = esp32_base
|
|
||||||
board = esp32doit-devkit-v1
|
|
||||||
board_level = extra
|
|
||||||
build_flags =
|
|
||||||
${esp32_base.build_flags}
|
|
||||||
-D PRIVATE_HW
|
|
||||||
-D EBYTE_E22
|
|
||||||
-D EBYTE_E22_900M30S ; Assume Tx power curve is identical to 900M30S as there is no documentation
|
|
||||||
-I variants/esp32/diy/9m2ibr_aprs_lora_tracker
|
|
||||||
@@ -1,74 +0,0 @@
|
|||||||
/*
|
|
||||||
|
|
||||||
9M2IBR APRS LoRa Tracker: ESP32-WROOM-32 + EBYTE E22-400M30S
|
|
||||||
https://shopee.com.my/product/1095224/21692283917
|
|
||||||
|
|
||||||
Originally developed for LoRa_APRS_iGate and GPIO is similar to
|
|
||||||
https://github.com/richonguzman/LoRa_APRS_iGate/blob/main/variants/ESP32_DIY_1W_LoRa_Mesh_V1_2/board_pinout.h
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
// OLED (may be different controllers depending on screen size)
|
|
||||||
#define I2C_SDA 21
|
|
||||||
#define I2C_SCL 22
|
|
||||||
#define HAS_SCREEN 1 // Generates randomized BLE pin
|
|
||||||
|
|
||||||
// GNSS: Ai-Thinker GP-02 BDS/GNSS module
|
|
||||||
#define GPS_RX_PIN 16
|
|
||||||
#define GPS_TX_PIN 17
|
|
||||||
|
|
||||||
// Button
|
|
||||||
#define BUTTON_PIN 15 // Right side button - if not available, set device.button_gpio to 0 from Meshtastic client
|
|
||||||
|
|
||||||
// LEDs
|
|
||||||
#define LED_PIN 13 // Tx LED
|
|
||||||
#define USER_LED 2 // Rx LED
|
|
||||||
|
|
||||||
// Buzzer
|
|
||||||
#define PIN_BUZZER 33
|
|
||||||
|
|
||||||
// Battery sense
|
|
||||||
#define BATTERY_PIN 35
|
|
||||||
#define ADC_MULTIPLIER 2.01 // 100k + 100k, and add 1% tolerance
|
|
||||||
#define ADC_CHANNEL ADC1_GPIO35_CHANNEL
|
|
||||||
#define BATTERY_SENSE_RESOLUTION_BITS ADC_RESOLUTION
|
|
||||||
|
|
||||||
// SPI
|
|
||||||
#define LORA_SCK 18
|
|
||||||
#define LORA_MISO 19
|
|
||||||
#define LORA_MOSI 23
|
|
||||||
|
|
||||||
// LoRa
|
|
||||||
#define LORA_CS 5
|
|
||||||
#define LORA_DIO0 26 // a No connect on the SX1262/SX1268 module
|
|
||||||
#define LORA_RESET 27 // RST for SX1276, and for SX1262/SX1268
|
|
||||||
#define LORA_DIO1 12 // IRQ for SX1262/SX1268
|
|
||||||
#define LORA_DIO2 RADIOLIB_NC // BUSY for SX1262/SX1268
|
|
||||||
#define LORA_DIO3 // NC, but used as TCXO supply by E22 module
|
|
||||||
#define LORA_RXEN 32 // RF switch RX (and E22 LNA) control by ESP32 GPIO
|
|
||||||
#define LORA_TXEN 25 // RF switch TX (and E22 PA) control by ESP32 GPIO
|
|
||||||
|
|
||||||
// RX/TX for RFM95/SX127x
|
|
||||||
#define RF95_RXEN LORA_RXEN
|
|
||||||
#define RF95_TXEN LORA_TXEN
|
|
||||||
// #define RF95_TCXO <GPIO#>
|
|
||||||
|
|
||||||
// common pinouts for SX126X modules
|
|
||||||
#define SX126X_CS 5
|
|
||||||
#define SX126X_DIO1 LORA_DIO1
|
|
||||||
#define SX126X_BUSY LORA_DIO2
|
|
||||||
#define SX126X_RESET LORA_RESET
|
|
||||||
#define SX126X_RXEN LORA_RXEN
|
|
||||||
#define SX126X_TXEN LORA_TXEN
|
|
||||||
|
|
||||||
// Support alternative modules if soldered in place of E22
|
|
||||||
#define USE_RF95 // RFM95/SX127x
|
|
||||||
#define USE_SX1262
|
|
||||||
#define USE_SX1268
|
|
||||||
#define USE_LLCC68
|
|
||||||
|
|
||||||
// E22 TCXO support
|
|
||||||
#ifdef EBYTE_E22
|
|
||||||
#define SX126X_DIO3_TCXO_VOLTAGE 1.8
|
|
||||||
#define TCXO_OPTIONAL // make it so that the firmware can try both TCXO and XTAL
|
|
||||||
#endif
|
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
[env:heltec-wireless-bridge]
|
[env:heltec-wireless-bridge]
|
||||||
;build_type = debug ; to make it possible to step through our jtag debugger
|
;build_type = debug ; to make it possible to step through our jtag debugger
|
||||||
extends = esp32_base
|
extends = esp32_base
|
||||||
board_level = extra
|
|
||||||
board = heltec_wifi_lora_32
|
board = heltec_wifi_lora_32
|
||||||
build_flags =
|
build_flags =
|
||||||
${esp32_base.build_flags}
|
${esp32_base.build_flags}
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
[env:trackerd]
|
[env:trackerd]
|
||||||
extends = esp32_base
|
extends = esp32_base
|
||||||
board_level = extra
|
|
||||||
board = pico32
|
board = pico32
|
||||||
board_build.f_flash = 80000000L
|
board_build.f_flash = 80000000L
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
extends = esp32s3_base
|
extends = esp32s3_base
|
||||||
board = bpi_picow_esp32_s3
|
board = bpi_picow_esp32_s3
|
||||||
board_check = true
|
board_check = true
|
||||||
board_build.partitions = partition-table-8MB.csv
|
board_build.partitions = default_8MB.csv
|
||||||
;OpenOCD flash method
|
;OpenOCD flash method
|
||||||
;upload_protocol = esp-builtin
|
;upload_protocol = esp-builtin
|
||||||
;Normal method
|
;Normal method
|
||||||
|
|||||||
@@ -1,28 +0,0 @@
|
|||||||
#ifndef Pins_Arduino_h
|
|
||||||
#define Pins_Arduino_h
|
|
||||||
|
|
||||||
#include "variant.h"
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
#define USB_VID 0x303a
|
|
||||||
#define USB_PID 0x1001
|
|
||||||
|
|
||||||
// The default Wire will be mapped to PMU and RTC
|
|
||||||
static const uint8_t SDA = 9;
|
|
||||||
static const uint8_t SCL = 40;
|
|
||||||
|
|
||||||
// Default SPI will be mapped to Radio
|
|
||||||
static const uint8_t SS = 12;
|
|
||||||
static const uint8_t MOSI = 11;
|
|
||||||
static const uint8_t MISO = 10;
|
|
||||||
static const uint8_t SCK = 13;
|
|
||||||
|
|
||||||
#define SPI_MOSI (11)
|
|
||||||
#define SPI_SCK (13)
|
|
||||||
#define SPI_MISO (10)
|
|
||||||
#define SPI_CS (12)
|
|
||||||
|
|
||||||
// LEDs
|
|
||||||
#define LED_BUILTIN LED_GREEN
|
|
||||||
|
|
||||||
#endif /* Pins_Arduino_h */
|
|
||||||
@@ -1,87 +0,0 @@
|
|||||||
; rak_wismeshtap2 rak3112
|
|
||||||
|
|
||||||
[rak_wismeshtap_s3]
|
|
||||||
extends = esp32s3_base
|
|
||||||
board = wiscore_rak3312
|
|
||||||
board_check = true
|
|
||||||
upload_protocol = esptool
|
|
||||||
board_build.partitions = default_8MB.csv
|
|
||||||
|
|
||||||
build_flags =
|
|
||||||
${esp32_base.build_flags}
|
|
||||||
-D RAK3312
|
|
||||||
-D RAK_WISMESH_TAP_V2
|
|
||||||
-I variants/esp32s3/rak_wismesh_tap_v2
|
|
||||||
|
|
||||||
lib_deps =
|
|
||||||
${esp32s3_base.lib_deps}
|
|
||||||
lovyan03/LovyanGFX@^1.2.0
|
|
||||||
|
|
||||||
[ft5x06]
|
|
||||||
extends = mesh_tab_base
|
|
||||||
build_flags =
|
|
||||||
-D LGFX_TOUCH=FT5x06
|
|
||||||
-D LGFX_TOUCH_I2C_FREQ=100000
|
|
||||||
-D LGFX_TOUCH_I2C_PORT=0
|
|
||||||
-D LGFX_TOUCH_I2C_ADDR=0x38
|
|
||||||
-D LGFX_TOUCH_I2C_SDA=9
|
|
||||||
-D LGFX_TOUCH_I2C_SCL=40
|
|
||||||
-D LGFX_TOUCH_RST=-1
|
|
||||||
-D LGFX_TOUCH_INT=39
|
|
||||||
|
|
||||||
[env:rak_wismesh_tap_v2-tft]
|
|
||||||
extends = rak_wismeshtap_s3
|
|
||||||
|
|
||||||
build_flags =
|
|
||||||
${rak_wismeshtap_s3.build_flags}
|
|
||||||
-D CONFIG_ARDUHAL_ESP_LOG
|
|
||||||
-D CONFIG_ARDUHAL_LOG_COLORS=1
|
|
||||||
-D CONFIG_DISABLE_HAL_LOCKS=1
|
|
||||||
-D LV_LVGL_H_INCLUDE_SIMPLE
|
|
||||||
-D LV_CONF_INCLUDE_SIMPLE
|
|
||||||
-D LV_COMP_CONF_INCLUDE_SIMPLE
|
|
||||||
-D LV_USE_SYSMON=0
|
|
||||||
-D LV_USE_PROFILER=0
|
|
||||||
-D LV_USE_PERF_MONITOR=0
|
|
||||||
-D LV_USE_MEM_MONITOR=0
|
|
||||||
-D LV_USE_LOG=0
|
|
||||||
-D LV_BUILD_TEST=0
|
|
||||||
-D USE_LOG_DEBUG
|
|
||||||
-D LOG_DEBUG_INC=\"DebugConfiguration.h\"
|
|
||||||
-D RADIOLIB_SPI_PARANOID=0
|
|
||||||
-D INPUTDRIVER_BUTTON_TYPE=0
|
|
||||||
-D HAS_SDCARD
|
|
||||||
-D HAS_SCREEN=0
|
|
||||||
-D HAS_TFT=1
|
|
||||||
-D USE_PIN_BUZZER=PIN_BUZZER
|
|
||||||
-D RAM_SIZE=5120
|
|
||||||
-D LGFX_DRIVER_TEMPLATE
|
|
||||||
-D LGFX_DRIVER=LGFX_GENERIC
|
|
||||||
-D GFX_DRIVER_INC=\"graphics/LGFX/LGFX_GENERIC.h\"
|
|
||||||
-D LGFX_PIN_SCK=13
|
|
||||||
-D LGFX_PIN_MOSI=11
|
|
||||||
-D LGFX_PIN_MISO=10
|
|
||||||
-D LGFX_PIN_DC=42
|
|
||||||
-D LGFX_PIN_CS=12
|
|
||||||
-D LGFX_PIN_RST=-1
|
|
||||||
-D LGFX_PIN_BL=41
|
|
||||||
-D VIEW_320x240
|
|
||||||
-D USE_PACKET_API
|
|
||||||
${ft5x06.build_flags}
|
|
||||||
-D LGFX_SCREEN_WIDTH=240
|
|
||||||
-D LGFX_SCREEN_HEIGHT=320
|
|
||||||
-D LGFX_PANEL=ST7789
|
|
||||||
-D LGFX_ROTATION=1
|
|
||||||
-D LGFX_TOUCH_X_MIN=0
|
|
||||||
-D LGFX_TOUCH_X_MAX=239
|
|
||||||
-D LGFX_TOUCH_Y_MIN=0
|
|
||||||
-D LGFX_TOUCH_Y_MAX=319
|
|
||||||
-D LGFX_TOUCH_ROTATION=2
|
|
||||||
-D LGFX_CFG_HOST=SPI3_HOST
|
|
||||||
-D MAP_FULL_REDRAW=1
|
|
||||||
|
|
||||||
lib_deps =
|
|
||||||
${rak_wismeshtap_s3.lib_deps}
|
|
||||||
${device-ui_base.lib_deps}
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,71 +0,0 @@
|
|||||||
#ifndef _VARIANT_RAK_WISMESHTAP_V2_H
|
|
||||||
#define _VARIANT_RAK_WISMESHTAP_V2_H
|
|
||||||
|
|
||||||
#define I2C_SDA 9
|
|
||||||
#define I2C_SCL 40
|
|
||||||
|
|
||||||
#define USE_SX1262
|
|
||||||
|
|
||||||
#define LORA_SCK 5
|
|
||||||
#define LORA_MISO 3
|
|
||||||
#define LORA_MOSI 6
|
|
||||||
#define LORA_CS 7
|
|
||||||
#define LORA_RESET 8
|
|
||||||
|
|
||||||
#ifdef USE_SX1262
|
|
||||||
#define SX126X_CS LORA_CS
|
|
||||||
#define SX126X_DIO1 47
|
|
||||||
#define SX126X_BUSY 48
|
|
||||||
#define SX126X_RESET LORA_RESET
|
|
||||||
#define SX126X_DIO2_AS_RF_SWITCH
|
|
||||||
#define SX126X_DIO3_TCXO_VOLTAGE 1.8
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define SX126X_POWER_EN (4)
|
|
||||||
|
|
||||||
#define PIN_POWER_EN PIN_3V3_EN
|
|
||||||
#define PIN_3V3_EN (14)
|
|
||||||
|
|
||||||
#define LED_GREEN 46
|
|
||||||
#define LED_BLUE 45
|
|
||||||
|
|
||||||
#define PIN_LED1 LED_GREEN
|
|
||||||
#define PIN_LED2 LED_BLUE
|
|
||||||
|
|
||||||
#define LED_CONN LED_BLUE
|
|
||||||
#define LED_PIN LED_GREEN
|
|
||||||
#define ledOff(pin) pinMode(pin, INPUT)
|
|
||||||
|
|
||||||
#define LED_STATE_ON 1 // State when LED is litted
|
|
||||||
|
|
||||||
#define HAS_GPS 1
|
|
||||||
#define GPS_TX_PIN 43
|
|
||||||
#define GPS_RX_PIN 44
|
|
||||||
|
|
||||||
#define SPI_MOSI (11)
|
|
||||||
#define SPI_SCK (13)
|
|
||||||
#define SPI_MISO (10)
|
|
||||||
#define SPI_CS (12)
|
|
||||||
|
|
||||||
#define HAS_BUTTON 1
|
|
||||||
#define BUTTON_PIN 0
|
|
||||||
|
|
||||||
#define CANNED_MESSAGE_MODULE_ENABLE 1
|
|
||||||
#define USE_VIRTUAL_KEYBOARD 1
|
|
||||||
|
|
||||||
#define BATTERY_PIN 1
|
|
||||||
#define ADC_CHANNEL ADC1_GPIO1_CHANNEL
|
|
||||||
#define ADC_MULTIPLIER 1.667
|
|
||||||
|
|
||||||
#define PIN_BUZZER 38
|
|
||||||
|
|
||||||
#define HAS_SDCARD 1
|
|
||||||
#define SDCARD_USE_SPI1 1
|
|
||||||
#define SDCARD_CS 2
|
|
||||||
|
|
||||||
#define SPI_FREQUENCY 40000000
|
|
||||||
#define SPI_READ_FREQUENCY 16000000
|
|
||||||
|
|
||||||
#define SD_SPI_FREQUENCY 50000000
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -6,7 +6,7 @@ platform_packages =
|
|||||||
|
|
||||||
board = seeed-sensecap-indicator
|
board = seeed-sensecap-indicator
|
||||||
board_check = true
|
board_check = true
|
||||||
board_build.partitions = partition-table-8MB.csv
|
board_build.partitions = default_8MB.csv
|
||||||
upload_protocol = esptool
|
upload_protocol = esptool
|
||||||
|
|
||||||
build_flags = ${esp32_base.build_flags}
|
build_flags = ${esp32_base.build_flags}
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ lib_deps = ${esp32s3_base.lib_deps}
|
|||||||
lewisxhe/SensorLib@0.3.1
|
lewisxhe/SensorLib@0.3.1
|
||||||
https://github.com/pschatzmann/arduino-audio-driver/archive/refs/tags/v0.1.3.zip
|
https://github.com/pschatzmann/arduino-audio-driver/archive/refs/tags/v0.1.3.zip
|
||||||
https://github.com/mverch67/BQ27220/archive/07d92be846abd8a0258a50c23198dac0858b22ed.zip
|
https://github.com/mverch67/BQ27220/archive/07d92be846abd8a0258a50c23198dac0858b22ed.zip
|
||||||
https://github.com/mverch67/RotaryEncoder/archive/25a59d5745a6645536f921427d80b08e78f886d4.zip
|
https://github.com/mverch67/RotaryEncoder
|
||||||
|
|
||||||
[env:tlora-pager-tft]
|
[env:tlora-pager-tft]
|
||||||
board_level = extra
|
board_level = extra
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
[env:unphone]
|
[env:unphone]
|
||||||
extends = esp32s3_base
|
extends = esp32s3_base
|
||||||
board = unphone
|
board = unphone
|
||||||
board_build.partitions = partition-table-8MB.csv
|
board_build.partitions = default_8MB.csv
|
||||||
upload_speed = 921600
|
upload_speed = 921600
|
||||||
monitor_speed = 115200
|
monitor_speed = 115200
|
||||||
monitor_filters = esp32_exception_decoder
|
monitor_filters = esp32_exception_decoder
|
||||||
@@ -20,7 +20,6 @@ build_flags =
|
|||||||
-D UNPHONE_LORA=0
|
-D UNPHONE_LORA=0
|
||||||
-D UNPHONE_FACTORY_MODE=0
|
-D UNPHONE_FACTORY_MODE=0
|
||||||
-D USE_SX127x
|
-D USE_SX127x
|
||||||
-D SDCARD_CS=43
|
|
||||||
|
|
||||||
build_src_filter =
|
build_src_filter =
|
||||||
${esp32s3_base.build_src_filter}
|
${esp32s3_base.build_src_filter}
|
||||||
@@ -42,7 +41,6 @@ build_flags =
|
|||||||
-D HAS_SCREEN=1
|
-D HAS_SCREEN=1
|
||||||
-D HAS_TFT=1
|
-D HAS_TFT=1
|
||||||
-D HAS_SDCARD
|
-D HAS_SDCARD
|
||||||
-D SDCARD_CS=43
|
|
||||||
-D DISPLAY_SET_RESOLUTION
|
-D DISPLAY_SET_RESOLUTION
|
||||||
-D RAM_SIZE=6144
|
-D RAM_SIZE=6144
|
||||||
-D LV_CACHE_DEF_SIZE=2097152
|
-D LV_CACHE_DEF_SIZE=2097152
|
||||||
|
|||||||
@@ -52,6 +52,7 @@
|
|||||||
#undef GPS_TX_PIN
|
#undef GPS_TX_PIN
|
||||||
|
|
||||||
#define SD_SPI_FREQUENCY 25000000
|
#define SD_SPI_FREQUENCY 25000000
|
||||||
|
#define SDCARD_CS 43
|
||||||
|
|
||||||
#define LED_PIN 13 // the red part of the RGB LED
|
#define LED_PIN 13 // the red part of the RGB LED
|
||||||
#define LED_STATE_ON 0 // State when LED is lit
|
#define LED_STATE_ON 0 // State when LED is lit
|
||||||
|
|||||||
@@ -3,10 +3,7 @@ extends = portduino_base
|
|||||||
build_flags = ${portduino_base.build_flags} -I variants/native/portduino
|
build_flags = ${portduino_base.build_flags} -I variants/native/portduino
|
||||||
-I /usr/include
|
-I /usr/include
|
||||||
board = cross_platform
|
board = cross_platform
|
||||||
lib_deps =
|
lib_deps = ${portduino_base.lib_deps}
|
||||||
${portduino_base.lib_deps}
|
|
||||||
melopero/Melopero RV3028@^1.1.0
|
|
||||||
|
|
||||||
build_src_filter = ${portduino_base.build_src_filter}
|
build_src_filter = ${portduino_base.build_src_filter}
|
||||||
|
|
||||||
[env:native]
|
[env:native]
|
||||||
|
|||||||
@@ -4,7 +4,4 @@
|
|||||||
#define CANNED_MESSAGE_MODULE_ENABLE 1
|
#define CANNED_MESSAGE_MODULE_ENABLE 1
|
||||||
#define HAS_GPS 1
|
#define HAS_GPS 1
|
||||||
#define MAX_RX_TOPHONE settingsMap[maxtophone]
|
#define MAX_RX_TOPHONE settingsMap[maxtophone]
|
||||||
#define MAX_NUM_NODES settingsMap[maxnodes]
|
#define MAX_NUM_NODES settingsMap[maxnodes]
|
||||||
|
|
||||||
// RAK12002 RTC Module
|
|
||||||
#define RV3028_RTC (uint8_t)0b1010010
|
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
; The very slick RAK wireless RAK 4631 / 4630 board - Unified firmware for 5005/19003, with or without OLED RAK 1921
|
; The very slick RAK wireless RAK 4631 / 4630 board - Unified firmware for 5005/19003, with or without OLED RAK 1921
|
||||||
[env:gat562_mesh_trial_tracker]
|
[env:gat562_mesh_trial_tracker]
|
||||||
extends = nrf52840_base
|
extends = nrf52840_base
|
||||||
board_level = extra
|
|
||||||
board = gat562_mesh_trial_tracker
|
board = gat562_mesh_trial_tracker
|
||||||
board_check = true
|
board_check = true
|
||||||
build_flags = ${nrf52840_base.build_flags}
|
build_flags = ${nrf52840_base.build_flags}
|
||||||
|
|||||||
@@ -208,7 +208,7 @@ No longer populated on PCB
|
|||||||
#undef AREF_VOLTAGE
|
#undef AREF_VOLTAGE
|
||||||
#define AREF_VOLTAGE 3.0
|
#define AREF_VOLTAGE 3.0
|
||||||
#define VBAT_AR_INTERNAL AR_INTERNAL_3_0
|
#define VBAT_AR_INTERNAL AR_INTERNAL_3_0
|
||||||
#define ADC_MULTIPLIER (4.916F)
|
#define ADC_MULTIPLIER (4.90F)
|
||||||
|
|
||||||
#define HAS_RTC 0
|
#define HAS_RTC 0
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|||||||
@@ -4,7 +4,6 @@
|
|||||||
[env:meshlink]
|
[env:meshlink]
|
||||||
extends = nrf52840_base
|
extends = nrf52840_base
|
||||||
board = meshlink
|
board = meshlink
|
||||||
board_level = extra
|
|
||||||
;board_check = true
|
;board_check = true
|
||||||
build_flags = ${nrf52840_base.build_flags}
|
build_flags = ${nrf52840_base.build_flags}
|
||||||
-I variants/nrf52840/meshlink
|
-I variants/nrf52840/meshlink
|
||||||
|
|||||||
@@ -4,7 +4,6 @@
|
|||||||
[env:meshlink_eink]
|
[env:meshlink_eink]
|
||||||
extends = nrf52840_base
|
extends = nrf52840_base
|
||||||
board = meshlink
|
board = meshlink
|
||||||
board_level = extra
|
|
||||||
;board_check = true
|
;board_check = true
|
||||||
build_flags = ${nrf52840_base.build_flags}
|
build_flags = ${nrf52840_base.build_flags}
|
||||||
-I variants/nrf52840/meshlink_eink
|
-I variants/nrf52840/meshlink_eink
|
||||||
|
|||||||
@@ -22,7 +22,6 @@ lib_deps =
|
|||||||
https://github.com/RAKWireless/RAK13800-W5100S/archive/1.0.2.zip
|
https://github.com/RAKWireless/RAK13800-W5100S/archive/1.0.2.zip
|
||||||
rakwireless/RAKwireless NCP5623 RGB LED library@^1.0.2
|
rakwireless/RAKwireless NCP5623 RGB LED library@^1.0.2
|
||||||
beegee-tokyo/RAK12035_SoilMoisture@^1.0.4
|
beegee-tokyo/RAK12035_SoilMoisture@^1.0.4
|
||||||
# renovate: datasource=git-refs depName=RAK12034-BMX160 packageName=https://github.com/RAKWireless/RAK12034-BMX160 gitBranch=main
|
|
||||||
https://github.com/RAKWireless/RAK12034-BMX160/archive/dcead07ffa267d3c906e9ca4a1330ab989e957e2.zip
|
https://github.com/RAKWireless/RAK12034-BMX160/archive/dcead07ffa267d3c906e9ca4a1330ab989e957e2.zip
|
||||||
|
|
||||||
; If not set we will default to uploading over serial (first it forces bootloader entry by talking 1200bps to cdcacm)
|
; If not set we will default to uploading over serial (first it forces bootloader entry by talking 1200bps to cdcacm)
|
||||||
|
|||||||
@@ -31,8 +31,7 @@ lib_deps =
|
|||||||
melopero/Melopero RV3028@^1.1.0
|
melopero/Melopero RV3028@^1.1.0
|
||||||
https://github.com/RAKWireless/RAK13800-W5100S/archive/1.0.2.zip
|
https://github.com/RAKWireless/RAK13800-W5100S/archive/1.0.2.zip
|
||||||
rakwireless/RAKwireless NCP5623 RGB LED library@^1.0.2
|
rakwireless/RAKwireless NCP5623 RGB LED library@^1.0.2
|
||||||
# renovate: datasource=git-refs depName=RAK12034-BMX160 packageName=https://github.com/RAKWireless/RAK12034-BMX160 gitBranch=main
|
https://github.com/meshtastic/RAK12034-BMX160/archive/4821355fb10390ba8557dc43ca29a023bcfbb9d9.zip
|
||||||
https://github.com/RAKWireless/RAK12034-BMX160/archive/dcead07ffa267d3c906e9ca4a1330ab989e957e2.zip
|
|
||||||
bblanchon/ArduinoJson @ 6.21.4
|
bblanchon/ArduinoJson @ 6.21.4
|
||||||
; If not set we will default to uploading over serial (first it forces bootloader entry by talking 1200bps to cdcacm)
|
; If not set we will default to uploading over serial (first it forces bootloader entry by talking 1200bps to cdcacm)
|
||||||
; Note: as of 6/2013 the serial/bootloader based programming takes approximately 30 seconds
|
; Note: as of 6/2013 the serial/bootloader based programming takes approximately 30 seconds
|
||||||
|
|||||||
@@ -124,7 +124,8 @@ extern "C" {
|
|||||||
#define GPS_RTC_INT (0 + 15) // P0.15, normal is LOW, wake by HIGH
|
#define GPS_RTC_INT (0 + 15) // P0.15, normal is LOW, wake by HIGH
|
||||||
#define GPS_RESETB_OUT (32 + 14) // P1.14, always input pull_up
|
#define GPS_RESETB_OUT (32 + 14) // P1.14, always input pull_up
|
||||||
|
|
||||||
#define BATTERY_PIN 2 // P0.02/AIN0, BAT_ADC
|
#define GPS_FIX_HOLD_TIME 15000 // ms
|
||||||
|
#define BATTERY_PIN 2 // P0.02/AIN0, BAT_ADC
|
||||||
#define BATTERY_IMMUTABLE
|
#define BATTERY_IMMUTABLE
|
||||||
#define ADC_MULTIPLIER (2.0F)
|
#define ADC_MULTIPLIER (2.0F)
|
||||||
// P0.04/AIN2 is VCC_ADC, P0.05/AIN3 is CHARGER_DET, P1.03 is CHARGE_STA, P1.04 is CHARGE_DONE
|
// P0.04/AIN2 is VCC_ADC, P0.05/AIN3 is CHARGER_DET, P1.03 is CHARGE_STA, P1.04 is CHARGE_DONE
|
||||||
|
|||||||
@@ -123,6 +123,7 @@ extern "C" {
|
|||||||
#define GPS_RESETB_OUT (32 + 14) // P1.14, awlays input pull_up
|
#define GPS_RESETB_OUT (32 + 14) // P1.14, awlays input pull_up
|
||||||
|
|
||||||
// #define GPS_THREAD_INTERVAL 50
|
// #define GPS_THREAD_INTERVAL 50
|
||||||
|
#define GPS_FIX_HOLD_TIME 15000 // ms
|
||||||
|
|
||||||
#define BATTERY_PIN 2
|
#define BATTERY_PIN 2
|
||||||
// #define ADC_CHANNEL ADC1_GPIO2_CHANNEL
|
// #define ADC_CHANNEL ADC1_GPIO2_CHANNEL
|
||||||
@@ -156,4 +157,4 @@ extern "C" {
|
|||||||
* Arduino objects - C++ only
|
* Arduino objects - C++ only
|
||||||
*----------------------------------------------------------------------------*/
|
*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#endif // _VARIANT_WIO_SDK_WM1110_
|
#endif // _VARIANT_WIO_SDK_WM1110_
|
||||||
@@ -1,79 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#define PINS_COUNT (25u)
|
|
||||||
#define NUM_DIGITAL_PINS (25u)
|
|
||||||
#define NUM_ANALOG_INPUTS (4u)
|
|
||||||
#define NUM_ANALOG_OUTPUTS (0u)
|
|
||||||
#define ADC_RESOLUTION (12u)
|
|
||||||
|
|
||||||
// LEDs
|
|
||||||
#define PIN_LED (24u)
|
|
||||||
|
|
||||||
// Serial
|
|
||||||
#define PIN_SERIAL1_TX (16u)
|
|
||||||
#define PIN_SERIAL1_RX (17u)
|
|
||||||
|
|
||||||
// SPI
|
|
||||||
#define PIN_SPI0_MISO (20u)
|
|
||||||
#define PIN_SPI0_MOSI (23u)
|
|
||||||
#define PIN_SPI0_SCK (22u)
|
|
||||||
#define PIN_SPI0_SS (21u)
|
|
||||||
|
|
||||||
// Connected to LoRa module
|
|
||||||
#define PIN_SPI1_MISO (12u)
|
|
||||||
#define PIN_SPI1_MOSI (11u)
|
|
||||||
#define PIN_SPI1_SCK (10u)
|
|
||||||
#define PIN_SPI1_SS (9u)
|
|
||||||
#define RFM95W_SS (9u)
|
|
||||||
#define RFM95W_DIO0 (14u)
|
|
||||||
#define RFM95W_DIO1 (15u)
|
|
||||||
#define RFM95W_DIO2 (18u)
|
|
||||||
#define RFM95W_RST (13u)
|
|
||||||
#define RFM95W_SPI SPI1
|
|
||||||
|
|
||||||
// Wire
|
|
||||||
#define PIN_WIRE0_SDA (0u)
|
|
||||||
#define PIN_WIRE0_SCL (1u)
|
|
||||||
|
|
||||||
// Not pinned out
|
|
||||||
#define PIN_WIRE1_SDA (31u)
|
|
||||||
#define PIN_WIRE1_SCL (31u)
|
|
||||||
#define PIN_SERIAL2_RX (31u)
|
|
||||||
#define PIN_SERIAL2_TX (31u)
|
|
||||||
|
|
||||||
#define SERIAL_HOWMANY (1u)
|
|
||||||
#define SPI_HOWMANY (2u)
|
|
||||||
#define WIRE_HOWMANY (1u)
|
|
||||||
|
|
||||||
#define LED_BUILTIN PIN_LED
|
|
||||||
|
|
||||||
static const uint8_t D0 = (16u);
|
|
||||||
static const uint8_t D1 = (17u);
|
|
||||||
static const uint8_t D2 = (20u);
|
|
||||||
static const uint8_t D3 = (23u);
|
|
||||||
static const uint8_t D4 = (22u);
|
|
||||||
static const uint8_t D5 = (2u);
|
|
||||||
static const uint8_t D6 = (3u);
|
|
||||||
static const uint8_t D7 = (0u);
|
|
||||||
static const uint8_t D8 = (1u);
|
|
||||||
static const uint8_t D9 = (4u);
|
|
||||||
static const uint8_t D10 = (5u);
|
|
||||||
static const uint8_t D11 = (6u);
|
|
||||||
static const uint8_t D12 = (7u);
|
|
||||||
static const uint8_t D13 = (8u);
|
|
||||||
static const uint8_t D14 = (13u);
|
|
||||||
static const uint8_t D15 = (14u);
|
|
||||||
static const uint8_t D16 = (15u);
|
|
||||||
static const uint8_t D17 = (18u);
|
|
||||||
static const uint8_t D18 = (24u);
|
|
||||||
|
|
||||||
static const uint8_t A0 = (26u);
|
|
||||||
static const uint8_t A1 = (27u);
|
|
||||||
static const uint8_t A2 = (28u);
|
|
||||||
static const uint8_t A3 = (29u);
|
|
||||||
static const uint8_t A4 = (19u);
|
|
||||||
static const uint8_t A5 = (21u);
|
|
||||||
|
|
||||||
#ifndef SS
|
|
||||||
#define SS PIN_SPI1_SS
|
|
||||||
#endif
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user