diff --git a/.github/actions/setup-base/action.yml b/.github/actions/setup-base/action.yml
index 929c1df38..c0f6c4e66 100644
--- a/.github/actions/setup-base/action.yml
+++ b/.github/actions/setup-base/action.yml
@@ -11,6 +11,11 @@ runs:
ref: ${{github.event.pull_request.head.ref}}
repository: ${{github.event.pull_request.head.repo.full_name}}
+ - name: Uncomment build epoch
+ shell: bash
+ run: |
+ sed -i 's/#-DBUILD_EPOCH=$UNIX_TIME/-DBUILD_EPOCH=$UNIX_TIME/' platformio.ini
+
- name: Install dependencies
shell: bash
run: |
diff --git a/.github/workflows/generate-userprefs.yml b/.github/workflows/generate-userprefs.yml
new file mode 100644
index 000000000..10dd1ff7d
--- /dev/null
+++ b/.github/workflows/generate-userprefs.yml
@@ -0,0 +1,35 @@
+name: Generate UsersPrefs JSON manifest
+
+on:
+ push:
+ paths:
+ - userPrefs.h
+ branches:
+ - master
+
+jobs:
+ generate-userprefs:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+
+ - name: Install Clang
+ run: sudo apt-get install -y clang
+
+ - name: Install trunk
+ run: curl https://get.trunk.io -fsSL | bash
+
+ - name: Generate userPrefs.jsom
+ run: python3 ./bin/build-userprefs-json.py
+
+ - name: Trunk format json
+ run: trunk format userPrefs.json
+
+ - name: Commit userPrefs.json
+ run: |
+ git config --global user.email "actions@github.com"
+ git config --global user.name "GitHub Actions"
+ git add userPrefs.json
+ git commit -m "Update userPrefs.json"
+ git push
diff --git a/.github/workflows/update_protobufs.yml b/.github/workflows/update_protobufs.yml
index 7ce767370..f1c92b860 100644
--- a/.github/workflows/update_protobufs.yml
+++ b/.github/workflows/update_protobufs.yml
@@ -17,9 +17,9 @@ jobs:
- name: Download nanopb
run: |
- wget https://jpa.kapsi.fi/nanopb/download/nanopb-0.4.8-linux-x86.tar.gz
- tar xvzf nanopb-0.4.8-linux-x86.tar.gz
- mv nanopb-0.4.8-linux-x86 nanopb-0.4.8
+ wget https://jpa.kapsi.fi/nanopb/download/nanopb-0.4.9-linux-x86.tar.gz
+ tar xvzf nanopb-0.4.9-linux-x86.tar.gz
+ mv nanopb-0.4.9-linux-x86 nanopb-0.4.9
- name: Re-generate protocol buffers
run: |
diff --git a/.gitignore b/.gitignore
index 0f2202f8d..28f9a24cc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,4 @@
.pio
-main/configuration.h
-main/credentials.h
# ignore vscode IDE settings files
.vscode/*
@@ -32,4 +30,4 @@ release/
.vscode/extensions.json
/compile_commands.json
src/mesh/raspihttp/certificate.pem
-src/mesh/raspihttp/private_key.pem
\ No newline at end of file
+src/mesh/raspihttp/private_key.pem
diff --git a/.trunk/trunk.yaml b/.trunk/trunk.yaml
index 9ed720c3f..ea4045a16 100644
--- a/.trunk/trunk.yaml
+++ b/.trunk/trunk.yaml
@@ -11,7 +11,7 @@ lint:
- trufflehog@3.82.6
- yamllint@1.35.1
- bandit@1.7.10
- - checkov@3.2.255
+ - checkov@3.2.256
- terrascan@1.19.1
- trivy@0.55.2
#- trufflehog@3.63.2-rc0
@@ -28,7 +28,7 @@ lint:
- shellcheck@0.10.0
- black@24.8.0
- git-diff-check
- - gitleaks@8.19.3
+ - gitleaks@8.20.0
- clang-format@16.0.3
- prettier@3.3.3
ignore:
diff --git a/bin/build-userprefs-json.py b/bin/build-userprefs-json.py
new file mode 100644
index 000000000..58f460bcf
--- /dev/null
+++ b/bin/build-userprefs-json.py
@@ -0,0 +1,48 @@
+import json
+import subprocess
+import re
+
+def get_macros_from_header(header_file):
+ # Run clang to preprocess the header file and capture the output
+ result = subprocess.run(['clang', '-E', '-dM', header_file], capture_output=True, text=True)
+ if result.returncode != 0:
+ raise RuntimeError(f"Clang preprocessing failed: {result.stderr}")
+
+ # Extract macros from the output
+ macros = {}
+ macro_pattern = re.compile(r'#define\s+(\w+)\s+(.*)')
+ for line in result.stdout.splitlines():
+ match = macro_pattern.match(line)
+ if match and 'USERPREFS_' in line and '_USERPREFS_' not in line:
+ macros[match.group(1)] = match.group(2)
+
+ return macros
+
+def write_macros_to_json(macros, output_file):
+ with open(output_file, 'w') as f:
+ json.dump(macros, f, indent=4)
+
+def main():
+ header_file = 'userPrefs.h'
+ output_file = 'userPrefs.json'
+ # Uncomment all macros in the header file
+ with open(header_file, 'r') as file:
+ lines = file.readlines()
+
+ uncommented_lines = []
+ for line in lines:
+ stripped_line = line.strip().replace('/*', '').replace('*/', '')
+ if stripped_line.startswith('//') and 'USERPREFS_' in stripped_line:
+ # Replace "//"
+ stripped_line = stripped_line.replace('//', '')
+ uncommented_lines.append(stripped_line + '\n')
+
+ with open(header_file, 'w') as file:
+ for line in uncommented_lines:
+ file.write(line)
+ macros = get_macros_from_header(header_file)
+ write_macros_to_json(macros, output_file)
+ print(f"Macros have been written to {output_file}")
+
+if __name__ == "__main__":
+ main()
\ No newline at end of file
diff --git a/bin/regen-protos.bat b/bin/regen-protos.bat
index f28ef0025..7fa8f333d 100644
--- a/bin/regen-protos.bat
+++ b/bin/regen-protos.bat
@@ -1 +1 @@
-cd protobufs && ..\nanopb-0.4.8\generator-bin\protoc.exe --experimental_allow_proto3_optional "--nanopb_out=-S.cpp -v:..\src\mesh\generated" -I=..\protobufs\ ..\protobufs\meshtastic\*.proto
+cd protobufs && ..\nanopb-0.4.9\generator-bin\protoc.exe --experimental_allow_proto3_optional "--nanopb_out=-S.cpp -v:..\src\mesh\generated" -I=..\protobufs\ ..\protobufs\meshtastic\*.proto
diff --git a/bin/regen-protos.sh b/bin/regen-protos.sh
index 2e60784e3..12546bfdc 100755
--- a/bin/regen-protos.sh
+++ b/bin/regen-protos.sh
@@ -2,10 +2,10 @@
set -e
-echo "This script requires https://jpa.kapsi.fi/nanopb/download/ version 0.4.8 to be located in the"
+echo "This script requires https://jpa.kapsi.fi/nanopb/download/ version 0.4.9 to be located in the"
echo "firmware root directory if the following step fails, you should download the correct"
-echo "prebuilt binaries for your computer into nanopb-0.4.8"
+echo "prebuilt binaries for your computer into nanopb-0.4.9"
# the nanopb tool seems to require that the .options file be in the current directory!
cd protobufs
-../nanopb-0.4.8/generator-bin/protoc --experimental_allow_proto3_optional "--nanopb_out=-S.cpp -v:../src/mesh/generated/" -I=../protobufs meshtastic/*.proto
+../nanopb-0.4.9/generator-bin/protoc --experimental_allow_proto3_optional "--nanopb_out=-S.cpp -v:../src/mesh/generated/" -I=../protobufs meshtastic/*.proto
diff --git a/boards/lora-relay-v1.json b/boards/lora-relay-v1.json
deleted file mode 100644
index b390b8404..000000000
--- a/boards/lora-relay-v1.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
- "build": {
- "arduino": {
- "ldscript": "nrf52840_s140_v6.ld"
- },
- "core": "nRF5",
- "cpu": "cortex-m4",
- "extra_flags": "-DARDUINO_NRF52840_LORA_RELAY_V1 -DNRF52840_XXAA",
- "f_cpu": "64000000L",
- "hwids": [["0x239A", "0x4404"]],
- "usb_product": "LORA_RELAY",
- "mcu": "nrf52840",
- "variant": "lora_relay_v1",
- "variants_dir": "variants",
- "bsp": {
- "name": "adafruit"
- },
- "softdevice": {
- "sd_flags": "-DS140",
- "sd_name": "s140",
- "sd_version": "6.1.1",
- "sd_fwid": "0x00B6"
- },
- "bootloader": {
- "settings_addr": "0xFF000"
- }
- },
- "connectivity": ["bluetooth"],
- "debug": {
- "jlink_device": "nRF52840_xxAA",
- "onboard_tools": ["jlink"],
- "svd_path": "nrf52840.svd",
- "openocd_target": "nrf52840-mdk-rs"
- },
- "frameworks": ["arduino"],
- "name": "Meshtastic Lora Relay V1 (Adafruit BSP)",
- "upload": {
- "maximum_ram_size": 248832,
- "maximum_size": 815104,
- "require_upload_port": true,
- "speed": 115200,
- "protocol": "jlink",
- "protocols": ["jlink", "nrfjprog", "stlink"]
- },
- "url": "https://github.com/BigCorvus/SX1262-LoRa-BLE-Relay",
- "vendor": "BigCorvus"
-}
diff --git a/boards/lora-relay-v2.json b/boards/lora-relay-v2.json
deleted file mode 100644
index 52b775e58..000000000
--- a/boards/lora-relay-v2.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
- "build": {
- "arduino": {
- "ldscript": "nrf52840_s140_v6.ld"
- },
- "core": "nRF5",
- "cpu": "cortex-m4",
- "extra_flags": "-DARDUINO_NRF52840_LORA_RELAY_V2 -DNRF52840_XXAA",
- "f_cpu": "64000000L",
- "hwids": [["0x239A", "0x4406"]],
- "usb_product": "LORA_RELAY",
- "mcu": "nrf52840",
- "variant": "lora_relay_v2",
- "variants_dir": "variants",
- "bsp": {
- "name": "adafruit"
- },
- "softdevice": {
- "sd_flags": "-DS140",
- "sd_name": "s140",
- "sd_version": "6.1.1",
- "sd_fwid": "0x00B6"
- },
- "bootloader": {
- "settings_addr": "0xFF000"
- }
- },
- "connectivity": ["bluetooth"],
- "debug": {
- "jlink_device": "nRF52840_xxAA",
- "onboard_tools": ["jlink"],
- "svd_path": "nrf52840.svd",
- "openocd_target": "nrf52840-mdk-rs"
- },
- "frameworks": ["arduino"],
- "name": "Meshtastic Lora Relay V1 (Adafruit BSP)",
- "upload": {
- "maximum_ram_size": 248832,
- "maximum_size": 815104,
- "require_upload_port": true,
- "speed": 115200,
- "protocol": "jlink",
- "protocols": ["jlink", "nrfjprog", "stlink"]
- },
- "url": "https://github.com/BigCorvus/SX1262-LoRa-BLE-Relay",
- "vendor": "BigCorvus"
-}
diff --git a/boards/nrf52840_dk_modified.json b/boards/nrf52840_dk_modified.json
deleted file mode 100644
index 2932cb4b9..000000000
--- a/boards/nrf52840_dk_modified.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
- "build": {
- "arduino": {
- "ldscript": "nrf52840_s113_v7.ld"
- },
- "core": "nRF5",
- "cpu": "cortex-m4",
- "extra_flags": "-DARDUINO_NRF52840_PCA10056 -DNRF52840_XXAA",
- "f_cpu": "64000000L",
- "hwids": [["0x239A", "0x4404"]],
- "usb_product": "nrf52840dk",
- "mcu": "nrf52840",
- "variant": "pca10056-rc-clock",
- "variants_dir": "variants",
- "bsp": {
- "name": "adafruit"
- },
- "softdevice": {
- "sd_flags": "-DS140",
- "sd_name": "s140",
- "sd_version": "6.1.1",
- "sd_fwid": "0x00B6"
- },
- "bootloader": {
- "settings_addr": "0xFF000"
- }
- },
- "connectivity": ["bluetooth"],
- "debug": {
- "jlink_device": "nRF52840_xxAA",
- "onboard_tools": ["jlink"],
- "svd_path": "nrf52840.svd",
- "openocd_target": "nrf52840-mdk-rs"
- },
- "frameworks": ["arduino"],
- "name": "A modified NRF52840-DK devboard (Adafruit BSP)",
- "upload": {
- "maximum_ram_size": 248832,
- "maximum_size": 815104,
- "require_upload_port": true,
- "speed": 115200,
- "protocol": "jlink",
- "protocols": ["jlink", "nrfjprog", "stlink"]
- },
- "url": "https://meshtastic.org/",
- "vendor": "Nordic Semi"
-}
diff --git a/boards/ppr.json b/boards/ppr.json
deleted file mode 100644
index 15e3025c0..000000000
--- a/boards/ppr.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
- "build": {
- "arduino": {
- "ldscript": "nrf52840_s140_v6.ld"
- },
- "core": "nRF5",
- "cpu": "cortex-m4",
- "extra_flags": "-DARDUINO_NRF52840_PPR -DNRF52840_XXAA",
- "f_cpu": "64000000L",
- "hwids": [["0x239A", "0x4403"]],
- "usb_product": "PPR",
- "mcu": "nrf52840",
- "variant": "ppr",
- "variants_dir": "variants",
- "bsp": {
- "name": "adafruit"
- },
- "softdevice": {
- "sd_flags": "-DS140",
- "sd_name": "s140",
- "sd_version": "6.1.1",
- "sd_fwid": "0x00B6"
- },
- "bootloader": {
- "settings_addr": "0xFF000"
- }
- },
- "connectivity": ["bluetooth"],
- "debug": {
- "jlink_device": "nRF52840_xxAA",
- "onboard_tools": ["jlink"],
- "svd_path": "nrf52840.svd",
- "openocd_target": "nrf52840-mdk-rs"
- },
- "frameworks": ["arduino"],
- "name": "Meshtastic PPR (Adafruit BSP)",
- "upload": {
- "maximum_ram_size": 248832,
- "maximum_size": 815104,
- "require_upload_port": true,
- "speed": 115200,
- "protocol": "jlink",
- "protocols": ["jlink", "nrfjprog", "stlink"]
- },
- "url": "https://meshtastic.org/",
- "vendor": "Othernet"
-}
diff --git a/boards/ppr1.json b/boards/ppr1.json
deleted file mode 100644
index 35bf7d1e4..000000000
--- a/boards/ppr1.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
- "build": {
- "arduino": {
- "ldscript": "nrf52833_s113_v7.ld"
- },
- "core": "nRF5",
- "cpu": "cortex-m4",
- "extra_flags": "-DARDUINO_NRF52833_PPR -DNRF52833_XXAA",
- "f_cpu": "64000000L",
- "hwids": [["0x239A", "0x4406"]],
- "usb_product": "PPR",
- "mcu": "nrf52833",
- "variant": "ppr",
- "variants_dir": "variants",
- "bsp": {
- "name": "adafruit"
- },
- "softdevice": {
- "sd_flags": "-DS113",
- "sd_name": "s113",
- "sd_version": "7.2.0",
- "sd_fwid": "0x00b6"
- },
- "bootloader": {
- "settings_addr": "0xFF000"
- }
- },
- "connectivity": ["bluetooth"],
- "debug": {
- "jlink_device": "nRF52833_xxAA",
- "onboard_tools": ["jlink"],
- "svd_path": "nrf52833.svd",
- "openocd_target": "nrf52840-mdk-rs"
- },
- "frameworks": ["arduino"],
- "name": "Meshtastic PPR1 (Adafruit BSP)",
- "upload": {
- "maximum_ram_size": 248832,
- "maximum_size": 815104,
- "require_upload_port": true,
- "speed": 115200,
- "protocol": "jlink",
- "protocols": ["jlink", "nrfjprog", "stlink"]
- },
- "url": "https://meshtastic.org/",
- "vendor": "Othernet"
-}
diff --git a/platformio.ini b/platformio.ini
index 64d9e7754..2f76c8236 100644
--- a/platformio.ini
+++ b/platformio.ini
@@ -17,11 +17,9 @@ default_envs = tbeam
;default_envs = tlora-v2-1-1_6
;default_envs = tlora-v2-1-1_6-tcxo
;default_envs = tlora-t3s3-v1
-;default_envs = lora-relay-v1 # nrf board
;default_envs = t-echo
;default_envs = canaryone
-;default_envs = nrf52840dk-geeksville
-;default_envs = native # lora-relay-v1 # nrf52840dk-geeksville # linux # or if you'd like to change the default to something like lora-relay-v1 put that here
+;default_envs = native
;default_envs = nano-g1
;default_envs = pca10059_diy_eink
;default_envs = meshtastic-diy-v1
@@ -82,7 +80,7 @@ build_flags = -Wno-missing-field-initializers
-DRADIOLIB_EXCLUDE_LORAWAN=1
-DMESHTASTIC_EXCLUDE_DROPZONE=1
-DMESHTASTIC_EXCLUDE_REMOTEHARDWARE=1
- -DBUILD_EPOCH=$UNIX_TIME
+ #-DBUILD_EPOCH=$UNIX_TIME
;-D OLED_PL
monitor_speed = 115200
@@ -154,6 +152,8 @@ lib_deps =
ClosedCube OPT3001@^1.1.2
emotibit/EmotiBit MLX90632@^1.0.8
dfrobot/DFRobot_RTU@^1.0.3
+ sparkfun/SparkFun MAX3010x Pulse and Proximity Sensor Library@^1.1.2
+ adafruit/Adafruit MLX90614 Library@^2.1.5
https://github.com/boschsensortec/Bosch-BSEC2-Library#v1.7.2502
boschsensortec/BME68x Sensor Library@^1.1.40407
diff --git a/protobufs b/protobufs
index b41970669..c9ae7fd47 160000
--- a/protobufs
+++ b/protobufs
@@ -1 +1 @@
-Subproject commit b419706693e0120f7b032d0be0121ae758cfd6e4
+Subproject commit c9ae7fd478bffe5f954b30de6cb140821fe9ff52
diff --git a/src/configuration.h b/src/configuration.h
index 7db600a31..1df40a797 100644
--- a/src/configuration.h
+++ b/src/configuration.h
@@ -144,6 +144,8 @@ along with this program. If not, see .
#define MLX90632_ADDR 0x3A
#define DFROBOT_LARK_ADDR 0x42
#define NAU7802_ADDR 0x2A
+#define MAX30102_ADDR 0x57
+#define MLX90614_ADDR 0x5A
// -----------------------------------------------------------------------------
// ACCELEROMETER
diff --git a/src/detect/ScanI2C.h b/src/detect/ScanI2C.h
index 3b49026ce..920af06c7 100644
--- a/src/detect/ScanI2C.h
+++ b/src/detect/ScanI2C.h
@@ -52,13 +52,15 @@ class ScanI2C
TSL2591,
OPT3001,
MLX90632,
+ MLX90614,
AHT10,
BMX160,
DFROBOT_LARK,
NAU7802,
FT6336U,
STK8BAXX,
- ICM20948
+ ICM20948,
+ MAX30102
} DeviceType;
// typedef uint8_t DeviceAddress;
diff --git a/src/detect/ScanI2CTwoWire.cpp b/src/detect/ScanI2CTwoWire.cpp
index 1a0bffc35..5cd07b7cc 100644
--- a/src/detect/ScanI2CTwoWire.cpp
+++ b/src/detect/ScanI2CTwoWire.cpp
@@ -356,7 +356,18 @@ void ScanI2CTwoWire::scanPort(I2CPort port, uint8_t *address, uint8_t asize)
break;
SCAN_SIMPLE_CASE(SHTC3_ADDR, SHTC3, "SHTC3 sensor found\n")
- SCAN_SIMPLE_CASE(RCWL9620_ADDR, RCWL9620, "RCWL9620 sensor found\n")
+ case RCWL9620_ADDR:
+ // get MAX30102 PARTID
+ registerValue = getRegisterValue(ScanI2CTwoWire::RegisterLocation(addr, 0xFF), 1);
+ if (registerValue == 0x15) {
+ type = MAX30102;
+ LOG_INFO("MAX30102 Health sensor found\n");
+ break;
+ } else {
+ type = RCWL9620;
+ LOG_INFO("RCWL9620 sensor found\n");
+ }
+ break;
case LPS22HB_ADDR_ALT:
SCAN_SIMPLE_CASE(LPS22HB_ADDR, LPS22HB, "LPS22HB sensor found\n")
@@ -394,6 +405,7 @@ void ScanI2CTwoWire::scanPort(I2CPort port, uint8_t *address, uint8_t asize)
SCAN_SIMPLE_CASE(NAU7802_ADDR, NAU7802, "NAU7802 based scale found\n");
SCAN_SIMPLE_CASE(FT6336U_ADDR, FT6336U, "FT6336U touchscreen found\n");
SCAN_SIMPLE_CASE(MAX1704X_ADDR, MAX17048, "MAX17048 lipo fuel gauge found\n");
+ SCAN_SIMPLE_CASE(MLX90614_ADDR, MLX90614, "MLX90614 IR temp sensor found\n");
case ICM20948_ADDR: // same as BMX160_ADDR
case ICM20948_ADDR_ALT: // same as MPU6050_ADDR
diff --git a/src/graphics/Screen.cpp b/src/graphics/Screen.cpp
index 43b9dffcb..73fe7716e 100644
--- a/src/graphics/Screen.cpp
+++ b/src/graphics/Screen.cpp
@@ -1097,8 +1097,8 @@ static void drawNodes(OLEDDisplay *display, int16_t x, int16_t y, const NodeStat
{
char usersString[20];
snprintf(usersString, sizeof(usersString), "%d/%d", nodeStatus->getNumOnline(), nodeStatus->getNumTotal());
-#if (defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ST7701_CS) || defined(ST7735_CS) || defined(ST7789_CS) || \
- defined(USE_ST7789) || defined(HX8357_CS)) && \
+#if (defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ILI9342_DRIVER) || defined(ST7701_CS) || defined(ST7735_CS) || \
+ defined(ST7789_CS) || defined(USE_ST7789) || defined(HX8357_CS)) && \
!defined(DISPLAY_FORCE_SMALL_FONTS)
display->drawFastImage(x, y + 3, 8, 8, imgUser);
#else
@@ -1534,8 +1534,8 @@ Screen::Screen(ScanI2C::DeviceAddress address, meshtastic_Config_DisplayConfig_O
#elif defined(USE_SSD1306)
dispdev = new SSD1306Wire(address.address, -1, -1, geometry,
(address.port == ScanI2C::I2CPort::WIRE1) ? HW_I2C::I2C_TWO : HW_I2C::I2C_ONE);
-#elif defined(ST7735_CS) || defined(ILI9341_DRIVER) || defined(ST7701_CS) || defined(ST7789_CS) || defined(RAK14014) || \
- defined(HX8357_CS)
+#elif defined(ST7735_CS) || defined(ILI9341_DRIVER) || defined(ILI9342_DRIVER) || defined(ST7701_CS) || defined(ST7789_CS) || \
+ defined(RAK14014) || defined(HX8357_CS)
dispdev = new TFTDisplay(address.address, -1, -1, geometry,
(address.port == ScanI2C::I2CPort::WIRE1) ? HW_I2C::I2C_TWO : HW_I2C::I2C_ONE);
#elif defined(USE_EINK) && !defined(USE_EINK_DYNAMICDISPLAY)
@@ -1732,8 +1732,8 @@ void Screen::setup()
// Standard behaviour is to FLIP the screen (needed on T-Beam). If this config item is set, unflip it, and thereby logically
// flip it. If you have a headache now, you're welcome.
if (!config.display.flip_screen) {
-#if defined(ST7701_CS) || defined(ST7735_CS) || defined(ILI9341_DRIVER) || defined(ST7701_CS) || defined(ST7789_CS) || \
- defined(RAK14014) || defined(HX8357_CS)
+#if defined(ST7701_CS) || defined(ST7735_CS) || defined(ILI9341_DRIVER) || defined(ILI9342_DRIVER) || defined(ST7701_CS) || \
+ defined(ST7789_CS) || defined(RAK14014) || defined(HX8357_CS)
static_cast(dispdev)->flipScreenVertically();
#elif defined(USE_ST7789)
static_cast(dispdev)->flipScreenVertically();
@@ -2472,8 +2472,8 @@ void DebugInfo::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16
#ifdef ARCH_ESP32
if (!Throttle::isWithinTimespanMs(storeForwardModule->lastHeartbeat,
(storeForwardModule->heartbeatInterval * 1200))) { // no heartbeat, overlap a bit
-#if (defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ST7701_CS) || defined(ST7735_CS) || defined(ST7789_CS) || \
- defined(USE_ST7789) || defined(HX8357_CS)) && \
+#if (defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ILI9342_DRIVER) || defined(ST7701_CS) || defined(ST7735_CS) || \
+ defined(ST7789_CS) || defined(USE_ST7789) || defined(HX8357_CS) || ARCH_PORTDUINO) && \
!defined(DISPLAY_FORCE_SMALL_FONTS)
display->drawFastImage(x + SCREEN_WIDTH - 14 - display->getStringWidth(ourId), y + 3 + FONT_HEIGHT_SMALL, 12, 8,
imgQuestionL1);
@@ -2484,8 +2484,8 @@ void DebugInfo::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16
imgQuestion);
#endif
} else {
-#if (defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ST7701_CS) || defined(ST7735_CS) || defined(ST7789_CS) || \
- defined(USE_ST7789) || defined(HX8357_CS)) && \
+#if (defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ILI9342_DRIVER) || defined(ST7701_CS) || defined(ST7735_CS) || \
+ defined(ST7789_CS) || defined(USE_ST7789) || defined(HX8357_CS)) && \
!defined(DISPLAY_FORCE_SMALL_FONTS)
display->drawFastImage(x + SCREEN_WIDTH - 18 - display->getStringWidth(ourId), y + 3 + FONT_HEIGHT_SMALL, 16, 8,
imgSFL1);
@@ -2499,8 +2499,8 @@ void DebugInfo::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16
#endif
} else {
// TODO: Raspberry Pi supports more than just the one screen size
-#if (defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ST7701_CS) || defined(ST7735_CS) || defined(ST7789_CS) || \
- defined(USE_ST7789) || defined(HX8357_CS) || ARCH_PORTDUINO) && \
+#if (defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ILI9342_DRIVER) || defined(ST7701_CS) || defined(ST7735_CS) || \
+ defined(ST7789_CS) || defined(USE_ST7789) || defined(HX8357_CS) || ARCH_PORTDUINO) && \
!defined(DISPLAY_FORCE_SMALL_FONTS)
display->drawFastImage(x + SCREEN_WIDTH - 14 - display->getStringWidth(ourId), y + 3 + FONT_HEIGHT_SMALL, 12, 8,
imgInfoL1);
diff --git a/src/graphics/ScreenFonts.h b/src/graphics/ScreenFonts.h
index 34c832635..c9ce961fa 100644
--- a/src/graphics/ScreenFonts.h
+++ b/src/graphics/ScreenFonts.h
@@ -12,8 +12,8 @@
#include "graphics/fonts/OLEDDisplayFontsUA.h"
#endif
-#if (defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ST7701_CS) || defined(ST7735_CS) || defined(ST7789_CS) || \
- defined(USE_ST7789) || defined(HX8357_CS)) && \
+#if (defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ILI9342_DRIVER) || defined(ST7701_CS) || defined(ST7735_CS) || \
+ defined(ST7789_CS) || defined(USE_ST7789) || defined(HX8357_CS)) && \
!defined(DISPLAY_FORCE_SMALL_FONTS)
// The screen is bigger so use bigger fonts
#define FONT_SMALL ArialMT_Plain_16 // Height: 19
@@ -41,4 +41,4 @@
#define FONT_HEIGHT_SMALL _fontHeight(FONT_SMALL)
#define FONT_HEIGHT_MEDIUM _fontHeight(FONT_MEDIUM)
-#define FONT_HEIGHT_LARGE _fontHeight(FONT_LARGE)
\ No newline at end of file
+#define FONT_HEIGHT_LARGE _fontHeight(FONT_LARGE)
diff --git a/src/graphics/TFTDisplay.cpp b/src/graphics/TFTDisplay.cpp
index 2793a9485..ff0e065b5 100644
--- a/src/graphics/TFTDisplay.cpp
+++ b/src/graphics/TFTDisplay.cpp
@@ -244,9 +244,9 @@ class LGFX : public lgfx::LGFX_Device
static LGFX *tft = nullptr;
-#elif defined(ILI9341_DRIVER)
+#elif defined(ILI9341_DRIVER) || defined(ILI9342_DRIVER)
-#include // Graphics and font library for ILI9341 driver chip
+#include // Graphics and font library for ILI9341/ILI9342 driver chip
#if defined(ILI9341_BACKLIGHT_EN) && !defined(TFT_BL)
#define TFT_BL ILI9341_BACKLIGHT_EN
@@ -254,7 +254,11 @@ static LGFX *tft = nullptr;
class LGFX : public lgfx::LGFX_Device
{
+#if defined(ILI9341_DRIVER)
lgfx::Panel_ILI9341 _panel_instance;
+#elif defined(ILI9342_DRIVER)
+ lgfx::Panel_ILI9342 _panel_instance;
+#endif
lgfx::Bus_SPI _bus_instance;
lgfx::Light_PWM _light_instance;
@@ -265,7 +269,11 @@ class LGFX : public lgfx::LGFX_Device
auto cfg = _bus_instance.config();
// configure SPI
+#if defined(ILI9341_DRIVER)
cfg.spi_host = ILI9341_SPI_HOST; // ESP32-S2,S3,C3 : SPI2_HOST or SPI3_HOST / ESP32 : VSPI_HOST or HSPI_HOST
+#elif defined(ILI9342_DRIVER)
+ cfg.spi_host = ILI9342_SPI_HOST; // ESP32-S2,S3,C3 : SPI2_HOST or SPI3_HOST / ESP32 : VSPI_HOST or HSPI_HOST
+#endif
cfg.spi_mode = 0;
cfg.freq_write = SPI_FREQUENCY; // SPI clock for transmission (up to 80MHz, rounded to the value obtained by dividing
// 80MHz by an integer)
@@ -336,7 +344,7 @@ class LGFX : public lgfx::LGFX_Device
static LGFX *tft = nullptr;
#elif defined(ST7735_CS)
-#include // Graphics and font library for ILI9341 driver chip
+#include // Graphics and font library for ILI9342 driver chip
static TFT_eSPI *tft = nullptr; // Invoke library, pins defined in User_Setup.h
#elif ARCH_PORTDUINO && HAS_SCREEN != 0 && !HAS_TFT
@@ -362,6 +370,8 @@ class LGFX : public lgfx::LGFX_Device
_panel_instance = new lgfx::Panel_ST7796;
else if (settingsMap[displayPanel] == ili9341)
_panel_instance = new lgfx::Panel_ILI9341;
+ else if (settingsMap[displayPanel] == ili9342)
+ _panel_instance = new lgfx::Panel_ILI9342;
else if (settingsMap[displayPanel] == ili9488)
_panel_instance = new lgfx::Panel_ILI9488;
else if (settingsMap[displayPanel] == hx8357d)
@@ -629,8 +639,8 @@ static LGFX *tft = nullptr;
#endif
-#if defined(ST7701_CS) || defined(ST7735_CS) || defined(ST7789_CS) || defined(ILI9341_DRIVER) || defined(RAK14014) || \
- defined(HX8357_CS) || (ARCH_PORTDUINO && HAS_SCREEN != 0)
+#if defined(ST7701_CS) || defined(ST7735_CS) || defined(ST7789_CS) || defined(ILI9341_DRIVER) || defined(ILI9342_DRIVER) || \
+ defined(RAK14014) || defined(HX8357_CS) || (ARCH_PORTDUINO && HAS_SCREEN != 0)
#include "SPILock.h"
#include "TFTDisplay.h"
#include
@@ -861,4 +871,4 @@ bool TFTDisplay::connect()
return true;
}
-#endif
\ No newline at end of file
+#endif
diff --git a/src/graphics/images.h b/src/graphics/images.h
index 7028f18e3..2b0854a33 100644
--- a/src/graphics/images.h
+++ b/src/graphics/images.h
@@ -20,8 +20,8 @@ const uint8_t bluetoothConnectedIcon[36] PROGMEM = {0xfe, 0x01, 0xff, 0x03, 0x03
0xfe, 0x31, 0x00, 0x30, 0x30, 0x30, 0x30, 0x30, 0xf0, 0x3f, 0xe0, 0x1f};
#endif
-#if (defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ST7701_CS) || defined(ST7735_CS) || defined(ST7789_CS) || \
- defined(USE_ST7789) || defined(HX8357_CS) || ARCH_PORTDUINO) && \
+#if (defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ILI9342_DRIVER) || defined(ST7701_CS) || defined(ST7735_CS) || \
+ defined(ST7789_CS) || defined(USE_ST7789) || defined(HX8357_CS) || ARCH_PORTDUINO) && \
!defined(DISPLAY_FORCE_SMALL_FONTS)
const uint8_t imgQuestionL1[] PROGMEM = {0xff, 0x01, 0x01, 0x32, 0x7b, 0x49, 0x49, 0x6f, 0x26, 0x01, 0x01, 0xff};
const uint8_t imgQuestionL2[] PROGMEM = {0x0f, 0x08, 0x08, 0x08, 0x06, 0x0f, 0x0f, 0x06, 0x08, 0x08, 0x08, 0x0f};
diff --git a/src/input/InputBroker.h b/src/input/InputBroker.h
index 17c621c8a..db7524bb0 100644
--- a/src/input/InputBroker.h
+++ b/src/input/InputBroker.h
@@ -18,6 +18,7 @@
#define INPUT_BROKER_MSG_RIGHT 0xb7
#define INPUT_BROKER_MSG_FN_SYMBOL_ON 0xf1
#define INPUT_BROKER_MSG_FN_SYMBOL_OFF 0xf2
+#define INPUT_BROKER_MSG_BLUETOOTH_TOGGLE 0xAA
typedef struct _InputEvent {
const char *source;
diff --git a/src/input/kbI2cBase.cpp b/src/input/kbI2cBase.cpp
index 4fbca76e5..8b201cd22 100644
--- a/src/input/kbI2cBase.cpp
+++ b/src/input/kbI2cBase.cpp
@@ -297,6 +297,7 @@ int32_t KbI2cBase::runOnce()
case 0x9e: // fn+g INPUT_BROKER_MSG_GPS_TOGGLE
case 0xaf: // fn+space INPUT_BROKER_MSG_SEND_PING
case 0x8b: // fn+del INPUT_BROKEN_MSG_DISMISS_FRAME
+ case 0xAA: // fn+b INPUT_BROKER_MSG_BLUETOOTH_TOGGLE
// just pass those unmodified
e.inputEvent = ANYKEY;
e.kbchar = c;
diff --git a/src/main.cpp b/src/main.cpp
index ff90d0d1a..bb8caee15 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -1,3 +1,4 @@
+#include "../userPrefs.h"
#include "configuration.h"
#if !MESHTASTIC_EXCLUDE_GPS
#include "GPS.h"
@@ -132,6 +133,8 @@ float tcxoVoltage = SX126X_DIO3_TCXO_VOLTAGE; // if TCXO is optional, put this h
using namespace concurrency;
+volatile static const char slipstreamTZString[] = USERPREFS_TZ_STRING;
+
// We always create a screen object, but we only init it if we find the hardware
graphics::Screen *screen = nullptr;
@@ -597,10 +600,12 @@ void setup()
SCANNER_TO_SENSORS_MAP(ScanI2C::DeviceType::TSL2591, meshtastic_TelemetrySensorType_TSL25911FN)
SCANNER_TO_SENSORS_MAP(ScanI2C::DeviceType::OPT3001, meshtastic_TelemetrySensorType_OPT3001)
SCANNER_TO_SENSORS_MAP(ScanI2C::DeviceType::MLX90632, meshtastic_TelemetrySensorType_MLX90632)
+ SCANNER_TO_SENSORS_MAP(ScanI2C::DeviceType::MLX90614, meshtastic_TelemetrySensorType_MLX90614)
SCANNER_TO_SENSORS_MAP(ScanI2C::DeviceType::SHT4X, meshtastic_TelemetrySensorType_SHT4X)
SCANNER_TO_SENSORS_MAP(ScanI2C::DeviceType::AHT10, meshtastic_TelemetrySensorType_AHT10)
SCANNER_TO_SENSORS_MAP(ScanI2C::DeviceType::DFROBOT_LARK, meshtastic_TelemetrySensorType_DFROBOT_LARK)
SCANNER_TO_SENSORS_MAP(ScanI2C::DeviceType::ICM20948, meshtastic_TelemetrySensorType_ICM20948)
+ SCANNER_TO_SENSORS_MAP(ScanI2C::DeviceType::MAX30102, meshtastic_TelemetrySensorType_MAX30102)
i2cScanner.reset();
#endif
@@ -808,10 +813,17 @@ void setup()
#endif
// setup TZ prior to time actions.
#if !MESHTASTIC_EXCLUDE_TZ
- if (*config.device.tzdef) {
+ LOG_DEBUG("Using compiled/slipstreamed %s\n", slipstreamTZString); // important, removing this clobbers our magic string
+ if (*config.device.tzdef && config.device.tzdef[0] != 0) {
+ LOG_DEBUG("Saved TZ: %s \n", config.device.tzdef);
setenv("TZ", config.device.tzdef, 1);
} else {
- setenv("TZ", "GMT0", 1);
+ if (strncmp((const char *)slipstreamTZString, "tzpl", 4) == 0) {
+ setenv("TZ", "GMT0", 1);
+ } else {
+ setenv("TZ", (const char *)slipstreamTZString, 1);
+ strcpy(config.device.tzdef, (const char *)slipstreamTZString);
+ }
}
tzset();
LOG_DEBUG("Set Timezone to %s\n", getenv("TZ"));
@@ -868,8 +880,8 @@ void setup()
#if !MESHTASTIC_EXCLUDE_I2C
// Don't call screen setup until after nodedb is setup (because we need
// the current region name)
-#if defined(ST7701_CS) || defined(ST7735_CS) || defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ST7789_CS) || \
- defined(HX8357_CS) || defined(USE_ST7789)
+#if defined(ST7701_CS) || defined(ST7735_CS) || defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ILI9342_DRIVER) || \
+ defined(ST7789_CS) || defined(HX8357_CS) || defined(USE_ST7789)
screen->setup();
#elif defined(ARCH_PORTDUINO)
if (screen_found.port != ScanI2C::I2CPort::NO_I2C || settingsMap[displayPanel]) {
@@ -1292,4 +1304,4 @@ void tft_task_handler(void *param = nullptr)
}
}
-#endif
\ No newline at end of file
+#endif
diff --git a/src/mesh/Channels.cpp b/src/mesh/Channels.cpp
index c8ac09a37..bb30e501d 100644
--- a/src/mesh/Channels.cpp
+++ b/src/mesh/Channels.cpp
@@ -76,6 +76,23 @@ meshtastic_Channel &Channels::fixupChannel(ChannelIndex chIndex)
return ch;
}
+void Channels::initDefaultLoraConfig()
+{
+ meshtastic_Config_LoRaConfig &loraConfig = config.lora;
+
+ loraConfig.modem_preset = meshtastic_Config_LoRaConfig_ModemPreset_LONG_FAST; // Default to Long Range & Fast
+ loraConfig.use_preset = true;
+ loraConfig.tx_power = 0; // default
+ loraConfig.channel_num = 0;
+
+#ifdef USERPREFS_LORACONFIG_MODEM_PRESET
+ loraConfig.modem_preset = USERPREFS_LORACONFIG_MODEM_PRESET;
+#endif
+#ifdef USERPREFS_LORACONFIG_CHANNEL_NUM
+ loraConfig.channel_num = USERPREFS_LORACONFIG_CHANNEL_NUM;
+#endif
+}
+
/**
* Write a default channel to the specified channel index
*/
@@ -83,12 +100,7 @@ void Channels::initDefaultChannel(ChannelIndex chIndex)
{
meshtastic_Channel &ch = getByIndex(chIndex);
meshtastic_ChannelSettings &channelSettings = ch.settings;
- meshtastic_Config_LoRaConfig &loraConfig = config.lora;
- loraConfig.modem_preset = meshtastic_Config_LoRaConfig_ModemPreset_LONG_FAST; // Default to Long Range & Fast
- loraConfig.use_preset = true;
- loraConfig.tx_power = 0; // default
- loraConfig.channel_num = 0;
uint8_t defaultpskIndex = 1;
channelSettings.psk.bytes[0] = defaultpskIndex;
channelSettings.psk.size = 1;
@@ -97,21 +109,14 @@ void Channels::initDefaultChannel(ChannelIndex chIndex)
channelSettings.has_module_settings = true;
ch.has_settings = true;
- ch.role = meshtastic_Channel_Role_PRIMARY;
+ ch.role = chIndex == 0 ? meshtastic_Channel_Role_PRIMARY : meshtastic_Channel_Role_SECONDARY;
-#ifdef USERPREFS_LORACONFIG_MODEM_PRESET
- loraConfig.modem_preset = USERPREFS_LORACONFIG_MODEM_PRESET;
-#endif
-#ifdef USERPREFS_LORACONFIG_CHANNEL_NUM
- loraConfig.channel_num = USERPREFS_LORACONFIG_CHANNEL_NUM;
-#endif
-
- // Install custom defaults. Will eventually support setting multiple default channels
- if (chIndex == 0) {
+ switch (chIndex) {
+ case 0:
#ifdef USERPREFS_CHANNEL_0_PSK
- static const uint8_t defaultpsk[] = USERPREFS_CHANNEL_0_PSK;
- memcpy(channelSettings.psk.bytes, defaultpsk, sizeof(defaultpsk));
- channelSettings.psk.size = sizeof(defaultpsk);
+ static const uint8_t defaultpsk0[] = USERPREFS_CHANNEL_0_PSK;
+ memcpy(channelSettings.psk.bytes, defaultpsk0, sizeof(defaultpsk0));
+ channelSettings.psk.size = sizeof(defaultpsk0);
#endif
#ifdef USERPREFS_CHANNEL_0_NAME
@@ -120,6 +125,37 @@ void Channels::initDefaultChannel(ChannelIndex chIndex)
#ifdef USERPREFS_CHANNEL_0_PRECISION
channelSettings.module_settings.position_precision = USERPREFS_CHANNEL_0_PRECISION;
#endif
+ break;
+ case 1:
+#ifdef USERPREFS_CHANNEL_1_PSK
+ static const uint8_t defaultpsk1[] = USERPREFS_CHANNEL_1_PSK;
+ memcpy(channelSettings.psk.bytes, defaultpsk1, sizeof(defaultpsk1));
+ channelSettings.psk.size = sizeof(defaultpsk1);
+
+#endif
+#ifdef USERPREFS_CHANNEL_1_NAME
+ strcpy(channelSettings.name, USERPREFS_CHANNEL_1_NAME);
+#endif
+#ifdef USERPREFS_CHANNEL_1_PRECISION
+ channelSettings.module_settings.position_precision = USERPREFS_CHANNEL_1_PRECISION;
+#endif
+ break;
+ case 2:
+#ifdef USERPREFS_CHANNEL_2_PSK
+ static const uint8_t defaultpsk2[] = USERPREFS_CHANNEL_2_PSK;
+ memcpy(channelSettings.psk.bytes, defaultpsk2, sizeof(defaultpsk2));
+ channelSettings.psk.size = sizeof(defaultpsk2);
+
+#endif
+#ifdef USERPREFS_CHANNEL_2_NAME
+ strcpy(channelSettings.name, USERPREFS_CHANNEL_2_NAME);
+#endif
+#ifdef USERPREFS_CHANNEL_2_PRECISION
+ channelSettings.module_settings.position_precision = USERPREFS_CHANNEL_2_PRECISION;
+#endif
+ break;
+ default:
+ break;
}
}
@@ -209,7 +245,15 @@ void Channels::initDefaults()
channelFile.channels_count = MAX_NUM_CHANNELS;
for (int i = 0; i < channelFile.channels_count; i++)
fixupChannel(i);
+ initDefaultLoraConfig();
+
+#ifdef USERPREFS_CHANNELS_TO_WRITE
+ for (int i = 0; i < USERPREFS_CHANNELS_TO_WRITE; i++) {
+ initDefaultChannel(i);
+ }
+#else
initDefaultChannel(0);
+#endif
}
void Channels::onConfigChanged()
@@ -359,4 +403,4 @@ bool Channels::decryptForHash(ChannelIndex chIndex, ChannelHash channelHash)
int16_t Channels::setActiveByIndex(ChannelIndex channelIndex)
{
return setCrypto(channelIndex);
-}
+}
\ No newline at end of file
diff --git a/src/mesh/Channels.h b/src/mesh/Channels.h
index e5a750f71..b0c9b3d07 100644
--- a/src/mesh/Channels.h
+++ b/src/mesh/Channels.h
@@ -117,7 +117,12 @@ class Channels
meshtastic_Channel &fixupChannel(ChannelIndex chIndex);
/**
- * Write a default channel to the specified channel index
+ * Writes the default lora config
+ */
+ void initDefaultLoraConfig();
+
+ /**
+ * Write default channels defined in UserPrefs
*/
void initDefaultChannel(ChannelIndex chIndex);
diff --git a/src/mesh/CryptoEngine.cpp b/src/mesh/CryptoEngine.cpp
index 5c8fdf6ae..a875eb8b2 100644
--- a/src/mesh/CryptoEngine.cpp
+++ b/src/mesh/CryptoEngine.cpp
@@ -102,9 +102,9 @@ bool CryptoEngine::decryptCurve25519(uint32_t fromNode, uint64_t packetNum, size
uint8_t *auth; // set to last 8 bytes of text?
uint32_t extraNonce; // pointer was not really used
auth = bytes + numBytes - 12;
-#ifndef PIO_UNIT_TESTING
memcpy(&extraNonce, auth + 8,
sizeof(uint32_t)); // do not use dereference on potential non aligned pointers : (uint32_t *)(auth + 8);
+#ifndef PIO_UNIT_TESTING
LOG_INFO("Random nonce value: %d\n", extraNonce);
meshtastic_NodeInfoLite *node = nodeDB->getMeshNode(fromNode);
diff --git a/src/mesh/FloodingRouter.cpp b/src/mesh/FloodingRouter.cpp
index 037fdd2ae..23f6b6f92 100644
--- a/src/mesh/FloodingRouter.cpp
+++ b/src/mesh/FloodingRouter.cpp
@@ -22,10 +22,12 @@ bool FloodingRouter::shouldFilterReceived(const meshtastic_MeshPacket *p)
{
if (wasSeenRecently(p)) { // Note: this will also add a recent packet record
printPacket("Ignoring dupe incoming msg", p);
+ rxDupe++;
if (config.device.role != meshtastic_Config_DeviceConfig_Role_ROUTER &&
config.device.role != meshtastic_Config_DeviceConfig_Role_REPEATER) {
// cancel rebroadcast of this message *if* there was already one, unless we're a router/repeater!
- Router::cancelSending(p->from, p->id);
+ if (Router::cancelSending(p->from, p->id))
+ txRelayCanceled++;
}
return true;
}
@@ -36,12 +38,12 @@ bool FloodingRouter::shouldFilterReceived(const meshtastic_MeshPacket *p)
void FloodingRouter::sniffReceived(const meshtastic_MeshPacket *p, const meshtastic_Routing *c)
{
bool isAckorReply = (p->which_payload_variant == meshtastic_MeshPacket_decoded_tag) && (p->decoded.request_id != 0);
- if (isAckorReply && p->to != getNodeNum() && p->to != NODENUM_BROADCAST) {
+ if (isAckorReply && !isToUs(p) && p->to != NODENUM_BROADCAST) {
// do not flood direct message that is ACKed or replied to
LOG_DEBUG("Rxd an ACK/reply not for me, cancel rebroadcast.\n");
Router::cancelSending(p->to, p->decoded.request_id); // cancel rebroadcast for this DM
}
- if ((p->to != getNodeNum()) && (p->hop_limit > 0) && (getFrom(p) != getNodeNum())) {
+ if (!isToUs(p) && (p->hop_limit > 0) && !isFromUs(p)) {
if (p->id != 0) {
if (config.device.role != meshtastic_Config_DeviceConfig_Role_CLIENT_MUTE) {
meshtastic_MeshPacket *tosend = packetPool.allocCopy(*p); // keep a copy because we will be sending it
diff --git a/src/mesh/MeshModule.cpp b/src/mesh/MeshModule.cpp
index 3b137d4bd..c60404c98 100644
--- a/src/mesh/MeshModule.cpp
+++ b/src/mesh/MeshModule.cpp
@@ -86,7 +86,7 @@ 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
auto ourNodeNum = nodeDB->getNodeNum();
- bool toUs = mp.to == NODENUM_BROADCAST || mp.to == ourNodeNum;
+ bool toUs = mp.to == NODENUM_BROADCAST || isToUs(&mp);
for (auto i = modules->begin(); i != modules->end(); ++i) {
auto &pi = **i;
@@ -141,8 +141,7 @@ void MeshModule::callModules(meshtastic_MeshPacket &mp, RxSource src)
// because currently when the phone sends things, it sends things using the local node ID as the from address. A
// better solution (FIXME) would be to let phones have their own distinct addresses and we 'route' to them like
// any other node.
- if (isDecoded && mp.decoded.want_response && toUs && (getFrom(&mp) != ourNodeNum || mp.to == ourNodeNum) &&
- !currentReply) {
+ if (isDecoded && mp.decoded.want_response && toUs && (!isFromUs(&mp) || isToUs(&mp)) && !currentReply) {
pi.sendResponse(mp);
ignoreRequest = ignoreRequest || pi.ignoreRequest; // If at least one module asks it, we may ignore a request
LOG_INFO("Asked module '%s' to send a response\n", pi.name);
@@ -241,7 +240,7 @@ std::vector MeshModule::GetMeshModulesWithUIFrames()
for (auto i = modules->begin(); i != modules->end(); ++i) {
auto &pi = **i;
if (pi.wantUIFrame()) {
- LOG_DEBUG("Module wants a UI Frame\n");
+ LOG_DEBUG("%s wants a UI Frame\n", pi.name);
modulesWithUIFrames.push_back(&pi);
}
}
@@ -256,7 +255,7 @@ void MeshModule::observeUIEvents(Observer *observer)
auto &pi = **i;
Observable *observable = pi.getUIFrameObservable();
if (observable != NULL) {
- LOG_DEBUG("Module wants a UI Frame\n");
+ LOG_DEBUG("%s wants a UI Frame\n", pi.name);
observer->observe(observable);
}
}
@@ -297,4 +296,4 @@ bool MeshModule::isRequestingFocus()
} else
return false;
}
-#endif
\ No newline at end of file
+#endif
diff --git a/src/mesh/MeshPacketQueue.cpp b/src/mesh/MeshPacketQueue.cpp
index da49ecb61..99ef41c1e 100644
--- a/src/mesh/MeshPacketQueue.cpp
+++ b/src/mesh/MeshPacketQueue.cpp
@@ -19,7 +19,7 @@ bool CompareMeshPacketFunc(const meshtastic_MeshPacket *p1, const meshtastic_Mes
auto p1p = getPriority(p1), p2p = getPriority(p2);
// If priorities differ, use that
// for equal priorities, prefer packets already on mesh.
- return (p1p != p2p) ? (p1p > p2p) : (getFrom(p1) != nodeDB->getNodeNum() && getFrom(p2) == nodeDB->getNodeNum());
+ return (p1p != p2p) ? (p1p > p2p) : (!isFromUs(p1) && isFromUs(p2));
}
MeshPacketQueue::MeshPacketQueue(size_t _maxLen) : maxLen(_maxLen) {}
diff --git a/src/mesh/MeshService.cpp b/src/mesh/MeshService.cpp
index a8a207352..655348bd5 100644
--- a/src/mesh/MeshService.cpp
+++ b/src/mesh/MeshService.cpp
@@ -406,4 +406,16 @@ int MeshService::onGPSChanged(const meshtastic::GPSStatus *newStatus)
bool MeshService::isToPhoneQueueEmpty()
{
return toPhoneQueue.isEmpty();
-}
\ No newline at end of file
+}
+
+uint32_t MeshService::GetTimeSinceMeshPacket(const meshtastic_MeshPacket *mp)
+{
+ uint32_t now = getTime();
+
+ uint32_t last_seen = mp->rx_time;
+ int delta = (int)(now - last_seen);
+ if (delta < 0) // our clock must be slightly off still - not set from GPS yet
+ delta = 0;
+
+ return delta;
+}
diff --git a/src/mesh/MeshService.h b/src/mesh/MeshService.h
index b91fedada..1ccca4e6d 100644
--- a/src/mesh/MeshService.h
+++ b/src/mesh/MeshService.h
@@ -151,6 +151,8 @@ class MeshService
ErrorCode sendQueueStatusToPhone(const meshtastic_QueueStatus &qs, ErrorCode res, uint32_t mesh_packet_id);
+ uint32_t GetTimeSinceMeshPacket(const meshtastic_MeshPacket *mp);
+
private:
#if HAS_GPS
/// Called when our gps position has changed - updates nodedb and sends Location message out into the mesh
@@ -163,4 +165,4 @@ class MeshService
friend class RoutingModule;
};
-extern MeshService *service;
\ No newline at end of file
+extern MeshService *service;
diff --git a/src/mesh/MeshTypes.h b/src/mesh/MeshTypes.h
index 90cfd5897..27d100fbe 100644
--- a/src/mesh/MeshTypes.h
+++ b/src/mesh/MeshTypes.h
@@ -50,5 +50,11 @@ extern Allocator &packetPool;
*/
NodeNum getFrom(const meshtastic_MeshPacket *p);
+// Returns true if the packet originated from the local node
+bool isFromUs(const meshtastic_MeshPacket *p);
+
+// Returns true if the packet is destined to us
+bool isToUs(const meshtastic_MeshPacket *p);
+
/* Some clients might not properly set priority, therefore we fix it here. */
void fixPriority(meshtastic_MeshPacket *p);
\ No newline at end of file
diff --git a/src/mesh/NodeDB.cpp b/src/mesh/NodeDB.cpp
index dc111e792..8924f3cde 100644
--- a/src/mesh/NodeDB.cpp
+++ b/src/mesh/NodeDB.cpp
@@ -196,6 +196,18 @@ NodeNum getFrom(const meshtastic_MeshPacket *p)
return (p->from == 0) ? nodeDB->getNodeNum() : p->from;
}
+// Returns true if the packet originated from the local node
+bool isFromUs(const meshtastic_MeshPacket *p)
+{
+ return p->from == 0 || p->from == nodeDB->getNodeNum();
+}
+
+// Returns true if the packet is destined to us
+bool isToUs(const meshtastic_MeshPacket *p)
+{
+ return p->to == nodeDB->getNodeNum();
+}
+
bool NodeDB::resetRadioConfig(bool factory_reset)
{
bool didFactoryReset = false;
@@ -312,8 +324,7 @@ void NodeDB::installDefaultConfig(bool preserveKey = false)
#ifdef USERPREFS_USE_ADMIN_KEY
memcpy(config.security.admin_key[0].bytes, USERPREFS_ADMIN_KEY, 32);
config.security.admin_key[0].size = 32;
-#else
- config.security.admin_key[0].size = 0;
+ config.security.admin_key_count = 1;
#endif
if (shouldPreserveKey) {
config.security.private_key.size = 32;
@@ -331,7 +342,9 @@ void NodeDB::installDefaultConfig(bool preserveKey = false)
#else
config.device.disable_triple_click = true;
#endif
-#if !HAS_GPS || defined(T_DECK) || defined(TLORA_T3S3_EPAPER)
+#if defined(USERPREFS_CONFIG_GPS_MODE)
+ config.position.gps_mode = USERPREFS_CONFIG_GPS_MODE;
+#elif !HAS_GPS || defined(T_DECK) || defined(TLORA_T3S3_EPAPER)
config.position.gps_mode = meshtastic_Config_PositionConfig_GpsMode_NOT_PRESENT;
#elif !defined(GPS_RX_PIN)
if (config.position.rx_gpio == 0)
@@ -353,8 +366,8 @@ void NodeDB::installDefaultConfig(bool preserveKey = false)
// FIXME: Default to bluetooth capability of platform as default
config.bluetooth.enabled = true;
config.bluetooth.fixed_pin = defaultBLEPin;
-#if defined(ST7735_CS) || defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ST7789_CS) || defined(HX8357_CS) || \
- defined(USE_ST7789)
+#if defined(ST7735_CS) || defined(USE_EINK) || defined(ILI9341_DRIVER) || defined(ILI9342_DRIVER) || defined(ST7789_CS) || \
+ defined(HX8357_CS) || defined(USE_ST7789)
bool hasScreen = true;
#elif ARCH_PORTDUINO
bool hasScreen = false;
@@ -527,6 +540,7 @@ void NodeDB::installRoleDefaults(meshtastic_Config_DeviceConfig_Role role)
moduleConfig.telemetry.device_update_interval = UINT32_MAX;
moduleConfig.telemetry.environment_update_interval = UINT32_MAX;
moduleConfig.telemetry.air_quality_interval = UINT32_MAX;
+ moduleConfig.telemetry.health_update_interval = UINT32_MAX;
}
}
@@ -537,6 +551,7 @@ void NodeDB::initModuleConfigIntervals()
moduleConfig.telemetry.environment_update_interval = 0;
moduleConfig.telemetry.air_quality_interval = 0;
moduleConfig.telemetry.power_update_interval = 0;
+ moduleConfig.telemetry.health_update_interval = 0;
moduleConfig.neighbor_info.update_interval = 0;
moduleConfig.paxcounter.paxcounter_update_interval = 0;
}
@@ -619,6 +634,8 @@ void NodeDB::installDefaultDeviceState()
// devicestate.node_db_lite_count = 0;
devicestate.version = DEVICESTATE_CUR_VER;
devicestate.receive_queue_count = 0; // Not yet implemented FIXME
+ devicestate.has_rx_waypoint = false;
+ devicestate.has_rx_text_message = false;
generatePacketId(); // FIXME - ugly way to init current_packet_id;
@@ -1212,4 +1229,4 @@ void recordCriticalError(meshtastic_CriticalErrorCode code, uint32_t address, co
LOG_ERROR("A critical failure occurred, portduino is exiting...");
exit(2);
#endif
-}
\ No newline at end of file
+}
diff --git a/src/mesh/RadioInterface.cpp b/src/mesh/RadioInterface.cpp
index b915f94bd..7501852f2 100644
--- a/src/mesh/RadioInterface.cpp
+++ b/src/mesh/RadioInterface.cpp
@@ -136,6 +136,17 @@ const RegionInfo regions[] = {
*/
RDEF(SG_923, 917.0f, 925.0f, 100, 0, 20, true, false, false),
+ /*
+ Philippines
+ 433 - 434.7 MHz <10 mW erp, NTC approved device required
+ 868 - 869.4 MHz <25 mW erp, NTC approved device required
+ 915 - 918 MHz <250 mW EIRP, no external antennna allowed
+ https://github.com/meshtastic/firmware/issues/4948#issuecomment-2394926135
+ */
+
+ RDEF(PH_433, 433.0f, 434.7f, 100, 0, 10, true, false, false), RDEF(PH_868, 868.0f, 869.4f, 100, 0, 14, true, false, false),
+ RDEF(PH_915, 915.0f, 918.0f, 100, 0, 24, true, false, false),
+
/*
2.4 GHZ WLAN Band equivalent. Only for SX128x chips.
*/
@@ -614,4 +625,4 @@ size_t RadioInterface::beginSending(meshtastic_MeshPacket *p)
sendingPacket = p;
return p->encrypted.size + sizeof(PacketHeader);
-}
\ No newline at end of file
+}
diff --git a/src/mesh/RadioLibInterface.cpp b/src/mesh/RadioLibInterface.cpp
index bcfcc109b..d227f3020 100644
--- a/src/mesh/RadioLibInterface.cpp
+++ b/src/mesh/RadioLibInterface.cpp
@@ -186,7 +186,7 @@ ErrorCode RadioLibInterface::send(meshtastic_MeshPacket *p)
#ifndef LORA_DISABLE_SENDING
printPacket("enqueuing for send", p);
- LOG_DEBUG("txGood=%d,rxGood=%d,rxBad=%d\n", txGood, rxGood, rxBad);
+ LOG_DEBUG("txGood=%d,txRelay=%d,rxGood=%d,rxBad=%d\n", txGood, txRelay, rxGood, rxBad);
ErrorCode res = txQueue.enqueue(p) ? ERRNO_OK : ERRNO_UNKNOWN;
if (res != ERRNO_OK) { // we weren't able to queue it, so we must drop it to prevent leaks
@@ -353,6 +353,8 @@ void RadioLibInterface::completeSending()
if (p) {
txGood++;
+ if (!isFromUs(p))
+ txRelay++;
printPacket("Completed sending", p);
// We are done sending that packet, release it
diff --git a/src/mesh/RadioLibInterface.h b/src/mesh/RadioLibInterface.h
index 090c03046..673f53a32 100644
--- a/src/mesh/RadioLibInterface.h
+++ b/src/mesh/RadioLibInterface.h
@@ -107,7 +107,7 @@ class RadioLibInterface : public RadioInterface, protected concurrency::Notified
/**
* Debugging counts
*/
- uint32_t rxBad = 0, rxGood = 0, txGood = 0;
+ uint32_t rxBad = 0, rxGood = 0, txGood = 0, txRelay = 0;
public:
RadioLibInterface(LockingArduinoHal *hal, RADIOLIB_PIN_TYPE cs, RADIOLIB_PIN_TYPE irq, RADIOLIB_PIN_TYPE rst,
diff --git a/src/mesh/ReliableRouter.cpp b/src/mesh/ReliableRouter.cpp
index 9482f4185..fa05e7973 100644
--- a/src/mesh/ReliableRouter.cpp
+++ b/src/mesh/ReliableRouter.cpp
@@ -78,7 +78,7 @@ bool ReliableRouter::shouldFilterReceived(const meshtastic_MeshPacket *p)
* Resending real ACKs is omitted, as you might receive a packet multiple times due to flooding and
* flooding this ACK back to the original sender already adds redundancy. */
bool isRepeated = p->hop_start == 0 ? (p->hop_limit == HOP_RELIABLE) : (p->hop_start == p->hop_limit);
- if (wasSeenRecently(p, false) && isRepeated && !MeshModule::currentReply && p->to != nodeDB->getNodeNum()) {
+ if (wasSeenRecently(p, false) && isRepeated && !MeshModule::currentReply && !isToUs(p)) {
LOG_DEBUG("Resending implicit ack for a repeated floodmsg\n");
meshtastic_MeshPacket *tosend = packetPool.allocCopy(*p);
tosend->hop_limit--; // bump down the hop count
@@ -102,9 +102,7 @@ bool ReliableRouter::shouldFilterReceived(const meshtastic_MeshPacket *p)
*/
void ReliableRouter::sniffReceived(const meshtastic_MeshPacket *p, const meshtastic_Routing *c)
{
- NodeNum ourNode = getNodeNum();
-
- if (p->to == ourNode) { // ignore ack/nak/want_ack packets that are not address to us (we only handle 0 hop reliability)
+ if (isToUs(p)) { // ignore ack/nak/want_ack packets that are not address to us (we only handle 0 hop reliability)
if (p->want_ack) {
if (MeshModule::currentReply) {
LOG_DEBUG("Another module replied to this message, no need for 2nd ack\n");
diff --git a/src/mesh/Router.cpp b/src/mesh/Router.cpp
index 6ff4364d1..b5732dee9 100644
--- a/src/mesh/Router.cpp
+++ b/src/mesh/Router.cpp
@@ -169,7 +169,7 @@ ErrorCode Router::sendLocal(meshtastic_MeshPacket *p, RxSource src)
LOG_ERROR("Packet received with to: of 0!\n");
}
// No need to deliver externally if the destination is the local node
- if (p->to == nodeDB->getNodeNum()) {
+ if (isToUs(p)) {
printPacket("Enqueued local", p);
enqueueReceivedMessage(p);
return ERRNO_OK;
@@ -204,7 +204,7 @@ ErrorCode Router::sendLocal(meshtastic_MeshPacket *p, RxSource src)
*/
ErrorCode Router::send(meshtastic_MeshPacket *p)
{
- if (p->to == nodeDB->getNodeNum()) {
+ if (isToUs(p)) {
LOG_ERROR("BUG! send() called with packet destined for local node!\n");
packetPool.release(p);
return meshtastic_Routing_Error_BAD_REQUEST;
@@ -226,7 +226,7 @@ ErrorCode Router::send(meshtastic_MeshPacket *p)
service->sendClientNotification(cn);
#endif
meshtastic_Routing_Error err = meshtastic_Routing_Error_DUTY_CYCLE_LIMIT;
- if (getFrom(p) == nodeDB->getNodeNum()) { // only send NAK to API, not to the mesh
+ if (isFromUs(p)) { // only send NAK to API, not to the mesh
abortSendAndNak(err, p);
} else {
packetPool.release(p);
@@ -248,7 +248,7 @@ ErrorCode Router::send(meshtastic_MeshPacket *p)
p->from = getFrom(p);
// If we are the original transmitter, set the hop limit with which we start
- if (p->from == getNodeNum())
+ if (isFromUs(p))
p->hop_start = p->hop_limit;
// If the packet hasn't yet been encrypted, do so now (it might already be encrypted if we are just forwarding it)
@@ -273,7 +273,7 @@ ErrorCode Router::send(meshtastic_MeshPacket *p)
}
#if !MESHTASTIC_EXCLUDE_MQTT
// Only publish to MQTT if we're the original transmitter of the packet
- if (moduleConfig.mqtt.enabled && p->from == nodeDB->getNodeNum() && mqtt) {
+ if (moduleConfig.mqtt.enabled && isFromUs(p) && mqtt) {
mqtt->onSend(*p, *p_decoded, chIndex);
}
#endif
@@ -328,9 +328,9 @@ bool perhapsDecode(meshtastic_MeshPacket *p)
memcpy(ScratchEncrypted, p->encrypted.bytes, rawSize);
#if !(MESHTASTIC_EXCLUDE_PKI)
// Attempt PKI decryption first
- if (p->channel == 0 && p->to == nodeDB->getNodeNum() && p->to > 0 && p->to != NODENUM_BROADCAST &&
- nodeDB->getMeshNode(p->from) != nullptr && nodeDB->getMeshNode(p->from)->user.public_key.size > 0 &&
- nodeDB->getMeshNode(p->to)->user.public_key.size > 0 && rawSize > MESHTASTIC_PKC_OVERHEAD) {
+ if (p->channel == 0 && isToUs(p) && p->to > 0 && p->to != NODENUM_BROADCAST && nodeDB->getMeshNode(p->from) != nullptr &&
+ nodeDB->getMeshNode(p->from)->user.public_key.size > 0 && nodeDB->getMeshNode(p->to)->user.public_key.size > 0 &&
+ rawSize > MESHTASTIC_PKC_OVERHEAD) {
LOG_DEBUG("Attempting PKI decryption\n");
if (crypto->decryptCurve25519(p->from, p->id, rawSize, ScratchEncrypted, bytes)) {
@@ -432,7 +432,7 @@ meshtastic_Routing_Error perhapsEncode(meshtastic_MeshPacket *p)
// If the packet is not yet encrypted, do so now
if (p->which_payload_variant == meshtastic_MeshPacket_decoded_tag) {
- if (p->from == nodeDB->getNodeNum()) {
+ if (isFromUs(p)) {
p->decoded.has_bitfield = true;
p->decoded.bitfield |= (config.lora.config_ok_to_mqtt << BITFIELD_OK_TO_MQTT_SHIFT);
p->decoded.bitfield |= (p->decoded.want_response << BITFIELD_WANT_RESPONSE_SHIFT);
@@ -613,7 +613,7 @@ void Router::handleReceived(meshtastic_MeshPacket *p, RxSource src)
#if !MESHTASTIC_EXCLUDE_MQTT
// After potentially altering it, publish received message to MQTT if we're not the original transmitter of the packet
- if (decoded && moduleConfig.mqtt.enabled && getFrom(p) != nodeDB->getNodeNum() && mqtt)
+ if (decoded && moduleConfig.mqtt.enabled && !isFromUs(p) && mqtt)
mqtt->onSend(*p_encrypted, *p, p->channel);
#endif
}
diff --git a/src/mesh/Router.h b/src/mesh/Router.h
index fd4b0ccf9..8ebc1a3e5 100644
--- a/src/mesh/Router.h
+++ b/src/mesh/Router.h
@@ -82,6 +82,10 @@ class Router : protected concurrency::OSThread
*/
virtual ErrorCode send(meshtastic_MeshPacket *p);
+ /* Statistics for the amount of duplicate received packets and the amount of times we cancel a relay because someone did it
+ before us */
+ uint32_t rxDupe = 0, txRelayCanceled = 0;
+
protected:
friend class RoutingModule;
diff --git a/src/mesh/generated/meshtastic/admin.pb.cpp b/src/mesh/generated/meshtastic/admin.pb.cpp
index 339960302..8b3fd3d1b 100644
--- a/src/mesh/generated/meshtastic/admin.pb.cpp
+++ b/src/mesh/generated/meshtastic/admin.pb.cpp
@@ -1,5 +1,5 @@
/* Automatically generated nanopb constant definitions */
-/* Generated by nanopb-0.4.8 */
+/* Generated by nanopb-0.4.9 */
#include "meshtastic/admin.pb.h"
#if PB_PROTO_HEADER_VERSION != 40
@@ -18,3 +18,5 @@ PB_BIND(meshtastic_NodeRemoteHardwarePinsResponse, meshtastic_NodeRemoteHardware
+
+
diff --git a/src/mesh/generated/meshtastic/admin.pb.h b/src/mesh/generated/meshtastic/admin.pb.h
index c1ff7ebd4..bf81269b4 100644
--- a/src/mesh/generated/meshtastic/admin.pb.h
+++ b/src/mesh/generated/meshtastic/admin.pb.h
@@ -1,5 +1,5 @@
/* Automatically generated nanopb header */
-/* Generated by nanopb-0.4.8 */
+/* Generated by nanopb-0.4.9 */
#ifndef PB_MESHTASTIC_MESHTASTIC_ADMIN_PB_H_INCLUDED
#define PB_MESHTASTIC_MESHTASTIC_ADMIN_PB_H_INCLUDED
diff --git a/src/mesh/generated/meshtastic/apponly.pb.cpp b/src/mesh/generated/meshtastic/apponly.pb.cpp
index 44b0ea3cc..64d43b7ee 100644
--- a/src/mesh/generated/meshtastic/apponly.pb.cpp
+++ b/src/mesh/generated/meshtastic/apponly.pb.cpp
@@ -1,5 +1,5 @@
/* Automatically generated nanopb constant definitions */
-/* Generated by nanopb-0.4.8 */
+/* Generated by nanopb-0.4.9 */
#include "meshtastic/apponly.pb.h"
#if PB_PROTO_HEADER_VERSION != 40
diff --git a/src/mesh/generated/meshtastic/apponly.pb.h b/src/mesh/generated/meshtastic/apponly.pb.h
index 31211a91b..dc08d9ff3 100644
--- a/src/mesh/generated/meshtastic/apponly.pb.h
+++ b/src/mesh/generated/meshtastic/apponly.pb.h
@@ -1,5 +1,5 @@
/* Automatically generated nanopb header */
-/* Generated by nanopb-0.4.8 */
+/* Generated by nanopb-0.4.9 */
#ifndef PB_MESHTASTIC_MESHTASTIC_APPONLY_PB_H_INCLUDED
#define PB_MESHTASTIC_MESHTASTIC_APPONLY_PB_H_INCLUDED
diff --git a/src/mesh/generated/meshtastic/atak.pb.cpp b/src/mesh/generated/meshtastic/atak.pb.cpp
index 491336bcf..6dbc69fb4 100644
--- a/src/mesh/generated/meshtastic/atak.pb.cpp
+++ b/src/mesh/generated/meshtastic/atak.pb.cpp
@@ -1,5 +1,5 @@
/* Automatically generated nanopb constant definitions */
-/* Generated by nanopb-0.4.8 */
+/* Generated by nanopb-0.4.9 */
#include "meshtastic/atak.pb.h"
#if PB_PROTO_HEADER_VERSION != 40
@@ -27,3 +27,5 @@ PB_BIND(meshtastic_PLI, meshtastic_PLI, AUTO)
+
+
diff --git a/src/mesh/generated/meshtastic/atak.pb.h b/src/mesh/generated/meshtastic/atak.pb.h
index 7d1ef2995..15a86788b 100644
--- a/src/mesh/generated/meshtastic/atak.pb.h
+++ b/src/mesh/generated/meshtastic/atak.pb.h
@@ -1,5 +1,5 @@
/* Automatically generated nanopb header */
-/* Generated by nanopb-0.4.8 */
+/* Generated by nanopb-0.4.9 */
#ifndef PB_MESHTASTIC_MESHTASTIC_ATAK_PB_H_INCLUDED
#define PB_MESHTASTIC_MESHTASTIC_ATAK_PB_H_INCLUDED
diff --git a/src/mesh/generated/meshtastic/cannedmessages.pb.cpp b/src/mesh/generated/meshtastic/cannedmessages.pb.cpp
index 71e659be2..9f51e9634 100644
--- a/src/mesh/generated/meshtastic/cannedmessages.pb.cpp
+++ b/src/mesh/generated/meshtastic/cannedmessages.pb.cpp
@@ -1,5 +1,5 @@
/* Automatically generated nanopb constant definitions */
-/* Generated by nanopb-0.4.8 */
+/* Generated by nanopb-0.4.9 */
#include "meshtastic/cannedmessages.pb.h"
#if PB_PROTO_HEADER_VERSION != 40
diff --git a/src/mesh/generated/meshtastic/cannedmessages.pb.h b/src/mesh/generated/meshtastic/cannedmessages.pb.h
index c3f9a8b9b..06d14b98f 100644
--- a/src/mesh/generated/meshtastic/cannedmessages.pb.h
+++ b/src/mesh/generated/meshtastic/cannedmessages.pb.h
@@ -1,5 +1,5 @@
/* Automatically generated nanopb header */
-/* Generated by nanopb-0.4.8 */
+/* Generated by nanopb-0.4.9 */
#ifndef PB_MESHTASTIC_MESHTASTIC_CANNEDMESSAGES_PB_H_INCLUDED
#define PB_MESHTASTIC_MESHTASTIC_CANNEDMESSAGES_PB_H_INCLUDED
diff --git a/src/mesh/generated/meshtastic/channel.pb.cpp b/src/mesh/generated/meshtastic/channel.pb.cpp
index fe76d8140..52f923b13 100644
--- a/src/mesh/generated/meshtastic/channel.pb.cpp
+++ b/src/mesh/generated/meshtastic/channel.pb.cpp
@@ -1,5 +1,5 @@
/* Automatically generated nanopb constant definitions */
-/* Generated by nanopb-0.4.8 */
+/* Generated by nanopb-0.4.9 */
#include "meshtastic/channel.pb.h"
#if PB_PROTO_HEADER_VERSION != 40
@@ -17,3 +17,4 @@ PB_BIND(meshtastic_Channel, meshtastic_Channel, AUTO)
+
diff --git a/src/mesh/generated/meshtastic/channel.pb.h b/src/mesh/generated/meshtastic/channel.pb.h
index d9c7d4ffa..3d617ae39 100644
--- a/src/mesh/generated/meshtastic/channel.pb.h
+++ b/src/mesh/generated/meshtastic/channel.pb.h
@@ -1,5 +1,5 @@
/* Automatically generated nanopb header */
-/* Generated by nanopb-0.4.8 */
+/* Generated by nanopb-0.4.9 */
#ifndef PB_MESHTASTIC_MESHTASTIC_CHANNEL_PB_H_INCLUDED
#define PB_MESHTASTIC_MESHTASTIC_CHANNEL_PB_H_INCLUDED
diff --git a/src/mesh/generated/meshtastic/clientonly.pb.cpp b/src/mesh/generated/meshtastic/clientonly.pb.cpp
index 44c6f95ce..d99af8cf5 100644
--- a/src/mesh/generated/meshtastic/clientonly.pb.cpp
+++ b/src/mesh/generated/meshtastic/clientonly.pb.cpp
@@ -1,5 +1,5 @@
/* Automatically generated nanopb constant definitions */
-/* Generated by nanopb-0.4.8 */
+/* Generated by nanopb-0.4.9 */
#include "meshtastic/clientonly.pb.h"
#if PB_PROTO_HEADER_VERSION != 40
diff --git a/src/mesh/generated/meshtastic/clientonly.pb.h b/src/mesh/generated/meshtastic/clientonly.pb.h
index 5720c1c02..bf32d7875 100644
--- a/src/mesh/generated/meshtastic/clientonly.pb.h
+++ b/src/mesh/generated/meshtastic/clientonly.pb.h
@@ -1,5 +1,5 @@
/* Automatically generated nanopb header */
-/* Generated by nanopb-0.4.8 */
+/* Generated by nanopb-0.4.9 */
#ifndef PB_MESHTASTIC_MESHTASTIC_CLIENTONLY_PB_H_INCLUDED
#define PB_MESHTASTIC_MESHTASTIC_CLIENTONLY_PB_H_INCLUDED
diff --git a/src/mesh/generated/meshtastic/config.pb.cpp b/src/mesh/generated/meshtastic/config.pb.cpp
index 92c3313bd..23f4d542b 100644
--- a/src/mesh/generated/meshtastic/config.pb.cpp
+++ b/src/mesh/generated/meshtastic/config.pb.cpp
@@ -1,5 +1,5 @@
/* Automatically generated nanopb constant definitions */
-/* Generated by nanopb-0.4.8 */
+/* Generated by nanopb-0.4.9 */
#include "meshtastic/config.pb.h"
#if PB_PROTO_HEADER_VERSION != 40
@@ -46,6 +46,19 @@ PB_BIND(meshtastic_Config_SessionkeyConfig, meshtastic_Config_SessionkeyConfig,
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/mesh/generated/meshtastic/config.pb.h b/src/mesh/generated/meshtastic/config.pb.h
index da2e43972..988f852ff 100644
--- a/src/mesh/generated/meshtastic/config.pb.h
+++ b/src/mesh/generated/meshtastic/config.pb.h
@@ -1,5 +1,5 @@
/* Automatically generated nanopb header */
-/* Generated by nanopb-0.4.8 */
+/* Generated by nanopb-0.4.9 */
#ifndef PB_MESHTASTIC_MESHTASTIC_CONFIG_PB_H_INCLUDED
#define PB_MESHTASTIC_MESHTASTIC_CONFIG_PB_H_INCLUDED
@@ -238,7 +238,13 @@ typedef enum _meshtastic_Config_LoRaConfig_RegionCode {
/* Malaysia 919mhz */
meshtastic_Config_LoRaConfig_RegionCode_MY_919 = 17,
/* Singapore 923mhz */
- meshtastic_Config_LoRaConfig_RegionCode_SG_923 = 18
+ meshtastic_Config_LoRaConfig_RegionCode_SG_923 = 18,
+ /* Philippines 433mhz */
+ meshtastic_Config_LoRaConfig_RegionCode_PH_433 = 19,
+ /* Philippines 868mhz */
+ meshtastic_Config_LoRaConfig_RegionCode_PH_868 = 20,
+ /* Philippines 915mhz */
+ meshtastic_Config_LoRaConfig_RegionCode_PH_915 = 21
} meshtastic_Config_LoRaConfig_RegionCode;
/* Standard predefined channel settings
@@ -615,8 +621,8 @@ extern "C" {
#define _meshtastic_Config_DisplayConfig_CompassOrientation_ARRAYSIZE ((meshtastic_Config_DisplayConfig_CompassOrientation)(meshtastic_Config_DisplayConfig_CompassOrientation_DEGREES_270_INVERTED+1))
#define _meshtastic_Config_LoRaConfig_RegionCode_MIN meshtastic_Config_LoRaConfig_RegionCode_UNSET
-#define _meshtastic_Config_LoRaConfig_RegionCode_MAX meshtastic_Config_LoRaConfig_RegionCode_SG_923
-#define _meshtastic_Config_LoRaConfig_RegionCode_ARRAYSIZE ((meshtastic_Config_LoRaConfig_RegionCode)(meshtastic_Config_LoRaConfig_RegionCode_SG_923+1))
+#define _meshtastic_Config_LoRaConfig_RegionCode_MAX meshtastic_Config_LoRaConfig_RegionCode_PH_915
+#define _meshtastic_Config_LoRaConfig_RegionCode_ARRAYSIZE ((meshtastic_Config_LoRaConfig_RegionCode)(meshtastic_Config_LoRaConfig_RegionCode_PH_915+1))
#define _meshtastic_Config_LoRaConfig_ModemPreset_MIN meshtastic_Config_LoRaConfig_ModemPreset_LONG_FAST
#define _meshtastic_Config_LoRaConfig_ModemPreset_MAX meshtastic_Config_LoRaConfig_ModemPreset_SHORT_TURBO
diff --git a/src/mesh/generated/meshtastic/connection_status.pb.cpp b/src/mesh/generated/meshtastic/connection_status.pb.cpp
index fc5a364dd..d1495bb83 100644
--- a/src/mesh/generated/meshtastic/connection_status.pb.cpp
+++ b/src/mesh/generated/meshtastic/connection_status.pb.cpp
@@ -1,5 +1,5 @@
/* Automatically generated nanopb constant definitions */
-/* Generated by nanopb-0.4.8 */
+/* Generated by nanopb-0.4.9 */
#include "meshtastic/connection_status.pb.h"
#if PB_PROTO_HEADER_VERSION != 40
diff --git a/src/mesh/generated/meshtastic/connection_status.pb.h b/src/mesh/generated/meshtastic/connection_status.pb.h
index 1c618e4d4..c433e370b 100644
--- a/src/mesh/generated/meshtastic/connection_status.pb.h
+++ b/src/mesh/generated/meshtastic/connection_status.pb.h
@@ -1,5 +1,5 @@
/* Automatically generated nanopb header */
-/* Generated by nanopb-0.4.8 */
+/* Generated by nanopb-0.4.9 */
#ifndef PB_MESHTASTIC_MESHTASTIC_CONNECTION_STATUS_PB_H_INCLUDED
#define PB_MESHTASTIC_MESHTASTIC_CONNECTION_STATUS_PB_H_INCLUDED
diff --git a/src/mesh/generated/meshtastic/deviceonly.pb.cpp b/src/mesh/generated/meshtastic/deviceonly.pb.cpp
index 2747ac9d9..135634762 100644
--- a/src/mesh/generated/meshtastic/deviceonly.pb.cpp
+++ b/src/mesh/generated/meshtastic/deviceonly.pb.cpp
@@ -1,5 +1,5 @@
/* Automatically generated nanopb constant definitions */
-/* Generated by nanopb-0.4.8 */
+/* Generated by nanopb-0.4.9 */
#include "meshtastic/deviceonly.pb.h"
#if PB_PROTO_HEADER_VERSION != 40
@@ -26,3 +26,4 @@ PB_BIND(meshtastic_OEMStore, meshtastic_OEMStore, 2)
+
diff --git a/src/mesh/generated/meshtastic/deviceonly.pb.h b/src/mesh/generated/meshtastic/deviceonly.pb.h
index 0fc09daca..2aa8fda8e 100644
--- a/src/mesh/generated/meshtastic/deviceonly.pb.h
+++ b/src/mesh/generated/meshtastic/deviceonly.pb.h
@@ -1,5 +1,5 @@
/* Automatically generated nanopb header */
-/* Generated by nanopb-0.4.8 */
+/* Generated by nanopb-0.4.9 */
#ifndef PB_MESHTASTIC_MESHTASTIC_DEVICEONLY_PB_H_INCLUDED
#define PB_MESHTASTIC_MESHTASTIC_DEVICEONLY_PB_H_INCLUDED
@@ -359,7 +359,7 @@ extern const pb_msgdesc_t meshtastic_OEMStore_msg;
#define MESHTASTIC_MESHTASTIC_DEVICEONLY_PB_H_MAX_SIZE meshtastic_OEMStore_size
#define meshtastic_ChannelFile_size 718
#define meshtastic_NodeInfoLite_size 183
-#define meshtastic_OEMStore_size 3576
+#define meshtastic_OEMStore_size 3578
#define meshtastic_PositionLite_size 28
#define meshtastic_UserLite_size 96
diff --git a/src/mesh/generated/meshtastic/localonly.pb.cpp b/src/mesh/generated/meshtastic/localonly.pb.cpp
index 9bc98fb85..0a752a5a8 100644
--- a/src/mesh/generated/meshtastic/localonly.pb.cpp
+++ b/src/mesh/generated/meshtastic/localonly.pb.cpp
@@ -1,5 +1,5 @@
/* Automatically generated nanopb constant definitions */
-/* Generated by nanopb-0.4.8 */
+/* Generated by nanopb-0.4.9 */
#include "meshtastic/localonly.pb.h"
#if PB_PROTO_HEADER_VERSION != 40
diff --git a/src/mesh/generated/meshtastic/localonly.pb.h b/src/mesh/generated/meshtastic/localonly.pb.h
index bac67942c..6409aef74 100644
--- a/src/mesh/generated/meshtastic/localonly.pb.h
+++ b/src/mesh/generated/meshtastic/localonly.pb.h
@@ -1,5 +1,5 @@
/* Automatically generated nanopb header */
-/* Generated by nanopb-0.4.8 */
+/* Generated by nanopb-0.4.9 */
#ifndef PB_MESHTASTIC_MESHTASTIC_LOCALONLY_PB_H_INCLUDED
#define PB_MESHTASTIC_MESHTASTIC_LOCALONLY_PB_H_INCLUDED
@@ -188,7 +188,7 @@ extern const pb_msgdesc_t meshtastic_LocalModuleConfig_msg;
/* Maximum encoded size of messages (where known) */
#define MESHTASTIC_MESHTASTIC_LOCALONLY_PB_H_MAX_SIZE meshtastic_LocalConfig_size
#define meshtastic_LocalConfig_size 735
-#define meshtastic_LocalModuleConfig_size 695
+#define meshtastic_LocalModuleConfig_size 697
#ifdef __cplusplus
} /* extern "C" */
diff --git a/src/mesh/generated/meshtastic/mesh.pb.cpp b/src/mesh/generated/meshtastic/mesh.pb.cpp
index 8c8b9ded7..a0c1e2e73 100644
--- a/src/mesh/generated/meshtastic/mesh.pb.cpp
+++ b/src/mesh/generated/meshtastic/mesh.pb.cpp
@@ -1,5 +1,5 @@
/* Automatically generated nanopb constant definitions */
-/* Generated by nanopb-0.4.8 */
+/* Generated by nanopb-0.4.9 */
#include "meshtastic/mesh.pb.h"
#if PB_PROTO_HEADER_VERSION != 40
@@ -90,4 +90,13 @@ PB_BIND(meshtastic_ChunkedPayloadResponse, meshtastic_ChunkedPayloadResponse, AU
+
+
+
+
+
+
+
+
+
diff --git a/src/mesh/generated/meshtastic/mesh.pb.h b/src/mesh/generated/meshtastic/mesh.pb.h
index c04f4adb9..fb154e9d5 100644
--- a/src/mesh/generated/meshtastic/mesh.pb.h
+++ b/src/mesh/generated/meshtastic/mesh.pb.h
@@ -1,5 +1,5 @@
/* Automatically generated nanopb header */
-/* Generated by nanopb-0.4.8 */
+/* Generated by nanopb-0.4.9 */
#ifndef PB_MESHTASTIC_MESHTASTIC_MESH_PB_H_INCLUDED
#define PB_MESHTASTIC_MESHTASTIC_MESH_PB_H_INCLUDED
diff --git a/src/mesh/generated/meshtastic/module_config.pb.cpp b/src/mesh/generated/meshtastic/module_config.pb.cpp
index e1c33e2c1..c40041eab 100644
--- a/src/mesh/generated/meshtastic/module_config.pb.cpp
+++ b/src/mesh/generated/meshtastic/module_config.pb.cpp
@@ -1,5 +1,5 @@
/* Automatically generated nanopb constant definitions */
-/* Generated by nanopb-0.4.8 */
+/* Generated by nanopb-0.4.9 */
#include "meshtastic/module_config.pb.h"
#if PB_PROTO_HEADER_VERSION != 40
@@ -61,3 +61,9 @@ PB_BIND(meshtastic_RemoteHardwarePin, meshtastic_RemoteHardwarePin, AUTO)
+
+
+
+
+
+
diff --git a/src/mesh/generated/meshtastic/module_config.pb.h b/src/mesh/generated/meshtastic/module_config.pb.h
index ce8b8891a..32d5ded23 100644
--- a/src/mesh/generated/meshtastic/module_config.pb.h
+++ b/src/mesh/generated/meshtastic/module_config.pb.h
@@ -1,5 +1,5 @@
/* Automatically generated nanopb header */
-/* Generated by nanopb-0.4.8 */
+/* Generated by nanopb-0.4.9 */
#ifndef PB_MESHTASTIC_MESHTASTIC_MODULE_CONFIG_PB_H_INCLUDED
#define PB_MESHTASTIC_MESHTASTIC_MODULE_CONFIG_PB_H_INCLUDED
@@ -327,14 +327,12 @@ typedef struct _meshtastic_ModuleConfig_TelemetryConfig {
/* Interval in seconds of how often we should try to send our
air quality metrics to the mesh */
uint32_t air_quality_interval;
- /* Interval in seconds of how often we should try to send our
- air quality metrics to the mesh */
+ /* Enable/disable Power metrics */
bool power_measurement_enabled;
/* Interval in seconds of how often we should try to send our
- air quality metrics to the mesh */
+ power metrics to the mesh */
uint32_t power_update_interval;
- /* Interval in seconds of how often we should try to send our
- air quality metrics to the mesh */
+ /* Enable/Disable the power measurement module on-device display */
bool power_screen_enabled;
/* Preferences for the (Health) Telemetry Module
Enable/Disable the telemetry measurement module measurement collection */
@@ -342,6 +340,8 @@ typedef struct _meshtastic_ModuleConfig_TelemetryConfig {
/* Interval in seconds of how often we should try to send our
health metrics to the mesh */
uint32_t health_update_interval;
+ /* Enable/Disable the health telemetry module on-device display */
+ bool health_screen_enabled;
} meshtastic_ModuleConfig_TelemetryConfig;
/* TODO: REPLACE */
@@ -509,7 +509,7 @@ extern "C" {
#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_RangeTestConfig_init_default {0, 0, 0}
-#define meshtastic_ModuleConfig_TelemetryConfig_init_default {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_AmbientLightingConfig_init_default {0, 0, 0, 0, 0}
#define meshtastic_RemoteHardwarePin_init_default {0, "", _meshtastic_RemoteHardwarePinType_MIN}
@@ -525,7 +525,7 @@ extern "C" {
#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_RangeTestConfig_init_zero {0, 0, 0}
-#define meshtastic_ModuleConfig_TelemetryConfig_init_zero {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_AmbientLightingConfig_init_zero {0, 0, 0, 0, 0}
#define meshtastic_RemoteHardwarePin_init_zero {0, "", _meshtastic_RemoteHardwarePinType_MIN}
@@ -609,6 +609,7 @@ extern "C" {
#define meshtastic_ModuleConfig_TelemetryConfig_power_screen_enabled_tag 10
#define meshtastic_ModuleConfig_TelemetryConfig_health_measurement_enabled_tag 11
#define meshtastic_ModuleConfig_TelemetryConfig_health_update_interval_tag 12
+#define meshtastic_ModuleConfig_TelemetryConfig_health_screen_enabled_tag 13
#define meshtastic_ModuleConfig_CannedMessageConfig_rotary1_enabled_tag 1
#define meshtastic_ModuleConfig_CannedMessageConfig_inputbroker_pin_a_tag 2
#define meshtastic_ModuleConfig_CannedMessageConfig_inputbroker_pin_b_tag 3
@@ -803,7 +804,8 @@ X(a, STATIC, SINGULAR, BOOL, power_measurement_enabled, 8) \
X(a, STATIC, SINGULAR, UINT32, power_update_interval, 9) \
X(a, STATIC, SINGULAR, BOOL, power_screen_enabled, 10) \
X(a, STATIC, SINGULAR, BOOL, health_measurement_enabled, 11) \
-X(a, STATIC, SINGULAR, UINT32, health_update_interval, 12)
+X(a, STATIC, SINGULAR, UINT32, health_update_interval, 12) \
+X(a, STATIC, SINGULAR, BOOL, health_screen_enabled, 13)
#define meshtastic_ModuleConfig_TelemetryConfig_CALLBACK NULL
#define meshtastic_ModuleConfig_TelemetryConfig_DEFAULT NULL
@@ -888,7 +890,7 @@ extern const pb_msgdesc_t meshtastic_RemoteHardwarePin_msg;
#define meshtastic_ModuleConfig_RemoteHardwareConfig_size 96
#define meshtastic_ModuleConfig_SerialConfig_size 28
#define meshtastic_ModuleConfig_StoreForwardConfig_size 24
-#define meshtastic_ModuleConfig_TelemetryConfig_size 44
+#define meshtastic_ModuleConfig_TelemetryConfig_size 46
#define meshtastic_ModuleConfig_size 257
#define meshtastic_RemoteHardwarePin_size 21
diff --git a/src/mesh/generated/meshtastic/mqtt.pb.cpp b/src/mesh/generated/meshtastic/mqtt.pb.cpp
index f00dd823b..74536cb79 100644
--- a/src/mesh/generated/meshtastic/mqtt.pb.cpp
+++ b/src/mesh/generated/meshtastic/mqtt.pb.cpp
@@ -1,5 +1,5 @@
/* Automatically generated nanopb constant definitions */
-/* Generated by nanopb-0.4.8 */
+/* Generated by nanopb-0.4.9 */
#include "meshtastic/mqtt.pb.h"
#if PB_PROTO_HEADER_VERSION != 40
diff --git a/src/mesh/generated/meshtastic/mqtt.pb.h b/src/mesh/generated/meshtastic/mqtt.pb.h
index 8ec9f98c3..4d1027374 100644
--- a/src/mesh/generated/meshtastic/mqtt.pb.h
+++ b/src/mesh/generated/meshtastic/mqtt.pb.h
@@ -1,5 +1,5 @@
/* Automatically generated nanopb header */
-/* Generated by nanopb-0.4.8 */
+/* Generated by nanopb-0.4.9 */
#ifndef PB_MESHTASTIC_MESHTASTIC_MQTT_PB_H_INCLUDED
#define PB_MESHTASTIC_MESHTASTIC_MQTT_PB_H_INCLUDED
diff --git a/src/mesh/generated/meshtastic/paxcount.pb.cpp b/src/mesh/generated/meshtastic/paxcount.pb.cpp
index 67f07a31b..403288147 100644
--- a/src/mesh/generated/meshtastic/paxcount.pb.cpp
+++ b/src/mesh/generated/meshtastic/paxcount.pb.cpp
@@ -1,5 +1,5 @@
/* Automatically generated nanopb constant definitions */
-/* Generated by nanopb-0.4.8 */
+/* Generated by nanopb-0.4.9 */
#include "meshtastic/paxcount.pb.h"
#if PB_PROTO_HEADER_VERSION != 40
diff --git a/src/mesh/generated/meshtastic/paxcount.pb.h b/src/mesh/generated/meshtastic/paxcount.pb.h
index 09377d833..b6b51fdd5 100644
--- a/src/mesh/generated/meshtastic/paxcount.pb.h
+++ b/src/mesh/generated/meshtastic/paxcount.pb.h
@@ -1,5 +1,5 @@
/* Automatically generated nanopb header */
-/* Generated by nanopb-0.4.8 */
+/* Generated by nanopb-0.4.9 */
#ifndef PB_MESHTASTIC_MESHTASTIC_PAXCOUNT_PB_H_INCLUDED
#define PB_MESHTASTIC_MESHTASTIC_PAXCOUNT_PB_H_INCLUDED
diff --git a/src/mesh/generated/meshtastic/portnums.pb.cpp b/src/mesh/generated/meshtastic/portnums.pb.cpp
index 8f32c0851..8fca9af79 100644
--- a/src/mesh/generated/meshtastic/portnums.pb.cpp
+++ b/src/mesh/generated/meshtastic/portnums.pb.cpp
@@ -1,5 +1,5 @@
/* Automatically generated nanopb constant definitions */
-/* Generated by nanopb-0.4.8 */
+/* Generated by nanopb-0.4.9 */
#include "meshtastic/portnums.pb.h"
#if PB_PROTO_HEADER_VERSION != 40
@@ -8,3 +8,4 @@
+
diff --git a/src/mesh/generated/meshtastic/portnums.pb.h b/src/mesh/generated/meshtastic/portnums.pb.h
index b9e537ddf..df6cf32c2 100644
--- a/src/mesh/generated/meshtastic/portnums.pb.h
+++ b/src/mesh/generated/meshtastic/portnums.pb.h
@@ -1,5 +1,5 @@
/* Automatically generated nanopb header */
-/* Generated by nanopb-0.4.8 */
+/* Generated by nanopb-0.4.9 */
#ifndef PB_MESHTASTIC_MESHTASTIC_PORTNUMS_PB_H_INCLUDED
#define PB_MESHTASTIC_MESHTASTIC_PORTNUMS_PB_H_INCLUDED
diff --git a/src/mesh/generated/meshtastic/powermon.pb.cpp b/src/mesh/generated/meshtastic/powermon.pb.cpp
index ce41ea021..6a9b7551a 100644
--- a/src/mesh/generated/meshtastic/powermon.pb.cpp
+++ b/src/mesh/generated/meshtastic/powermon.pb.cpp
@@ -1,5 +1,5 @@
/* Automatically generated nanopb constant definitions */
-/* Generated by nanopb-0.4.8 */
+/* Generated by nanopb-0.4.9 */
#include "meshtastic/powermon.pb.h"
#if PB_PROTO_HEADER_VERSION != 40
@@ -15,3 +15,5 @@ PB_BIND(meshtastic_PowerStressMessage, meshtastic_PowerStressMessage, AUTO)
+
+
diff --git a/src/mesh/generated/meshtastic/powermon.pb.h b/src/mesh/generated/meshtastic/powermon.pb.h
index 7de0618e9..5add85b85 100644
--- a/src/mesh/generated/meshtastic/powermon.pb.h
+++ b/src/mesh/generated/meshtastic/powermon.pb.h
@@ -1,5 +1,5 @@
/* Automatically generated nanopb header */
-/* Generated by nanopb-0.4.8 */
+/* Generated by nanopb-0.4.9 */
#ifndef PB_MESHTASTIC_MESHTASTIC_POWERMON_PB_H_INCLUDED
#define PB_MESHTASTIC_MESHTASTIC_POWERMON_PB_H_INCLUDED
diff --git a/src/mesh/generated/meshtastic/remote_hardware.pb.cpp b/src/mesh/generated/meshtastic/remote_hardware.pb.cpp
index 4a23698b2..239950e7e 100644
--- a/src/mesh/generated/meshtastic/remote_hardware.pb.cpp
+++ b/src/mesh/generated/meshtastic/remote_hardware.pb.cpp
@@ -1,5 +1,5 @@
/* Automatically generated nanopb constant definitions */
-/* Generated by nanopb-0.4.8 */
+/* Generated by nanopb-0.4.9 */
#include "meshtastic/remote_hardware.pb.h"
#if PB_PROTO_HEADER_VERSION != 40
@@ -11,3 +11,4 @@ PB_BIND(meshtastic_HardwareMessage, meshtastic_HardwareMessage, AUTO)
+
diff --git a/src/mesh/generated/meshtastic/remote_hardware.pb.h b/src/mesh/generated/meshtastic/remote_hardware.pb.h
index 936034b62..ade250e93 100644
--- a/src/mesh/generated/meshtastic/remote_hardware.pb.h
+++ b/src/mesh/generated/meshtastic/remote_hardware.pb.h
@@ -1,5 +1,5 @@
/* Automatically generated nanopb header */
-/* Generated by nanopb-0.4.8 */
+/* Generated by nanopb-0.4.9 */
#ifndef PB_MESHTASTIC_MESHTASTIC_REMOTE_HARDWARE_PB_H_INCLUDED
#define PB_MESHTASTIC_MESHTASTIC_REMOTE_HARDWARE_PB_H_INCLUDED
diff --git a/src/mesh/generated/meshtastic/rtttl.pb.cpp b/src/mesh/generated/meshtastic/rtttl.pb.cpp
index 8367fdbce..61ad8b73f 100644
--- a/src/mesh/generated/meshtastic/rtttl.pb.cpp
+++ b/src/mesh/generated/meshtastic/rtttl.pb.cpp
@@ -1,5 +1,5 @@
/* Automatically generated nanopb constant definitions */
-/* Generated by nanopb-0.4.8 */
+/* Generated by nanopb-0.4.9 */
#include "meshtastic/rtttl.pb.h"
#if PB_PROTO_HEADER_VERSION != 40
diff --git a/src/mesh/generated/meshtastic/rtttl.pb.h b/src/mesh/generated/meshtastic/rtttl.pb.h
index 452b0cf4b..2b7e35f11 100644
--- a/src/mesh/generated/meshtastic/rtttl.pb.h
+++ b/src/mesh/generated/meshtastic/rtttl.pb.h
@@ -1,5 +1,5 @@
/* Automatically generated nanopb header */
-/* Generated by nanopb-0.4.8 */
+/* Generated by nanopb-0.4.9 */
#ifndef PB_MESHTASTIC_MESHTASTIC_RTTTL_PB_H_INCLUDED
#define PB_MESHTASTIC_MESHTASTIC_RTTTL_PB_H_INCLUDED
diff --git a/src/mesh/generated/meshtastic/storeforward.pb.cpp b/src/mesh/generated/meshtastic/storeforward.pb.cpp
index 5b3fadd9a..71a232bf6 100644
--- a/src/mesh/generated/meshtastic/storeforward.pb.cpp
+++ b/src/mesh/generated/meshtastic/storeforward.pb.cpp
@@ -1,5 +1,5 @@
/* Automatically generated nanopb constant definitions */
-/* Generated by nanopb-0.4.8 */
+/* Generated by nanopb-0.4.9 */
#include "meshtastic/storeforward.pb.h"
#if PB_PROTO_HEADER_VERSION != 40
@@ -20,3 +20,4 @@ PB_BIND(meshtastic_StoreAndForward_Heartbeat, meshtastic_StoreAndForward_Heartbe
+
diff --git a/src/mesh/generated/meshtastic/storeforward.pb.h b/src/mesh/generated/meshtastic/storeforward.pb.h
index 311596c7f..71f2fcad5 100644
--- a/src/mesh/generated/meshtastic/storeforward.pb.h
+++ b/src/mesh/generated/meshtastic/storeforward.pb.h
@@ -1,5 +1,5 @@
/* Automatically generated nanopb header */
-/* Generated by nanopb-0.4.8 */
+/* Generated by nanopb-0.4.9 */
#ifndef PB_MESHTASTIC_MESHTASTIC_STOREFORWARD_PB_H_INCLUDED
#define PB_MESHTASTIC_MESHTASTIC_STOREFORWARD_PB_H_INCLUDED
diff --git a/src/mesh/generated/meshtastic/telemetry.pb.cpp b/src/mesh/generated/meshtastic/telemetry.pb.cpp
index b9c1da7a0..f6d39da6e 100644
--- a/src/mesh/generated/meshtastic/telemetry.pb.cpp
+++ b/src/mesh/generated/meshtastic/telemetry.pb.cpp
@@ -1,5 +1,5 @@
/* Automatically generated nanopb constant definitions */
-/* Generated by nanopb-0.4.8 */
+/* Generated by nanopb-0.4.9 */
#include "meshtastic/telemetry.pb.h"
#if PB_PROTO_HEADER_VERSION != 40
@@ -32,3 +32,4 @@ PB_BIND(meshtastic_Nau7802Config, meshtastic_Nau7802Config, AUTO)
+
diff --git a/src/mesh/generated/meshtastic/telemetry.pb.h b/src/mesh/generated/meshtastic/telemetry.pb.h
index 61897fc5c..a33988129 100644
--- a/src/mesh/generated/meshtastic/telemetry.pb.h
+++ b/src/mesh/generated/meshtastic/telemetry.pb.h
@@ -1,5 +1,5 @@
/* Automatically generated nanopb header */
-/* Generated by nanopb-0.4.8 */
+/* Generated by nanopb-0.4.9 */
#ifndef PB_MESHTASTIC_MESHTASTIC_TELEMETRY_PB_H_INCLUDED
#define PB_MESHTASTIC_MESHTASTIC_TELEMETRY_PB_H_INCLUDED
@@ -73,7 +73,9 @@ typedef enum _meshtastic_TelemetrySensorType {
/* Custom I2C sensor implementation based on https://github.com/meshtastic/i2c-sensor */
meshtastic_TelemetrySensorType_CUSTOM_SENSOR = 29,
/* MAX30102 Pulse Oximeter and Heart-Rate Sensor */
- meshtastic_TelemetrySensorType_MAX30102 = 30
+ meshtastic_TelemetrySensorType_MAX30102 = 30,
+ /* MLX90614 non-contact IR temperature sensor. */
+ meshtastic_TelemetrySensorType_MLX90614 = 31
} meshtastic_TelemetrySensorType;
/* Struct definitions */
@@ -225,7 +227,7 @@ typedef struct _meshtastic_LocalStats {
float air_util_tx;
/* Number of packets sent */
uint32_t num_packets_tx;
- /* Number of packets received good */
+ /* Number of packets received (both good and bad) */
uint32_t num_packets_rx;
/* Number of packets received that are malformed or violate the protocol */
uint32_t num_packets_rx_bad;
@@ -233,6 +235,14 @@ typedef struct _meshtastic_LocalStats {
uint16_t num_online_nodes;
/* Number of nodes total */
uint16_t num_total_nodes;
+ /* Number of received packets that were duplicates (due to multiple nodes relaying).
+ If this number is high, there are nodes in the mesh relaying packets when it's unnecessary, for example due to the ROUTER/REPEATER role. */
+ uint32_t num_rx_dupe;
+ /* Number of packets we transmitted that were a relay for others (not originating from ourselves). */
+ uint32_t num_tx_relay;
+ /* Number of times we canceled a packet to be relayed, because someone else did it before us.
+ This will always be zero for ROUTERs/REPEATERs. If this number is high, some other node(s) is/are relaying faster than you. */
+ uint32_t num_tx_relay_canceled;
} meshtastic_LocalStats;
/* Health telemetry metrics */
@@ -284,8 +294,8 @@ extern "C" {
/* Helper constants for enums */
#define _meshtastic_TelemetrySensorType_MIN meshtastic_TelemetrySensorType_SENSOR_UNSET
-#define _meshtastic_TelemetrySensorType_MAX meshtastic_TelemetrySensorType_MAX30102
-#define _meshtastic_TelemetrySensorType_ARRAYSIZE ((meshtastic_TelemetrySensorType)(meshtastic_TelemetrySensorType_MAX30102+1))
+#define _meshtastic_TelemetrySensorType_MAX meshtastic_TelemetrySensorType_MLX90614
+#define _meshtastic_TelemetrySensorType_ARRAYSIZE ((meshtastic_TelemetrySensorType)(meshtastic_TelemetrySensorType_MLX90614+1))
@@ -301,7 +311,7 @@ extern "C" {
#define meshtastic_EnvironmentMetrics_init_default {false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0}
#define meshtastic_PowerMetrics_init_default {false, 0, false, 0, false, 0, false, 0, false, 0, false, 0}
#define meshtastic_AirQualityMetrics_init_default {false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0}
-#define meshtastic_LocalStats_init_default {0, 0, 0, 0, 0, 0, 0, 0}
+#define meshtastic_LocalStats_init_default {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
#define meshtastic_HealthMetrics_init_default {false, 0, false, 0, false, 0}
#define meshtastic_Telemetry_init_default {0, 0, {meshtastic_DeviceMetrics_init_default}}
#define meshtastic_Nau7802Config_init_default {0, 0}
@@ -309,7 +319,7 @@ extern "C" {
#define meshtastic_EnvironmentMetrics_init_zero {false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0}
#define meshtastic_PowerMetrics_init_zero {false, 0, false, 0, false, 0, false, 0, false, 0, false, 0}
#define meshtastic_AirQualityMetrics_init_zero {false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0}
-#define meshtastic_LocalStats_init_zero {0, 0, 0, 0, 0, 0, 0, 0}
+#define meshtastic_LocalStats_init_zero {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
#define meshtastic_HealthMetrics_init_zero {false, 0, false, 0, false, 0}
#define meshtastic_Telemetry_init_zero {0, 0, {meshtastic_DeviceMetrics_init_zero}}
#define meshtastic_Nau7802Config_init_zero {0, 0}
@@ -363,6 +373,9 @@ extern "C" {
#define meshtastic_LocalStats_num_packets_rx_bad_tag 6
#define meshtastic_LocalStats_num_online_nodes_tag 7
#define meshtastic_LocalStats_num_total_nodes_tag 8
+#define meshtastic_LocalStats_num_rx_dupe_tag 9
+#define meshtastic_LocalStats_num_tx_relay_tag 10
+#define meshtastic_LocalStats_num_tx_relay_canceled_tag 11
#define meshtastic_HealthMetrics_heart_bpm_tag 1
#define meshtastic_HealthMetrics_spO2_tag 2
#define meshtastic_HealthMetrics_temperature_tag 3
@@ -441,7 +454,10 @@ X(a, STATIC, SINGULAR, UINT32, num_packets_tx, 4) \
X(a, STATIC, SINGULAR, UINT32, num_packets_rx, 5) \
X(a, STATIC, SINGULAR, UINT32, num_packets_rx_bad, 6) \
X(a, STATIC, SINGULAR, UINT32, num_online_nodes, 7) \
-X(a, STATIC, SINGULAR, UINT32, num_total_nodes, 8)
+X(a, STATIC, SINGULAR, UINT32, num_total_nodes, 8) \
+X(a, STATIC, SINGULAR, UINT32, num_rx_dupe, 9) \
+X(a, STATIC, SINGULAR, UINT32, num_tx_relay, 10) \
+X(a, STATIC, SINGULAR, UINT32, num_tx_relay_canceled, 11)
#define meshtastic_LocalStats_CALLBACK NULL
#define meshtastic_LocalStats_DEFAULT NULL
@@ -500,7 +516,7 @@ extern const pb_msgdesc_t meshtastic_Nau7802Config_msg;
#define meshtastic_DeviceMetrics_size 27
#define meshtastic_EnvironmentMetrics_size 85
#define meshtastic_HealthMetrics_size 11
-#define meshtastic_LocalStats_size 42
+#define meshtastic_LocalStats_size 60
#define meshtastic_Nau7802Config_size 16
#define meshtastic_PowerMetrics_size 30
#define meshtastic_Telemetry_size 92
diff --git a/src/mesh/generated/meshtastic/xmodem.pb.cpp b/src/mesh/generated/meshtastic/xmodem.pb.cpp
index 8e5cde457..3960ccdaa 100644
--- a/src/mesh/generated/meshtastic/xmodem.pb.cpp
+++ b/src/mesh/generated/meshtastic/xmodem.pb.cpp
@@ -1,5 +1,5 @@
/* Automatically generated nanopb constant definitions */
-/* Generated by nanopb-0.4.8 */
+/* Generated by nanopb-0.4.9 */
#include "meshtastic/xmodem.pb.h"
#if PB_PROTO_HEADER_VERSION != 40
@@ -11,3 +11,4 @@ PB_BIND(meshtastic_XModem, meshtastic_XModem, AUTO)
+
diff --git a/src/mesh/generated/meshtastic/xmodem.pb.h b/src/mesh/generated/meshtastic/xmodem.pb.h
index 67bd0869f..76edc0df6 100644
--- a/src/mesh/generated/meshtastic/xmodem.pb.h
+++ b/src/mesh/generated/meshtastic/xmodem.pb.h
@@ -1,5 +1,5 @@
/* Automatically generated nanopb header */
-/* Generated by nanopb-0.4.8 */
+/* Generated by nanopb-0.4.9 */
#ifndef PB_MESHTASTIC_MESHTASTIC_XMODEM_PB_H_INCLUDED
#define PB_MESHTASTIC_MESHTASTIC_XMODEM_PB_H_INCLUDED
diff --git a/src/modules/AdminModule.cpp b/src/modules/AdminModule.cpp
index 2b1b35000..0368dffa3 100644
--- a/src/modules/AdminModule.cpp
+++ b/src/modules/AdminModule.cpp
@@ -66,7 +66,7 @@ bool AdminModule::handleReceivedProtobuf(const meshtastic_MeshPacket &mp, meshta
// if handled == false, then let others look at this message also if they want
bool handled = false;
assert(r);
- bool fromOthers = mp.from != 0 && mp.from != nodeDB->getNodeNum();
+ bool fromOthers = !isFromUs(&mp);
if (mp.which_payload_variant != meshtastic_MeshPacket_decoded_tag) {
return handled;
}
diff --git a/src/modules/CannedMessageModule.cpp b/src/modules/CannedMessageModule.cpp
index e0ea6a495..5352ac563 100644
--- a/src/modules/CannedMessageModule.cpp
+++ b/src/modules/CannedMessageModule.cpp
@@ -12,6 +12,7 @@
#include "detect/ScanI2C.h"
#include "input/ScanAndSelect.h"
#include "mesh/generated/meshtastic/cannedmessages.pb.h"
+#include "modules/AdminModule.h"
#include "main.h" // for cardkb_found
#include "modules/ExternalNotificationModule.h" // for buzzer control
@@ -268,6 +269,21 @@ int CannedMessageModule::handleInputEvent(const InputEvent *event)
showTemporaryMessage("GPS Toggled");
#endif
break;
+ case INPUT_BROKER_MSG_BLUETOOTH_TOGGLE: // toggle Bluetooth on/off
+ if (config.bluetooth.enabled == true) {
+ config.bluetooth.enabled = false;
+ LOG_INFO("User toggled Bluetooth");
+ nodeDB->saveToDisk();
+ disableBluetooth();
+ showTemporaryMessage("Bluetooth OFF");
+ } else if (config.bluetooth.enabled == false) {
+ config.bluetooth.enabled = true;
+ LOG_INFO("User toggled Bluetooth");
+ nodeDB->saveToDisk();
+ rebootAtMsec = millis() + 2000;
+ showTemporaryMessage("Bluetooth ON\nReboot");
+ }
+ break;
case INPUT_BROKER_MSG_SEND_PING: // fn+space send network ping like double press does
service->refreshLocalMeshNode();
if (service->trySendPosition(NODENUM_BROADCAST, true)) {
@@ -1147,7 +1163,6 @@ void CannedMessageModule::loadProtoForModule()
installDefaultCannedMessageModuleConfig();
}
}
-
/**
* @brief Save the module config to file.
*
diff --git a/src/modules/ExternalNotificationModule.cpp b/src/modules/ExternalNotificationModule.cpp
index e8356c214..735564823 100644
--- a/src/modules/ExternalNotificationModule.cpp
+++ b/src/modules/ExternalNotificationModule.cpp
@@ -435,7 +435,7 @@ ProcessMessage ExternalNotificationModule::handleReceived(const meshtastic_MeshP
drv.setWaveform(2, 0);
drv.go();
#endif
- if (getFrom(&mp) != nodeDB->getNodeNum()) {
+ if (!isFromUs(&mp)) {
// Check if the message contains a bell character. Don't do this loop for every pin, just once.
auto &p = mp.decoded;
bool containsBell = false;
@@ -600,4 +600,4 @@ void ExternalNotificationModule::handleSetRingtone(const char *from_msg)
if (changed) {
nodeDB->saveProto(rtttlConfigFile, meshtastic_RTTTLConfig_size, &meshtastic_RTTTLConfig_msg, &rtttlConfig);
}
-}
+}
\ No newline at end of file
diff --git a/src/modules/Modules.cpp b/src/modules/Modules.cpp
index 445270b33..809a8d87b 100644
--- a/src/modules/Modules.cpp
+++ b/src/modules/Modules.cpp
@@ -58,6 +58,7 @@
#include "main.h"
#include "modules/Telemetry/AirQualityTelemetry.h"
#include "modules/Telemetry/EnvironmentTelemetry.h"
+#include "modules/Telemetry/HealthTelemetry.h"
#endif
#if HAS_TELEMETRY && !MESHTASTIC_EXCLUDE_POWER_TELEMETRY
#include "modules/Telemetry/PowerTelemetry.h"
@@ -194,6 +195,10 @@ void setupModules()
if (nodeTelemetrySensorsMap[meshtastic_TelemetrySensorType_PMSA003I].first > 0) {
new AirQualityTelemetryModule();
}
+ if (nodeTelemetrySensorsMap[meshtastic_TelemetrySensorType_MAX30102].first > 0 ||
+ nodeTelemetrySensorsMap[meshtastic_TelemetrySensorType_MLX90614].first > 0) {
+ new HealthTelemetryModule();
+ }
#endif
#if HAS_TELEMETRY && !MESHTASTIC_EXCLUDE_POWER_TELEMETRY && !MESHTASTIC_EXCLUDE_ENVIRONMENTAL_SENSOR
new PowerTelemetryModule();
diff --git a/src/modules/NeighborInfoModule.cpp b/src/modules/NeighborInfoModule.cpp
index 55ed46b5e..e4c9b44bd 100644
--- a/src/modules/NeighborInfoModule.cpp
+++ b/src/modules/NeighborInfoModule.cpp
@@ -62,7 +62,8 @@ uint32_t NeighborInfoModule::collectNeighborInfo(meshtastic_NeighborInfo *neighb
NodeNum my_node_id = nodeDB->getNodeNum();
neighborInfo->node_id = my_node_id;
neighborInfo->last_sent_by_id = my_node_id;
- neighborInfo->node_broadcast_interval_secs = moduleConfig.neighbor_info.update_interval;
+ neighborInfo->node_broadcast_interval_secs =
+ Default::getConfiguredOrDefault(moduleConfig.neighbor_info.update_interval, default_telemetry_broadcast_interval_secs);
cleanUpNeighbors();
@@ -84,11 +85,12 @@ uint32_t NeighborInfoModule::collectNeighborInfo(meshtastic_NeighborInfo *neighb
*/
void NeighborInfoModule::cleanUpNeighbors()
{
+ uint32_t now = getTime();
NodeNum my_node_id = nodeDB->getNodeNum();
for (auto it = neighbors.rbegin(); it != neighbors.rend();) {
// We will remove a neighbor if we haven't heard from them in twice the broadcast interval
- if (!Throttle::isWithinTimespanMs(it->last_rx_time, it->node_broadcast_interval_secs * 2) &&
- (it->node_id != my_node_id)) {
+ // cannot use isWithinTimespanMs() as it->last_rx_time is seconds since 1970
+ if ((now - it->last_rx_time > it->node_broadcast_interval_secs * 2) && (it->node_id != my_node_id)) {
LOG_DEBUG("Removing neighbor with node ID 0x%x\n", it->node_id);
it = std::vector::reverse_iterator(
neighbors.erase(std::next(it).base())); // Erase the element and update the iterator
diff --git a/src/modules/NodeInfoModule.cpp b/src/modules/NodeInfoModule.cpp
index 41f008fb0..61ec375cc 100644
--- a/src/modules/NodeInfoModule.cpp
+++ b/src/modules/NodeInfoModule.cpp
@@ -26,7 +26,7 @@ bool NodeInfoModule::handleReceivedProtobuf(const meshtastic_MeshPacket &mp, mes
}
// if user has changed while packet was not for us, inform phone
- if (hasChanged && !wasBroadcast && mp.to != nodeDB->getNodeNum())
+ if (hasChanged && !wasBroadcast && !isToUs(&mp))
service->sendToPhone(packetPool.allocCopy(mp));
// LOG_DEBUG("did handleReceived\n");
diff --git a/src/modules/PositionModule.cpp b/src/modules/PositionModule.cpp
index f49a654af..6ad30f927 100644
--- a/src/modules/PositionModule.cpp
+++ b/src/modules/PositionModule.cpp
@@ -54,7 +54,7 @@ bool PositionModule::handleReceivedProtobuf(const meshtastic_MeshPacket &mp, mes
// FIXME this can in fact happen with packets sent from EUD (src=RX_SRC_USER)
// to set fixed location, EUD-GPS location or just the time (see also issue #900)
bool isLocal = false;
- if (nodeDB->getNodeNum() == getFrom(&mp)) {
+ if (isFromUs(&mp)) {
isLocal = true;
if (config.position.fixed_position) {
LOG_DEBUG("Ignore incoming position update from myself except for time, because position.fixed_position is true\n");
@@ -110,7 +110,7 @@ bool PositionModule::handleReceivedProtobuf(const meshtastic_MeshPacket &mp, mes
void PositionModule::alterReceivedProtobuf(meshtastic_MeshPacket &mp, meshtastic_Position *p)
{
// Phone position packets need to be truncated to the channel precision
- if (nodeDB->getNodeNum() == getFrom(&mp) && (precision < 32 && precision > 0)) {
+ if (isFromUs(&mp) && (precision < 32 && precision > 0)) {
LOG_DEBUG("Truncating phone position to channel precision %i\n", precision);
p->latitude_i = p->latitude_i & (UINT32_MAX << (32 - precision));
p->longitude_i = p->longitude_i & (UINT32_MAX << (32 - precision));
diff --git a/src/modules/RangeTestModule.cpp b/src/modules/RangeTestModule.cpp
index c98f15d40..e78b4e68d 100644
--- a/src/modules/RangeTestModule.cpp
+++ b/src/modules/RangeTestModule.cpp
@@ -139,7 +139,7 @@ ProcessMessage RangeTestModuleRadio::handleReceived(const meshtastic_MeshPacket
LOG_INFO.getNodeNum(), mp.from, mp.to, mp.id, p.payload.size, p.payload.bytes);
*/
- if (getFrom(&mp) != nodeDB->getNodeNum()) {
+ if (!isFromUs(&mp)) {
if (moduleConfig.range_test.save) {
appendFile(mp);
diff --git a/src/modules/RoutingModule.cpp b/src/modules/RoutingModule.cpp
index b7be4abc9..3b7be1ab7 100644
--- a/src/modules/RoutingModule.cpp
+++ b/src/modules/RoutingModule.cpp
@@ -28,7 +28,7 @@ bool RoutingModule::handleReceivedProtobuf(const meshtastic_MeshPacket &mp, mesh
// FIXME - move this to a non promsicious PhoneAPI module?
// Note: we are careful not to send back packets that started with the phone back to the phone
- if ((mp.to == NODENUM_BROADCAST || mp.to == nodeDB->getNodeNum()) && (mp.from != 0)) {
+ if ((mp.to == NODENUM_BROADCAST || isToUs(&mp)) && (mp.from != 0)) {
printPacket("Delivering rx packet", &mp);
service->handleFromRadio(&mp);
}
diff --git a/src/modules/SerialModule.cpp b/src/modules/SerialModule.cpp
index 6d6a947bc..d40b59345 100644
--- a/src/modules/SerialModule.cpp
+++ b/src/modules/SerialModule.cpp
@@ -310,7 +310,7 @@ ProcessMessage SerialModuleRadio::handleReceived(const meshtastic_MeshPacket &mp
// LOG_DEBUG("Received text msg self=0x%0x, from=0x%0x, to=0x%0x, id=%d, msg=%.*s\n",
// nodeDB->getNodeNum(), mp.from, mp.to, mp.id, p.payload.size, p.payload.bytes);
- if (getFrom(&mp) == nodeDB->getNodeNum()) {
+ if (!isFromUs(&mp)) {
/*
* If moduleConfig.serial.echo is true, then echo the packets that are sent out
diff --git a/src/modules/StoreForwardModule.cpp b/src/modules/StoreForwardModule.cpp
index 58be8c01e..e0092839f 100644
--- a/src/modules/StoreForwardModule.cpp
+++ b/src/modules/StoreForwardModule.cpp
@@ -333,7 +333,7 @@ void StoreForwardModule::sendErrorTextMessage(NodeNum dest, bool want_response)
if (this->busy) {
str = "S&F - Busy. Try again shortly.";
} else {
- str = "S&F - Not available on this channel.";
+ str = "S&F not permitted on the public channel.";
}
LOG_WARN("%s\n", str);
memcpy(pr->decoded.payload.bytes, str, strlen(str));
@@ -382,8 +382,7 @@ ProcessMessage StoreForwardModule::handleReceived(const meshtastic_MeshPacket &m
if ((mp.decoded.portnum == meshtastic_PortNum_TEXT_MESSAGE_APP) && is_server) {
auto &p = mp.decoded;
- if (mp.to == nodeDB->getNodeNum() && (p.payload.bytes[0] == 'S') && (p.payload.bytes[1] == 'F') &&
- (p.payload.bytes[2] == 0x00)) {
+ if (isToUs(&mp) && (p.payload.bytes[0] == 'S') && (p.payload.bytes[1] == 'F') && (p.payload.bytes[2] == 0x00)) {
LOG_DEBUG("Legacy Request to send\n");
// Send the last 60 minutes of messages.
@@ -396,7 +395,7 @@ ProcessMessage StoreForwardModule::handleReceived(const meshtastic_MeshPacket &m
storeForwardModule->historyAdd(mp);
LOG_INFO("S&F stored. Message history contains %u records now.\n", this->packetHistoryTotalCount);
}
- } else if (getFrom(&mp) != nodeDB->getNodeNum() && mp.decoded.portnum == meshtastic_PortNum_STORE_FORWARD_APP) {
+ } else if (!isFromUs(&mp) && mp.decoded.portnum == meshtastic_PortNum_STORE_FORWARD_APP) {
auto &p = mp.decoded;
meshtastic_StoreAndForward scratch;
meshtastic_StoreAndForward *decoded = NULL;
diff --git a/src/modules/Telemetry/DeviceTelemetry.cpp b/src/modules/Telemetry/DeviceTelemetry.cpp
index dd5067784..eb3f67e96 100644
--- a/src/modules/Telemetry/DeviceTelemetry.cpp
+++ b/src/modules/Telemetry/DeviceTelemetry.cpp
@@ -127,6 +127,11 @@ void DeviceTelemetryModule::sendLocalStatsToPhone()
telemetry.variant.local_stats.num_packets_tx = RadioLibInterface::instance->txGood;
telemetry.variant.local_stats.num_packets_rx = RadioLibInterface::instance->rxGood + RadioLibInterface::instance->rxBad;
telemetry.variant.local_stats.num_packets_rx_bad = RadioLibInterface::instance->rxBad;
+ telemetry.variant.local_stats.num_tx_relay = RadioLibInterface::instance->txRelay;
+ }
+ if (router) {
+ telemetry.variant.local_stats.num_rx_dupe = router->rxDupe;
+ telemetry.variant.local_stats.num_tx_relay_canceled = router->txRelayCanceled;
}
LOG_INFO(
diff --git a/src/modules/Telemetry/EnvironmentTelemetry.cpp b/src/modules/Telemetry/EnvironmentTelemetry.cpp
index ac291c4ab..1ccdedeb7 100644
--- a/src/modules/Telemetry/EnvironmentTelemetry.cpp
+++ b/src/modules/Telemetry/EnvironmentTelemetry.cpp
@@ -10,6 +10,7 @@
#include "PowerFSM.h"
#include "RTC.h"
#include "Router.h"
+#include "UnitConversions.h"
#include "main.h"
#include "power.h"
#include "sleep.h"
@@ -182,23 +183,6 @@ bool EnvironmentTelemetryModule::wantUIFrame()
return moduleConfig.telemetry.environment_screen_enabled;
}
-float EnvironmentTelemetryModule::CelsiusToFahrenheit(float c)
-{
- return (c * 9) / 5 + 32;
-}
-
-uint32_t GetTimeSinceMeshPacket(const meshtastic_MeshPacket *mp)
-{
- uint32_t now = getTime();
-
- uint32_t last_seen = mp->rx_time;
- int delta = (int)(now - last_seen);
- if (delta < 0) // our clock must be slightly off still - not set from GPS yet
- delta = 0;
-
- return delta;
-}
-
void EnvironmentTelemetryModule::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y)
{
display->setTextAlignment(TEXT_ALIGN_LEFT);
@@ -213,7 +197,7 @@ void EnvironmentTelemetryModule::drawFrame(OLEDDisplay *display, OLEDDisplayUiSt
// Decode the last measurement packet
meshtastic_Telemetry lastMeasurement;
- uint32_t agoSecs = GetTimeSinceMeshPacket(lastMeasurementPacket);
+ uint32_t agoSecs = service->GetTimeSinceMeshPacket(lastMeasurementPacket);
const char *lastSender = getSenderShortName(*lastMeasurementPacket);
const meshtastic_Data &p = lastMeasurementPacket->decoded;
@@ -228,7 +212,8 @@ void EnvironmentTelemetryModule::drawFrame(OLEDDisplay *display, OLEDDisplayUiSt
String last_temp = String(lastMeasurement.variant.environment_metrics.temperature, 0) + "°C";
if (moduleConfig.telemetry.environment_display_fahrenheit) {
- last_temp = String(CelsiusToFahrenheit(lastMeasurement.variant.environment_metrics.temperature), 0) + "°F";
+ last_temp =
+ String(UnitConversions::CelsiusToFahrenheit(lastMeasurement.variant.environment_metrics.temperature), 0) + "°F";
}
// Continue with the remaining details
diff --git a/src/modules/Telemetry/EnvironmentTelemetry.h b/src/modules/Telemetry/EnvironmentTelemetry.h
index 59d272e78..e680d8bbd 100644
--- a/src/modules/Telemetry/EnvironmentTelemetry.h
+++ b/src/modules/Telemetry/EnvironmentTelemetry.h
@@ -52,7 +52,6 @@ class EnvironmentTelemetryModule : private concurrency::OSThread, public Protobu
meshtastic_AdminMessage *response) override;
private:
- float CelsiusToFahrenheit(float c);
bool firstTime = 1;
meshtastic_MeshPacket *lastMeasurementPacket;
uint32_t sendToPhoneIntervalMs = SECONDS_IN_MINUTE * 1000; // Send to phone every minute
diff --git a/src/modules/Telemetry/HealthTelemetry.cpp b/src/modules/Telemetry/HealthTelemetry.cpp
new file mode 100644
index 000000000..bcf9d9d57
--- /dev/null
+++ b/src/modules/Telemetry/HealthTelemetry.cpp
@@ -0,0 +1,249 @@
+#include "configuration.h"
+
+#if !MESHTASTIC_EXCLUDE_ENVIRONMENTAL_SENSOR && !defined(ARCH_PORTDUINO)
+
+#include "../mesh/generated/meshtastic/telemetry.pb.h"
+#include "Default.h"
+#include "HealthTelemetry.h"
+#include "MeshService.h"
+#include "NodeDB.h"
+#include "PowerFSM.h"
+#include "RTC.h"
+#include "Router.h"
+#include "UnitConversions.h"
+#include "main.h"
+#include "power.h"
+#include "sleep.h"
+#include "target_specific.h"
+#include
+#include
+
+// Sensors
+#include "Sensor/MAX30102Sensor.h"
+#include "Sensor/MLX90614Sensor.h"
+
+MAX30102Sensor max30102Sensor;
+MLX90614Sensor mlx90614Sensor;
+
+#define FAILED_STATE_SENSOR_READ_MULTIPLIER 10
+#define DISPLAY_RECEIVEID_MEASUREMENTS_ON_SCREEN true
+
+#if (HAS_SCREEN)
+#include "graphics/ScreenFonts.h"
+#endif
+#include
+
+int32_t HealthTelemetryModule::runOnce()
+{
+ if (sleepOnNextExecution == true) {
+ sleepOnNextExecution = false;
+ uint32_t nightyNightMs = Default::getConfiguredOrDefaultMs(moduleConfig.telemetry.health_update_interval,
+ default_telemetry_broadcast_interval_secs);
+ LOG_DEBUG("Sleeping for %ims, then awaking to send metrics again.\n", nightyNightMs);
+ doDeepSleep(nightyNightMs, true);
+ }
+
+ uint32_t result = UINT32_MAX;
+
+ if (!(moduleConfig.telemetry.health_measurement_enabled || moduleConfig.telemetry.health_screen_enabled)) {
+ // If this module is not enabled, and the user doesn't want the display screen don't waste any OSThread time on it
+ return disable();
+ }
+
+ if (firstTime) {
+ // This is the first time the OSThread library has called this function, so do some setup
+ firstTime = false;
+
+ if (moduleConfig.telemetry.health_measurement_enabled) {
+ LOG_INFO("Health Telemetry: Initializing\n");
+ // Initialize sensors
+ if (mlx90614Sensor.hasSensor())
+ result = mlx90614Sensor.runOnce();
+ if (max30102Sensor.hasSensor())
+ result = max30102Sensor.runOnce();
+ }
+ return result;
+ } else {
+ // if we somehow got to a second run of this module with measurement disabled, then just wait forever
+ if (!moduleConfig.telemetry.health_measurement_enabled) {
+ return disable();
+ }
+
+ if (((lastSentToMesh == 0) ||
+ !Throttle::isWithinTimespanMs(lastSentToMesh, Default::getConfiguredOrDefaultMsScaled(
+ moduleConfig.telemetry.health_update_interval,
+ default_telemetry_broadcast_interval_secs, numOnlineNodes))) &&
+ airTime->isTxAllowedChannelUtil(config.device.role != meshtastic_Config_DeviceConfig_Role_SENSOR) &&
+ airTime->isTxAllowedAirUtil()) {
+ sendTelemetry();
+ lastSentToMesh = millis();
+ } else if (((lastSentToPhone == 0) || !Throttle::isWithinTimespanMs(lastSentToPhone, sendToPhoneIntervalMs)) &&
+ (service->isToPhoneQueueEmpty())) {
+ // Just send to phone when it's not our time to send to mesh yet
+ // Only send while queue is empty (phone assumed connected)
+ sendTelemetry(NODENUM_BROADCAST, true);
+ lastSentToPhone = millis();
+ }
+ }
+ return min(sendToPhoneIntervalMs, result);
+}
+
+bool HealthTelemetryModule::wantUIFrame()
+{
+ return moduleConfig.telemetry.health_screen_enabled;
+}
+
+void HealthTelemetryModule::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y)
+{
+ display->setTextAlignment(TEXT_ALIGN_LEFT);
+ display->setFont(FONT_SMALL);
+
+ if (lastMeasurementPacket == nullptr) {
+ // If there's no valid packet, display "Health"
+ display->drawString(x, y, "Health");
+ display->drawString(x, y += _fontHeight(FONT_SMALL), "No measurement");
+ return;
+ }
+
+ // Decode the last measurement packet
+ meshtastic_Telemetry lastMeasurement;
+ uint32_t agoSecs = service->GetTimeSinceMeshPacket(lastMeasurementPacket);
+ const char *lastSender = getSenderShortName(*lastMeasurementPacket);
+
+ const meshtastic_Data &p = lastMeasurementPacket->decoded;
+ if (!pb_decode_from_bytes(p.payload.bytes, p.payload.size, &meshtastic_Telemetry_msg, &lastMeasurement)) {
+ display->drawString(x, y, "Measurement Error");
+ LOG_ERROR("Unable to decode last packet");
+ return;
+ }
+
+ // Display "Health From: ..." on its own
+ display->drawString(x, y, "Health From: " + String(lastSender) + "(" + String(agoSecs) + "s)");
+
+ String last_temp = String(lastMeasurement.variant.health_metrics.temperature, 0) + "°C";
+ if (moduleConfig.telemetry.environment_display_fahrenheit) {
+ last_temp = String(UnitConversions::CelsiusToFahrenheit(lastMeasurement.variant.health_metrics.temperature), 0) + "°F";
+ }
+
+ // Continue with the remaining details
+ display->drawString(x, y += _fontHeight(FONT_SMALL), "Temp: " + last_temp);
+ if (lastMeasurement.variant.health_metrics.has_heart_bpm) {
+ display->drawString(x, y += _fontHeight(FONT_SMALL),
+ "Heart Rate: " + String(lastMeasurement.variant.health_metrics.heart_bpm, 0) + " bpm");
+ }
+ if (lastMeasurement.variant.health_metrics.has_spO2) {
+ display->drawString(x, y += _fontHeight(FONT_SMALL),
+ "spO2: " + String(lastMeasurement.variant.health_metrics.spO2, 0) + " %");
+ }
+}
+
+bool HealthTelemetryModule::handleReceivedProtobuf(const meshtastic_MeshPacket &mp, meshtastic_Telemetry *t)
+{
+ if (t->which_variant == meshtastic_Telemetry_health_metrics_tag) {
+#ifdef DEBUG_PORT
+ const char *sender = getSenderShortName(mp);
+
+ LOG_INFO("(Received from %s): temperature=%f, heart_bpm=%d, spO2=%d,\n", sender, t->variant.health_metrics.temperature,
+ t->variant.health_metrics.heart_bpm, t->variant.health_metrics.spO2);
+
+#endif
+ // release previous packet before occupying a new spot
+ if (lastMeasurementPacket != nullptr)
+ packetPool.release(lastMeasurementPacket);
+
+ lastMeasurementPacket = packetPool.allocCopy(mp);
+ }
+
+ return false; // Let others look at this message also if they want
+}
+
+bool HealthTelemetryModule::getHealthTelemetry(meshtastic_Telemetry *m)
+{
+ bool valid = true;
+ bool hasSensor = false;
+ m->time = getTime();
+ m->which_variant = meshtastic_Telemetry_health_metrics_tag;
+ m->variant.health_metrics = meshtastic_HealthMetrics_init_zero;
+
+ if (max30102Sensor.hasSensor()) {
+ valid = valid && max30102Sensor.getMetrics(m);
+ hasSensor = true;
+ }
+ if (mlx90614Sensor.hasSensor()) {
+ valid = valid && mlx90614Sensor.getMetrics(m);
+ hasSensor = true;
+ }
+
+ return valid && hasSensor;
+}
+
+meshtastic_MeshPacket *HealthTelemetryModule::allocReply()
+{
+ if (currentRequest) {
+ auto req = *currentRequest;
+ const auto &p = req.decoded;
+ meshtastic_Telemetry scratch;
+ meshtastic_Telemetry *decoded = NULL;
+ memset(&scratch, 0, sizeof(scratch));
+ if (pb_decode_from_bytes(p.payload.bytes, p.payload.size, &meshtastic_Telemetry_msg, &scratch)) {
+ decoded = &scratch;
+ } else {
+ LOG_ERROR("Error decoding HealthTelemetry module!\n");
+ return NULL;
+ }
+ // Check for a request for health metrics
+ if (decoded->which_variant == meshtastic_Telemetry_health_metrics_tag) {
+ meshtastic_Telemetry m = meshtastic_Telemetry_init_zero;
+ if (getHealthTelemetry(&m)) {
+ LOG_INFO("Health telemetry replying to request\n");
+ return allocDataProtobuf(m);
+ } else {
+ return NULL;
+ }
+ }
+ }
+ return NULL;
+}
+
+bool HealthTelemetryModule::sendTelemetry(NodeNum dest, bool phoneOnly)
+{
+ meshtastic_Telemetry m = meshtastic_Telemetry_init_zero;
+ m.which_variant = meshtastic_Telemetry_health_metrics_tag;
+ m.time = getTime();
+ if (getHealthTelemetry(&m)) {
+ LOG_INFO("(Sending): temperature=%f, heart_bpm=%d, spO2=%d\n", m.variant.health_metrics.temperature,
+ m.variant.health_metrics.heart_bpm, m.variant.health_metrics.spO2);
+
+ sensor_read_error_count = 0;
+
+ meshtastic_MeshPacket *p = allocDataProtobuf(m);
+ p->to = dest;
+ p->decoded.want_response = false;
+ if (config.device.role == meshtastic_Config_DeviceConfig_Role_SENSOR)
+ p->priority = meshtastic_MeshPacket_Priority_RELIABLE;
+ else
+ p->priority = meshtastic_MeshPacket_Priority_BACKGROUND;
+ // release previous packet before occupying a new spot
+ if (lastMeasurementPacket != nullptr)
+ packetPool.release(lastMeasurementPacket);
+
+ lastMeasurementPacket = packetPool.allocCopy(*p);
+ if (phoneOnly) {
+ LOG_INFO("Sending packet to phone\n");
+ service->sendToPhone(p);
+ } else {
+ LOG_INFO("Sending packet to mesh\n");
+ service->sendToMesh(p, RX_SRC_LOCAL, true);
+
+ if (config.device.role == meshtastic_Config_DeviceConfig_Role_SENSOR && config.power.is_power_saving) {
+ LOG_DEBUG("Starting next execution in 5 seconds and then going to sleep.\n");
+ sleepOnNextExecution = true;
+ setIntervalFromNow(5000);
+ }
+ }
+ return true;
+ }
+ return false;
+}
+
+#endif
diff --git a/src/modules/Telemetry/HealthTelemetry.h b/src/modules/Telemetry/HealthTelemetry.h
new file mode 100644
index 000000000..4ad0da838
--- /dev/null
+++ b/src/modules/Telemetry/HealthTelemetry.h
@@ -0,0 +1,60 @@
+#include "configuration.h"
+
+#if !MESHTASTIC_EXCLUDE_ENVIRONMENTAL_SENSOR && !defined(ARCH_PORTDUINO)
+
+#pragma once
+#include "../mesh/generated/meshtastic/telemetry.pb.h"
+#include "NodeDB.h"
+#include "ProtobufModule.h"
+#include
+#include
+
+class HealthTelemetryModule : private concurrency::OSThread, public ProtobufModule
+{
+ CallbackObserver nodeStatusObserver =
+ CallbackObserver(this, &HealthTelemetryModule::handleStatusUpdate);
+
+ public:
+ HealthTelemetryModule()
+ : concurrency::OSThread("HealthTelemetryModule"),
+ ProtobufModule("HealthTelemetry", meshtastic_PortNum_TELEMETRY_APP, &meshtastic_Telemetry_msg)
+ {
+ lastMeasurementPacket = nullptr;
+ nodeStatusObserver.observe(&nodeStatus->onNewStatus);
+ setIntervalFromNow(10 * 1000);
+ }
+
+#if !HAS_SCREEN
+ void drawFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y);
+#else
+ virtual void drawFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y) override;
+#endif
+
+ virtual bool wantUIFrame() override;
+
+ 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 bool handleReceivedProtobuf(const meshtastic_MeshPacket &mp, meshtastic_Telemetry *p) override;
+ virtual int32_t runOnce() override;
+ /** Called to get current Health telemetry data
+ @return true if it contains valid data
+ */
+ bool getHealthTelemetry(meshtastic_Telemetry *m);
+ virtual meshtastic_MeshPacket *allocReply() override;
+ /**
+ * Send our Telemetry into the mesh
+ */
+ bool sendTelemetry(NodeNum dest = NODENUM_BROADCAST, bool wantReplies = false);
+
+ private:
+ bool firstTime = 1;
+ meshtastic_MeshPacket *lastMeasurementPacket;
+ uint32_t sendToPhoneIntervalMs = SECONDS_IN_MINUTE * 1000; // Send to phone every minute
+ uint32_t lastSentToMesh = 0;
+ uint32_t lastSentToPhone = 0;
+ uint32_t sensor_read_error_count = 0;
+};
+
+#endif
diff --git a/src/modules/Telemetry/PowerTelemetry.cpp b/src/modules/Telemetry/PowerTelemetry.cpp
index 038cbfadc..be3048998 100644
--- a/src/modules/Telemetry/PowerTelemetry.cpp
+++ b/src/modules/Telemetry/PowerTelemetry.cpp
@@ -94,18 +94,6 @@ bool PowerTelemetryModule::wantUIFrame()
return moduleConfig.telemetry.power_screen_enabled;
}
-uint32_t GetTimeyWimeySinceMeshPacket(const meshtastic_MeshPacket *mp)
-{
- uint32_t now = getTime();
-
- uint32_t last_seen = mp->rx_time;
- int delta = (int)(now - last_seen);
- if (delta < 0) // our clock must be slightly off still - not set from GPS yet
- delta = 0;
-
- return delta;
-}
-
void PowerTelemetryModule::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16_t x, int16_t y)
{
display->setTextAlignment(TEXT_ALIGN_LEFT);
@@ -119,7 +107,7 @@ void PowerTelemetryModule::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *s
meshtastic_Telemetry lastMeasurement;
- uint32_t agoSecs = GetTimeyWimeySinceMeshPacket(lastMeasurementPacket);
+ uint32_t agoSecs = service->GetTimeSinceMeshPacket(lastMeasurementPacket);
const char *lastSender = getSenderShortName(*lastMeasurementPacket);
const meshtastic_Data &p = lastMeasurementPacket->decoded;
@@ -265,4 +253,4 @@ bool PowerTelemetryModule::sendTelemetry(NodeNum dest, bool phoneOnly)
return false;
}
-#endif
\ No newline at end of file
+#endif
diff --git a/src/modules/Telemetry/Sensor/MAX30102Sensor.cpp b/src/modules/Telemetry/Sensor/MAX30102Sensor.cpp
new file mode 100644
index 000000000..b3b20e5f2
--- /dev/null
+++ b/src/modules/Telemetry/Sensor/MAX30102Sensor.cpp
@@ -0,0 +1,83 @@
+#include "configuration.h"
+
+#if !MESHTASTIC_EXCLUDE_ENVIRONMENTAL_SENSOR && !defined(ARCH_PORTDUINO)
+
+#include "../mesh/generated/meshtastic/telemetry.pb.h"
+#include "MAX30102Sensor.h"
+#include "TelemetrySensor.h"
+#include
+
+MAX30102Sensor::MAX30102Sensor() : TelemetrySensor(meshtastic_TelemetrySensorType_MAX30102, "MAX30102") {}
+
+int32_t MAX30102Sensor::runOnce()
+{
+ LOG_INFO("Init sensor: %s\n", sensorName);
+ if (!hasSensor()) {
+ return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS;
+ }
+
+ if (max30102.begin(*nodeTelemetrySensorsMap[sensorType].second, _speed, nodeTelemetrySensorsMap[sensorType].first) ==
+ true) // MAX30102 init
+ {
+ byte brightness = 60; // 0=Off to 255=50mA
+ byte sampleAverage = 4; // 1, 2, 4, 8, 16, 32
+ byte leds = 2; // 1 = Red only, 2 = Red + IR
+ byte sampleRate = 100; // 50, 100, 200, 400, 800, 1000, 1600, 3200
+ int pulseWidth = 411; // 69, 118, 215, 411
+ int adcRange = 4096; // 2048, 4096, 8192, 16384
+
+ max30102.enableDIETEMPRDY(); // Enable the temperature ready interrupt
+ max30102.setup(brightness, sampleAverage, leds, sampleRate, pulseWidth, adcRange);
+ LOG_DEBUG("MAX30102 Init Succeed\n");
+ status = true;
+ } else {
+ LOG_ERROR("MAX30102 Init Failed\n");
+ status = false;
+ }
+ return initI2CSensor();
+}
+
+void MAX30102Sensor::setup() {}
+
+bool MAX30102Sensor::getMetrics(meshtastic_Telemetry *measurement)
+{
+ uint32_t ir_buff[MAX30102_BUFFER_LEN];
+ uint32_t red_buff[MAX30102_BUFFER_LEN];
+ int32_t spo2;
+ int8_t spo2_valid;
+ int32_t heart_rate;
+ int8_t heart_rate_valid;
+ float temp = max30102.readTemperature();
+
+ measurement->variant.environment_metrics.temperature = temp;
+ measurement->variant.environment_metrics.has_temperature = true;
+ measurement->variant.health_metrics.temperature = temp;
+ measurement->variant.health_metrics.has_temperature = true;
+ for (byte i = 0; i < MAX30102_BUFFER_LEN; i++) {
+ while (max30102.available() == false)
+ max30102.check();
+
+ red_buff[i] = max30102.getRed();
+ ir_buff[i] = max30102.getIR();
+ max30102.nextSample();
+ }
+
+ maxim_heart_rate_and_oxygen_saturation(ir_buff, MAX30102_BUFFER_LEN, red_buff, &spo2, &spo2_valid, &heart_rate,
+ &heart_rate_valid);
+ LOG_DEBUG("heart_rate=%d(%d), sp02=%d(%d)", heart_rate, heart_rate_valid, spo2, spo2_valid);
+ if (heart_rate_valid) {
+ measurement->variant.health_metrics.has_heart_bpm = true;
+ measurement->variant.health_metrics.heart_bpm = heart_rate;
+ } else {
+ measurement->variant.health_metrics.has_heart_bpm = false;
+ }
+ if (spo2_valid) {
+ measurement->variant.health_metrics.has_spO2 = true;
+ measurement->variant.health_metrics.spO2 = spo2;
+ } else {
+ measurement->variant.health_metrics.has_spO2 = true;
+ }
+ return true;
+}
+
+#endif
diff --git a/src/modules/Telemetry/Sensor/MAX30102Sensor.h b/src/modules/Telemetry/Sensor/MAX30102Sensor.h
new file mode 100644
index 000000000..426d9d365
--- /dev/null
+++ b/src/modules/Telemetry/Sensor/MAX30102Sensor.h
@@ -0,0 +1,26 @@
+#include "configuration.h"
+
+#if !MESHTASTIC_EXCLUDE_ENVIRONMENTAL_SENSOR && !defined(ARCH_PORTDUINO)
+
+#include "../mesh/generated/meshtastic/telemetry.pb.h"
+#include "TelemetrySensor.h"
+#include
+
+#define MAX30102_BUFFER_LEN 100
+
+class MAX30102Sensor : public TelemetrySensor
+{
+ private:
+ MAX30105 max30102 = MAX30105();
+ uint32_t _speed = 200000UL;
+
+ protected:
+ virtual void setup() override;
+
+ public:
+ MAX30102Sensor();
+ virtual int32_t runOnce() override;
+ virtual bool getMetrics(meshtastic_Telemetry *measurement) override;
+};
+
+#endif
diff --git a/src/modules/Telemetry/Sensor/MLX90614Sensor.cpp b/src/modules/Telemetry/Sensor/MLX90614Sensor.cpp
new file mode 100644
index 000000000..92c22bf21
--- /dev/null
+++ b/src/modules/Telemetry/Sensor/MLX90614Sensor.cpp
@@ -0,0 +1,44 @@
+#include "configuration.h"
+
+#if !MESHTASTIC_EXCLUDE_ENVIRONMENTAL_SENSOR && !defined(ARCH_PORTDUINO)
+
+#include "../mesh/generated/meshtastic/telemetry.pb.h"
+#include "MLX90614Sensor.h"
+#include "TelemetrySensor.h"
+MLX90614Sensor::MLX90614Sensor() : TelemetrySensor(meshtastic_TelemetrySensorType_MLX90614, "MLX90614") {}
+
+int32_t MLX90614Sensor::runOnce()
+{
+ LOG_INFO("Init sensor: %s\n", sensorName);
+ if (!hasSensor()) {
+ return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS;
+ }
+
+ if (mlx.begin(nodeTelemetrySensorsMap[sensorType].first, nodeTelemetrySensorsMap[sensorType].second) == true) // MLX90614 init
+ {
+ LOG_DEBUG("MLX90614 emissivity: %f", mlx.readEmissivity());
+ if (fabs(MLX90614_EMISSIVITY - mlx.readEmissivity()) > 0.001) {
+ mlx.writeEmissivity(MLX90614_EMISSIVITY);
+ LOG_INFO("MLX90614 emissivity updated. In case of weird data, power cycle.");
+ }
+ LOG_DEBUG("MLX90614 Init Succeed\n");
+ status = true;
+ } else {
+ LOG_ERROR("MLX90614 Init Failed\n");
+ status = false;
+ }
+ return initI2CSensor();
+}
+
+void MLX90614Sensor::setup() {}
+
+bool MLX90614Sensor::getMetrics(meshtastic_Telemetry *measurement)
+{
+ measurement->variant.environment_metrics.temperature = mlx.readAmbientTempC();
+ measurement->variant.environment_metrics.has_temperature = true;
+ measurement->variant.health_metrics.temperature = mlx.readObjectTempC();
+ measurement->variant.health_metrics.has_temperature = true;
+ return true;
+}
+
+#endif
diff --git a/src/modules/Telemetry/Sensor/MLX90614Sensor.h b/src/modules/Telemetry/Sensor/MLX90614Sensor.h
new file mode 100644
index 000000000..00f63449e
--- /dev/null
+++ b/src/modules/Telemetry/Sensor/MLX90614Sensor.h
@@ -0,0 +1,24 @@
+#include "configuration.h"
+
+#if !MESHTASTIC_EXCLUDE_ENVIRONMENTAL_SENSOR && !defined(ARCH_PORTDUINO)
+#include "../mesh/generated/meshtastic/telemetry.pb.h"
+#include "TelemetrySensor.h"
+#include
+
+#define MLX90614_EMISSIVITY 0.98 // human skin
+
+class MLX90614Sensor : public TelemetrySensor
+{
+ private:
+ Adafruit_MLX90614 mlx = Adafruit_MLX90614();
+
+ protected:
+ virtual void setup() override;
+
+ public:
+ MLX90614Sensor();
+ virtual int32_t runOnce() override;
+ virtual bool getMetrics(meshtastic_Telemetry *measurement) override;
+};
+
+#endif
diff --git a/src/modules/TraceRouteModule.cpp b/src/modules/TraceRouteModule.cpp
index be8278824..955098c28 100644
--- a/src/modules/TraceRouteModule.cpp
+++ b/src/modules/TraceRouteModule.cpp
@@ -16,8 +16,8 @@ void TraceRouteModule::alterReceivedProtobuf(meshtastic_MeshPacket &p, meshtasti
// Insert unknown hops if necessary
insertUnknownHops(p, r, !incoming.request_id);
- // Append ID and SNR. For the last hop (p.to == nodeDB->getNodeNum()), we only need to append the SNR
- appendMyIDandSNR(r, p.rx_snr, !incoming.request_id, p.to == nodeDB->getNodeNum());
+ // Append ID and SNR. If the last hop is to us, we only need to append the SNR
+ appendMyIDandSNR(r, p.rx_snr, !incoming.request_id, isToUs(&p));
if (!incoming.request_id)
printRoute(r, p.from, p.to, true);
else
diff --git a/src/modules/esp32/AudioModule.cpp b/src/modules/esp32/AudioModule.cpp
index 8a29f9a2e..89e4b4e25 100644
--- a/src/modules/esp32/AudioModule.cpp
+++ b/src/modules/esp32/AudioModule.cpp
@@ -273,7 +273,7 @@ ProcessMessage AudioModule::handleReceived(const meshtastic_MeshPacket &mp)
{
if ((moduleConfig.audio.codec2_enabled) && (myRegion->audioPermitted)) {
auto &p = mp.decoded;
- if (getFrom(&mp) != nodeDB->getNodeNum()) {
+ if (!isFromUs(&mp)) {
memcpy(rx_encode_frame, p.payload.bytes, p.payload.size);
radio_state = RadioState::rx;
rx_encode_frame_index = p.payload.size;
diff --git a/src/mqtt/MQTT.cpp b/src/mqtt/MQTT.cpp
index 8d08f97a6..0c1ce0c7c 100644
--- a/src/mqtt/MQTT.cpp
+++ b/src/mqtt/MQTT.cpp
@@ -150,7 +150,7 @@ void MQTT::onReceive(char *topic, byte *payload, size_t length)
// Generate an implicit ACK towards ourselves (handled and processed only locally!) for this message.
// We do this because packets are not rebroadcasted back into MQTT anymore and we assume that at least one node
// receives it when we get our own packet back. Then we'll stop our retransmissions.
- if (e.packet && getFrom(e.packet) == nodeDB->getNodeNum())
+ if (e.packet && isFromUs(e.packet))
routingModule->sendAckNak(meshtastic_Routing_Error_NONE, getFrom(e.packet), e.packet->id, ch.index);
else
LOG_INFO("Ignoring downlink message we originally sent.\n");
@@ -162,7 +162,7 @@ void MQTT::onReceive(char *topic, byte *payload, size_t length)
meshtastic_MeshPacket *p = packetPool.allocCopy(*e.packet);
p->via_mqtt = true; // Mark that the packet was received via MQTT
- if (p->from == 0 || p->from == nodeDB->getNodeNum()) {
+ if (isFromUs(p)) {
LOG_INFO("Ignoring downlink message we originally sent.\n");
packetPool.release(p);
return;
@@ -188,7 +188,7 @@ void MQTT::onReceive(char *topic, byte *payload, size_t length)
const meshtastic_NodeInfoLite *rx = nodeDB->getMeshNode(p->to);
// Only accept PKI messages to us, or if we have both the sender and receiver in our nodeDB, as then it's
// likely they discovered each other via a channel we have downlink enabled for
- if (p->to == nodeDB->getNodeNum() || (tx && tx->has_user && rx && rx->has_user))
+ if (isToUs(p) || (tx && tx->has_user && rx && rx->has_user))
router->enqueueReceivedMessage(p);
} else if (router && perhapsDecode(p)) // ignore messages if we don't have the channel key
router->enqueueReceivedMessage(p);
@@ -542,7 +542,7 @@ void MQTT::onSend(const meshtastic_MeshPacket &mp, const meshtastic_MeshPacket &
}
// check for the lowest bit of the data bitfield set false, and the use of one of the default keys.
- if (mp_decoded.from != nodeDB->getNodeNum() && mp_decoded.decoded.has_bitfield &&
+ if (!isFromUs(&mp_decoded) && mp_decoded.decoded.has_bitfield &&
!(mp_decoded.decoded.bitfield & BITFIELD_OK_TO_MQTT_MASK) &&
(ch.settings.psk.size < 2 || (ch.settings.psk.size == 16 && memcmp(ch.settings.psk.bytes, defaultpsk, 16)) ||
(ch.settings.psk.size == 32 && memcmp(ch.settings.psk.bytes, eventpsk, 32)))) {
@@ -692,4 +692,4 @@ bool MQTT::isValidJsonEnvelope(JSONObject &json)
(json["from"]->AsNumber() == nodeDB->getNodeNum()) && // only accept message if the "from" is us
(json.find("type") != json.end()) && json["type"]->IsString() && // should specify a type
(json.find("payload") != json.end()); // should have a payload
-}
+}
\ No newline at end of file
diff --git a/src/platform/esp32/CallbackCharacteristic.h b/src/platform/esp32/CallbackCharacteristic.h
deleted file mode 100644
index cd3bc6f51..000000000
--- a/src/platform/esp32/CallbackCharacteristic.h
+++ /dev/null
@@ -1,12 +0,0 @@
-#pragma once
-#include "BLECharacteristic.h"
-#include "PowerFSM.h" // FIXME - someday I want to make this OTA thing a separate lb at at that point it can't touch this
-
-/**
- * A characteristic with a set of overridable callbacks
- */
-class CallbackCharacteristic : public BLECharacteristic, public BLECharacteristicCallbacks
-{
- public:
- CallbackCharacteristic(const char *uuid, uint32_t btprops) : BLECharacteristic(uuid, btprops) { setCallbacks(this); }
-};
diff --git a/src/platform/nrf52/JLINK_MONITOR.c b/src/platform/nrf52/JLINK_MONITOR.c
deleted file mode 100644
index 160264905..000000000
--- a/src/platform/nrf52/JLINK_MONITOR.c
+++ /dev/null
@@ -1,124 +0,0 @@
-/*********************************************************************
-* SEGGER Microcontroller GmbH & Co. KG *
-* The Embedded Experts *
-**********************************************************************
-* *
-* (c) 1995 - 2015 SEGGER Microcontroller GmbH & Co. KG *
-* *
-* www.segger.com Support: support@segger.com *
-* *
-**********************************************************************
-
-----------------------------------------------------------------------
-File : JLINK_MONITOR.c
-Purpose : Implementation of debug monitor for J-Link monitor mode debug on Cortex-M devices.
--------- END-OF-HEADER ---------------------------------------------
-*/
-
-#include "JLINK_MONITOR.h"
-
-/*********************************************************************
- *
- * Configuration
- *
- **********************************************************************
- */
-
-/*********************************************************************
- *
- * Defines
- *
- **********************************************************************
- */
-
-/*********************************************************************
- *
- * Types
- *
- **********************************************************************
- */
-
-/*********************************************************************
- *
- * Static data
- *
- **********************************************************************
- */
-
-volatile int MAIN_MonCnt; // Incremented in JLINK_MONITOR_OnPoll() while CPU is in debug mode
-
-/*********************************************************************
- *
- * Local functions
- *
- **********************************************************************
- */
-
-/*********************************************************************
- *
- * Global functions
- *
- **********************************************************************
- */
-
-/*********************************************************************
- *
- * JLINK_MONITOR_OnExit()
- *
- * Function description
- * Called from DebugMon_Handler(), once per debug exit.
- * May perform some target specific operations to be done on debug mode exit.
- *
- * Notes
- * (1) Must not keep the CPU busy for more than 100 ms
- */
-void JLINK_MONITOR_OnExit(void)
-{
- //
- // Add custom code here
- //
- // BSP_ClrLED(0);
-}
-
-/*********************************************************************
- *
- * JLINK_MONITOR_OnEnter()
- *
- * Function description
- * Called from DebugMon_Handler(), once per debug entry.
- * May perform some target specific operations to be done on debug mode entry
- *
- * Notes
- * (1) Must not keep the CPU busy for more than 100 ms
- */
-void JLINK_MONITOR_OnEnter(void)
-{
- //
- // Add custom code here
- //
- // BSP_SetLED(0);
- // BSP_ClrLED(1);
-}
-
-/*********************************************************************
- *
- * JLINK_MONITOR_OnPoll()
- *
- * Function description
- * Called periodically from DebugMon_Handler(), to perform some actions that need to be performed periodically during debug
- * mode.
- *
- * Notes
- * (1) Must not keep the CPU busy for more than 100 ms
- */
-void JLINK_MONITOR_OnPoll(void)
-{
- //
- // Add custom code here
- //
- MAIN_MonCnt++;
- // BSP_ToggleLED(0);
- // _Delay(500000);
-}
-
-/****** End Of File *************************************************/
diff --git a/src/platform/nrf52/JLINK_MONITOR.h b/src/platform/nrf52/JLINK_MONITOR.h
deleted file mode 100644
index 87cf332fe..000000000
--- a/src/platform/nrf52/JLINK_MONITOR.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/*********************************************************************
-* SEGGER Microcontroller GmbH & Co. KG *
-* The Embedded Experts *
-**********************************************************************
-* *
-* (c) 1995 - 2015 SEGGER Microcontroller GmbH & Co. KG *
-* *
-* www.segger.com Support: support@segger.com *
-* *
-**********************************************************************
-
-----------------------------------------------------------------------
-File : JLINK_MONITOR.h
-Purpose : Header file of debug monitor for J-Link monitor mode debug on Cortex-M devices.
--------- END-OF-HEADER ---------------------------------------------
-*/
-
-#ifndef JLINK_MONITOR_H
-#define JLINK_MONITOR_H
-
-void JLINK_MONITOR_OnExit(void);
-void JLINK_MONITOR_OnEnter(void);
-void JLINK_MONITOR_OnPoll(void);
-
-#endif
-
-/****** End Of File *************************************************/
diff --git a/src/platform/nrf52/JLINK_MONITOR_ISR_SES.S b/src/platform/nrf52/JLINK_MONITOR_ISR_SES.S
deleted file mode 100644
index cda4b1a50..000000000
--- a/src/platform/nrf52/JLINK_MONITOR_ISR_SES.S
+++ /dev/null
@@ -1,888 +0,0 @@
-/*********************************************************************
-* SEGGER Microcontroller GmbH & Co. KG *
-* The Embedded Experts *
-**********************************************************************
-* *
-* (c) 1995 - 2015 SEGGER Microcontroller GmbH & Co. KG *
-* *
-* www.segger.com Support: support@segger.com *
-* *
-**********************************************************************
-
-----------------------------------------------------------------------
-File : JLINK_MONITOR_ISR_SES.s
-Purpose : Implementation of debug monitor for J-Link monitor mode
- debug on Cortex-M devices, supporting SES compiler.
--------- END-OF-HEADER ---------------------------------------------
-*/
-
- .name JLINK_MONITOR_ISR
- .syntax unified
-
- .extern JLINK_MONITOR_OnEnter
- .extern JLINK_MONITOR_OnExit
- .extern JLINK_MONITOR_OnPoll
-
- .global DebugMon_Handler
-
-/*********************************************************************
-*
-* Defines, configurable
-*
-**********************************************************************
-*/
-
-#define _MON_VERSION 100 // V x.yy
-
-/*********************************************************************
-*
-* Defines, fixed
-*
-**********************************************************************
-*/
-
-#define _APP_SP_OFF_R0 0x00
-#define _APP_SP_OFF_R1 0x04
-#define _APP_SP_OFF_R2 0x08
-#define _APP_SP_OFF_R3 0x0C
-#define _APP_SP_OFF_R12 0x10
-#define _APP_SP_OFF_R14_LR 0x14
-#define _APP_SP_OFF_PC 0x18
-#define _APP_SP_OFF_XPSR 0x1C
-#define _APP_SP_OFF_S0 0x20
-#define _APP_SP_OFF_S1 0x24
-#define _APP_SP_OFF_S2 0x28
-#define _APP_SP_OFF_S3 0x2C
-#define _APP_SP_OFF_S4 0x30
-#define _APP_SP_OFF_S5 0x34
-#define _APP_SP_OFF_S6 0x38
-#define _APP_SP_OFF_S7 0x3C
-#define _APP_SP_OFF_S8 0x40
-#define _APP_SP_OFF_S9 0x44
-#define _APP_SP_OFF_S10 0x48
-#define _APP_SP_OFF_S11 0x4C
-#define _APP_SP_OFF_S12 0x50
-#define _APP_SP_OFF_S13 0x54
-#define _APP_SP_OFF_S14 0x58
-#define _APP_SP_OFF_S15 0x5C
-#define _APP_SP_OFF_FPSCR 0x60
-
-#define _NUM_BYTES_BASIC_STACKFRAME 32
-#define _NUM_BYTES_EXTENDED_STACKFRAME 72
-
-#define _SYSTEM_DCRDR_OFF 0x00
-#define _SYSTEM_DEMCR_OFF 0x04
-
-#define _SYSTEM_DHCSR 0xE000EDF0 // Debug Halting Control and Status Register (DHCSR)
-#define _SYSTEM_DCRSR 0xE000EDF4 // Debug Core Register Selector Register (DCRSR)
-#define _SYSTEM_DCRDR 0xE000EDF8 // Debug Core Register Data Register (DCRDR)
-#define _SYSTEM_DEMCR 0xE000EDFC // Debug Exception and Monitor Control Register (DEMCR)
-
-#define _SYSTEM_FPCCR 0xE000EF34 // Floating-Point Context Control Register (FPCCR)
-#define _SYSTEM_FPCAR 0xE000EF38 // Floating-Point Context Address Register (FPCAR)
-#define _SYSTEM_FPDSCR 0xE000EF3C // Floating-Point Default Status Control Register (FPDSCR)
-#define _SYSTEM_MVFR0 0xE000EF40 // Media and FP Feature Register 0 (MVFR0)
-#define _SYSTEM_MVFR1 0xE000EF44 // Media and FP Feature Register 1 (MVFR1)
-
-/*
-* Defines for determining if the current debug config supports FPU registers
-* For some compilers like IAR EWARM when disabling the FPU in the compiler settings an error is thrown when
-*/
-#ifdef __FPU_PRESENT
- #if __FPU_PRESENT
- #define _HAS_FPU_REGS 1
- #else
- #define _HAS_FPU_REGS 0
- #endif
-#else
- #define _HAS_FPU_REGS 0
-#endif
-
-/*********************************************************************
-*
-* Signature of monitor
-*
-* Function description
-* Needed for targets where also a boot ROM is present that possibly specifies a vector table with a valid debug monitor exception entry
-*/
- .section .text, "ax"
-
- //
- // JLINKMONHANDLER
- //
- .byte 0x4A
- .byte 0x4C
- .byte 0x49
- .byte 0x4E
- .byte 0x4B
- .byte 0x4D
- .byte 0x4F
- .byte 0x4E
- .byte 0x48
- .byte 0x41
- .byte 0x4E
- .byte 0x44
- .byte 0x4C
- .byte 0x45
- .byte 0x52
- .byte 0x00 // Align to 8-bytes
-
-/*********************************************************************
-*
-* DebugMon_Handler()
-*
-* Function description
-* Debug monitor handler. CPU enters this handler in case a "halt" request is made from the debugger.
-* This handler is also responsible for handling commands that are sent by the debugger.
-*
-* Notes
-* This is actually the ISR for the debug interrupt (exception no. 12)
-*/
- .thumb_func
-
-DebugMon_Handler:
- /*
- General procedure:
- DCRDR is used as communication register
- DEMCR[19] is used as ready flag
- For the command J-Link sends to the monitor: DCRDR[7:0] == Cmd, DCRDR[31:8] == ParamData
-
- 1) Monitor sets DEMCR[19] whenever it is ready to receive new commands/data
- DEMCR[19] is initially set on debug monitor entry
- 2) J-Link will clear once it has placed conmmand/data in DCRDR for J-Link
- 3) Monitor will wait for DEMCR[19] to be cleared
- 4) Monitor will process command (May cause additional data transfers etc., depends on command
- 5) No restart-CPU command? => Back to 2), Otherwise => 6)
- 6) Monitor will clear DEMCR[19] 19 to indicate that it is no longer ready
- */
- PUSH {LR}
- BL JLINK_MONITOR_OnEnter
- POP {LR}
- LDR.N R3,_AddrDCRDR // 0xe000edf8 == _SYSTEM_DCRDR
- B.N _IndicateMonReady
-_WaitProbeReadIndicateMonRdy: // while(_SYSTEM_DEMCR & (1uL << 19)); => Wait until J-Link has read item
- LDR R0,[R3, #+_SYSTEM_DEMCR_OFF] // _SYSTEM_DEMCR
- LSLS R0,R0,#+12
- BMI.N _WaitProbeReadIndicateMonRdy
-_IndicateMonReady:
- LDR R0,[R3, #+_SYSTEM_DEMCR_OFF] // _SYSTEM_DEMCR |= (1uL << 19); => Set MON_REQ bit, so J-Link knows monitor is ready to receive commands
- ORR R0,R0,#0x80000
- STR R0,[R3, #+_SYSTEM_DEMCR_OFF]
- /*
- During command loop:
- R0 = Tmp
- R1 = Tmp
- R2 = Tmp
- R3 = &_SYSTEM_DCRDR (allows also access to DEMCR with offset)
- R12 = Tmp
-
- Outside command loop R0-R3 and R12 may be overwritten by MONITOR_OnPoll()
- */
-_WaitForJLinkCmd: // do {
- PUSH {LR}
- BL JLINK_MONITOR_OnPoll
- POP {LR}
- LDR.N R3,_AddrDCRDR // 0xe000edf8 == _SYSTEM_DCRDR
- LDR R0,[R3, #+_SYSTEM_DEMCR_OFF]
- LSRS R0,R0,#+20 // DEMCR[19] -> Carry Clear? => J-Link has placed command for us
- BCS _WaitForJLinkCmd
- /*
- Perform command
- Command is placed by J-Link in DCRDR[7:0] and additional parameter data is stored in DCRDR[31:8]
- J-Link clears DEMCR[19] to indicate that it placed a command/data or read data
- Monitor sets DEMCR[19] to indicate that it placed data or read data / is ready for a new command
- Setting DEMCR[19] indicates "monitor ready for new command / data" and also indicates: "data has been placed in DCRDR by monitor, for J-Link"
- Therefore it is responsibility of the commands to respond to the commands accordingly
-
- Commands for debug monitor
- Commands must not exceed 0xFF (255) as we only defined 8-bits for command-part. Higher 24-bits are parameter info for current command
-
- Protocol for different commands:
- J-Link: Cmd -> DCRDR, DEMCR[19] -> 0 => Cmd placed by probe
- */
- LDR R0,[R3, #+_SYSTEM_DCRDR_OFF] // ParamInfo = _SYSTEM_DCRDR
- LSRS R1,R0,#+8 // ParamInfo >>= 8
- LSLS R0,R0,#+24
- LSRS R0,R0,#+24 // Cmd = ParamInfo & 0xFF
- //
- // switch (Cmd)
- //
- CMP R0,#+0
- BEQ.N _HandleGetMonVersion // case _MON_CMD_GET_MONITOR_VERSION
- CMP R0,#+2
- BEQ.N _HandleReadReg // case _MON_CMD_READ_REG
- BCC.N _HandleRestartCPU // case _MON_CMD_RESTART_CPU
- CMP R0,#+3
- BEQ.N _HandleWriteReg_Veneer // case _MON_CMD_WRITE_REG
- B.N _IndicateMonReady // default : while (1);
- /*
- Return
- _MON_CMD_RESTART_CPU
- CPU: DEMCR[19] -> 0 => Monitor no longer ready
- */
-_HandleRestartCPU:
- LDR R0,[R3, #+_SYSTEM_DEMCR_OFF] // _SYSTEM_DEMCR &= ~(1uL << 19); => Clear MON_REQ to indicate that monitor is no longer active
- BIC R0,R0,#0x80000
- STR R0,[R3, #+_SYSTEM_DEMCR_OFF]
- PUSH {LR}
- BL JLINK_MONITOR_OnExit
- POP {PC}
- //
- // Place data section here to not get in trouble with load-offsets
- //
- .section .text, "ax", %progbits
- .align 2
-_AddrDCRDR:
- .long 0xE000EDF8
-_AddrCPACR:
- .long 0xE000ED88
-
- .section .text, "ax"
- .thumb_func
-
-;/*********************************************************************
-;*
-;* _HandleGetMonVersion
-;*
-;*/
-_HandleGetMonVersion:
- /*
- _MON_CMD_GET_MONITOR_VERSION
- CPU: Data -> DCRDR, DEMCR[19] -> 1 => Data ready
- J-Link: DCRDR -> Read, DEMCR[19] -> 0 => Data read
- CPU: DEMCR[19] -> 1 => Mon ready
- */
- MOVS R0,#+_MON_VERSION
- STR R0,[R3, #+_SYSTEM_DCRDR_OFF] // _SYSTEM_DCRDR = x
- LDR R0,[R3, #+_SYSTEM_DEMCR_OFF] // _SYSTEM_DEMCR |= (1uL << 19); => Set MON_REQ bit, so J-Link knows monitor is ready to receive commands
- ORR R0,R0,#0x80000
- STR R0,[R3, #+_SYSTEM_DEMCR_OFF] // Indicate data ready
- B _WaitProbeReadIndicateMonRdy
-
-/*********************************************************************
-*
-* _HandleReadReg
-*
-*/
-_HandleWriteReg_Veneer:
- B.N _HandleWriteReg
-_HandleReadReg:
- /*
- _MON_CMD_READ_REG
- CPU: Data -> DCRDR, DEMCR[19] -> 1 => Data ready
- J-Link: DCRDR -> Read, DEMCR[19] -> 0 => Data read
- CPU: DEMCR[19] -> 1 => Mon ready
-
-
- Register indexes
- 0-15: R0-R15 (13 == R13 reserved => is banked ... Has to be read as PSP / MSP. Decision has to be done by J-Link DLL side!)
- 16: XPSR
- 17: MSP
- 18: PSP
- 19: CFBP CONTROL/FAULTMASK/BASEPRI/PRIMASK (packed into 4 bytes of word. CONTROL = CFBP[31:24], FAULTMASK = CFBP[16:23], BASEPRI = CFBP[15:8], PRIMASK = CFBP[7:0]
- 20: FPSCR
- 21-52: FPS0-FPS31
-
-
- Register usage when entering this "subroutine":
- R0 Cmd
- R1 ParamInfo
- R2 ---
- R3 = &_SYSTEM_DCRDR (allows also access to DEMCR with offset)
- R12 ---
-
- Table B1-9 EXC_RETURN definition of exception return behavior, with FP extension
- LR Return to Return SP Frame type
- ---------------------------------------------------------
- 0xFFFFFFE1 Handler mode. MSP Extended
- 0xFFFFFFE9 Thread mode MSP Extended
- 0xFFFFFFED Thread mode PSP Extended
- 0xFFFFFFF1 Handler mode. MSP Basic
- 0xFFFFFFF9 Thread mode MSP Basic
- 0xFFFFFFFD Thread mode PSP Basic
-
- So LR[2] == 1 => Return stack == PSP else MSP
-
- R0-R3, R12, PC, xPSR can be read from application stackpointer
- Other regs can be read directly
- */
- LSRS R2,LR,#+3 // Shift LR[2] into carry => Carry clear means that CPU was running on MSP
- ITE CS
- MRSCS R2,PSP
- MRSCC R2,MSP
- CMP R1,#+4 // if (RegIndex < 4) { (R0-R3)
- BCS _HandleReadRegR4
- LDR R0,[R2, R1, LSL #+2] // v = [SP + Rx * 4] (R0-R3)
- B.N _HandleReadRegDone
-_HandleReadRegR4:
- CMP R1,#+5 // if (RegIndex < 5) { (R4)
- BCS _HandleReadRegR5
- MOV R0,R4
- B.N _HandleReadRegDone
-_HandleReadRegR5:
- CMP R1,#+6 // if (RegIndex < 6) { (R5)
- BCS _HandleReadRegR6
- MOV R0,R5
- B.N _HandleReadRegDone
-_HandleReadRegR6:
- CMP R1,#+7 // if (RegIndex < 7) { (R6)
- BCS _HandleReadRegR7
- MOV R0,R6
- B.N _HandleReadRegDone
-_HandleReadRegR7:
- CMP R1,#+8 // if (RegIndex < 8) { (R7)
- BCS _HandleReadRegR8
- MOV R0,R7
- B.N _HandleReadRegDone
-_HandleReadRegR8:
- CMP R1,#+9 // if (RegIndex < 9) { (R8)
- BCS _HandleReadRegR9
- MOV R0,R8
- B.N _HandleReadRegDone
-_HandleReadRegR9:
- CMP R1,#+10 // if (RegIndex < 10) { (R9)
- BCS _HandleReadRegR10
- MOV R0,R9
- B.N _HandleReadRegDone
-_HandleReadRegR10:
- CMP R1,#+11 // if (RegIndex < 11) { (R10)
- BCS _HandleReadRegR11
- MOV R0,R10
- B.N _HandleReadRegDone
-_HandleReadRegR11:
- CMP R1,#+12 // if (RegIndex < 12) { (R11)
- BCS _HandleReadRegR12
- MOV R0,R11
- B.N _HandleReadRegDone
-_HandleReadRegR12:
- CMP R1,#+14 // if (RegIndex < 14) { (R12)
- BCS _HandleReadRegR14
- LDR R0,[R2, #+_APP_SP_OFF_R12]
- B.N _HandleReadRegDone
-_HandleReadRegR14:
- CMP R1,#+15 // if (RegIndex < 15) { (R14 / LR)
- BCS _HandleReadRegR15
- LDR R0,[R2, #+_APP_SP_OFF_R14_LR]
- B.N _HandleReadRegDone
-_HandleReadRegR15:
- CMP R1,#+16 // if (RegIndex < 16) { (R15 / PC)
- BCS _HandleReadRegXPSR
- LDR R0,[R2, #+_APP_SP_OFF_PC]
- B.N _HandleReadRegDone
-_HandleReadRegXPSR:
- CMP R1,#+17 // if (RegIndex < 17) { (xPSR)
- BCS _HandleReadRegMSP
- LDR R0,[R2, #+_APP_SP_OFF_XPSR]
- B.N _HandleReadRegDone
-_HandleReadRegMSP:
- /*
- Stackpointer is tricky because we need to get some info about the SP used in the user app, first
-
- Handle reading R0-R3 which can be read right from application stackpointer
-
- Table B1-9 EXC_RETURN definition of exception return behavior, with FP extension
- LR Return to Return SP Frame type
- ---------------------------------------------------------
- 0xFFFFFFE1 Handler mode. MSP Extended
- 0xFFFFFFE9 Thread mode MSP Extended
- 0xFFFFFFED Thread mode PSP Extended
- 0xFFFFFFF1 Handler mode. MSP Basic
- 0xFFFFFFF9 Thread mode MSP Basic
- 0xFFFFFFFD Thread mode PSP Basic
-
- So LR[2] == 1 => Return stack == PSP else MSP
- Per architecture definition: Inside monitor (exception) SP = MSP
-
- Stack pointer handling is complicated because it is different what is pushed on the stack before entering the monitor ISR...
- Cortex-M: 8 regs
- Cortex-M + forced-stack-alignment: 8 regs + 1 dummy-word if stack was not 8-byte aligned
- Cortex-M + FPU: 8 regs + 17 FPU regs + 1 dummy-word + 1-dummy word if stack was not 8-byte aligned
- Cortex-M + FPU + lazy mode: 8 regs + 17 dummy-words + 1 dummy-word + 1-dummy word if stack was not 8-byte aligned
- */
- CMP R1,#+18 // if (RegIndex < 18) { (MSP)
- BCS _HandleReadRegPSP
- MRS R0,MSP
- LSRS R1,LR,#+3 // LR[2] -> Carry == 0 => CPU was running on MSP => Needs correction
- BCS _HandleReadRegDone_Veneer // CPU was running on PSP? => No correction necessary
-_HandleSPCorrection:
- LSRS R1,LR,#+5 // LR[4] -> Carry == 0 => extended stack frame has been allocated. See ARM DDI0403D, B1.5.7 Stack alignment on exception entry
- ITE CS
- ADDCS R0,R0,#+_NUM_BYTES_BASIC_STACKFRAME
- ADDCC R0,R0,#+_NUM_BYTES_EXTENDED_STACKFRAME
- LDR R1,[R2, #+_APP_SP_OFF_XPSR] // Get xPSR from application stack (R2 has been set to app stack on beginning of _HandleReadReg)
- LSRS R1,R1,#+5 // xPSR[9] -> Carry == 1 => Stack has been force-aligned before pushing regs. See ARM DDI0403D, B1.5.7 Stack alignment on exception entry
- IT CS
- ADDCS R0,R0,#+4
- B _HandleReadRegDone
-_HandleReadRegPSP: // RegIndex == 18
- CMP R1,#+19 // if (RegIndex < 19) {
- BCS _HandleReadRegCFBP
- MRS R0,PSP // PSP is not touched by monitor
- LSRS R1,LR,#+3 // LR[2] -> Carry == 1 => CPU was running on PSP => Needs correction
- BCC _HandleReadRegDone_Veneer // CPU was running on MSP? => No correction of PSP necessary
- B _HandleSPCorrection
-_HandleReadRegCFBP:
- /*
- CFBP is a register that can only be read via debug probe and is a merger of the following regs:
- CONTROL/FAULTMASK/BASEPRI/PRIMASK (packed into 4 bytes of word. CONTROL = CFBP[31:24], FAULTMASK = CFBP[16:23], BASEPRI = CFBP[15:8], PRIMASK = CFBP[7:0]
- To keep J-Link side the same for monitor and halt mode, we also return CFBP in monitor mode
- */
- CMP R1,#+20 // if (RegIndex < 20) { (CFBP)
- BCS _HandleReadRegFPU
- MOVS R0,#+0
- MRS R2,PRIMASK
- ORRS R0,R2 // Merge PRIMASK into CFBP[7:0]
- MRS R2,BASEPRI
- LSLS R2,R2,#+8 // Merge BASEPRI into CFBP[15:8]
- ORRS R0,R2
- MRS R2,FAULTMASK
- LSLS R2,R2,#+16 // Merge FAULTMASK into CFBP[23:16]
- ORRS R0,R2
- MRS R2,CONTROL
- LSRS R1,LR,#3 // LR[2] -> Carry. CONTROL.SPSEL is saved to LR[2] on exception entry => ARM DDI0403D, B1.5.6 Exception entry behavior
- IT CS // As J-Link sees value of CONTROL at application time, we need reconstruct original value of CONTROL
- ORRCS R2,R2,#+2 // CONTROL.SPSEL (CONTROL[1]) == 0 inside monitor
- LSRS R1,LR,#+5 // LR[4] == NOT(CONTROL.FPCA) -> Carry
- ITE CS // Merge original value of FPCA (CONTROL[2]) into read data
- BICCS R2,R2,#+0x04 // Remember LR contains NOT(CONTROL)
- ORRCC R2,R2,#+0x04
- LSLS R2,R2,#+24
- ORRS R0,R2
- B.N _HandleReadRegDone
-_HandleReadRegFPU:
-#if _HAS_FPU_REGS
- CMP R1,#+53 // if (RegIndex < 53) { (20 (FPSCR), 21-52 FPS0-FPS31)
- BCS _HandleReadRegDone_Veneer
- /*
- Read Coprocessor Access Control Register (CPACR) to check if CP10 and CP11 are enabled
- If not, access to floating point is not possible
- CPACR[21:20] == CP10 enable. 0b01 = Privileged access only. 0b11 = Full access. Other = reserved
- CPACR[23:22] == CP11 enable. 0b01 = Privileged access only. 0b11 = Full access. Other = reserved
- */
- LDR R0,_AddrCPACR
- LDR R0,[R0]
- LSLS R0,R0,#+8
- LSRS R0,R0,#+28
- CMP R0,#+0xF
- BEQ _HandleReadRegFPU_Allowed
- CMP R0,#+0x5
- BNE _HandleReadRegDone_Veneer
-_HandleReadRegFPU_Allowed:
- CMP R1,#+21 // if (RegIndex < 21) (20 == FPSCR)
- BCS _HandleReadRegFPS0_FPS31
- LSRS R0,LR,#+5 // CONTROL[2] == FPCA => NOT(FPCA) saved to LR[4]. LR[4] == 0 => Extended stack frame, so FPU regs possibly on stack
- BCS _HandleReadFPSCRLazyMode // Remember: NOT(FPCA) is stored to LR. == 0 means: Extended stack frame
- LDR R0,=_SYSTEM_FPCCR
- LDR R0,[R0]
- LSLS R0,R0,#+2 // FPCCR[30] -> Carry == 1 indicates if lazy mode is active, so space on stack is reserved but FPU registers are not saved on stack
- BCS _HandleReadFPSCRLazyMode
- LDR R0,[R2, #+_APP_SP_OFF_FPSCR]
- B _HandleReadRegDone
-_HandleReadFPSCRLazyMode:
- VMRS R0,FPSCR
- B _HandleReadRegDone
-_HandleReadRegFPS0_FPS31: // RegIndex == 21-52
- LSRS R0,LR,#+5 // CONTROL[2] == FPCA => NOT(FPCA) saved to LR[4]. LR[4] == 0 => Extended stack frame, so FPU regs possibly on stack
- BCS _HandleReadFPS0_FPS31LazyMode // Remember: NOT(FPCA) is stored to LR. == 0 means: Extended stack frame
- LDR R0,=_SYSTEM_FPCCR
- LDR R0,[R0]
- LSLS R0,R0,#+2 // FPCCR[30] -> Carry == 1 indicates if lazy mode is active, so space on stack is reserved but FPU registers are not saved on stack
- BCS _HandleReadFPS0_FPS31LazyMode
- SUBS R1,#+21 // Convert absolute reg index into rel. one
- LSLS R1,R1,#+2 // RegIndex to position on stack
- ADDS R1,#+_APP_SP_OFF_S0
- LDR R0,[R2, R1]
-_HandleReadRegDone_Veneer:
- B _HandleReadRegDone
-_HandleReadFPS0_FPS31LazyMode:
- SUBS R1,#+20 // convert abs. RegIndex into rel. one
- MOVS R0,#+6
- MULS R1,R0,R1
- LDR R0,=_HandleReadRegUnknown
- SUB R0,R0,R1 // _HandleReadRegUnknown - 6 * ((RegIndex - 21) + 1)
- ORR R0,R0,#1 // Thumb bit needs to be set in DestAddr
- BX R0
- //
- // Table for reading FPS0-FPS31
- //
- VMOV R0,S31 // v = FPSx
- B _HandleReadRegDone
- VMOV R0,S30
- B _HandleReadRegDone
- VMOV R0,S29
- B _HandleReadRegDone
- VMOV R0,S28
- B _HandleReadRegDone
- VMOV R0,S27
- B _HandleReadRegDone
- VMOV R0,S26
- B _HandleReadRegDone
- VMOV R0,S25
- B _HandleReadRegDone
- VMOV R0,S24
- B _HandleReadRegDone
- VMOV R0,S23
- B _HandleReadRegDone
- VMOV R0,S22
- B _HandleReadRegDone
- VMOV R0,S21
- B _HandleReadRegDone
- VMOV R0,S20
- B _HandleReadRegDone
- VMOV R0,S19
- B _HandleReadRegDone
- VMOV R0,S18
- B _HandleReadRegDone
- VMOV R0,S17
- B _HandleReadRegDone
- VMOV R0,S16
- B _HandleReadRegDone
- VMOV R0,S15
- B _HandleReadRegDone
- VMOV R0,S14
- B _HandleReadRegDone
- VMOV R0,S13
- B _HandleReadRegDone
- VMOV R0,S12
- B _HandleReadRegDone
- VMOV R0,S11
- B _HandleReadRegDone
- VMOV R0,S10
- B _HandleReadRegDone
- VMOV R0,S9
- B _HandleReadRegDone
- VMOV R0,S8
- B _HandleReadRegDone
- VMOV R0,S7
- B _HandleReadRegDone
- VMOV R0,S6
- B _HandleReadRegDone
- VMOV R0,S5
- B _HandleReadRegDone
- VMOV R0,S4
- B _HandleReadRegDone
- VMOV R0,S3
- B _HandleReadRegDone
- VMOV R0,S2
- B _HandleReadRegDone
- VMOV R0,S1
- B _HandleReadRegDone
- VMOV R0,S0
- B _HandleReadRegDone
-#else
- B _HandleReadRegUnknown
-_HandleReadRegDone_Veneer:
- B _HandleReadRegDone
-#endif
-_HandleReadRegUnknown:
- MOVS R0,#+0 // v = 0
- B.N _HandleReadRegDone
-_HandleReadRegDone:
-
- // Send register content to J-Link and wait until J-Link has read the data
-
- STR R0,[R3, #+_SYSTEM_DCRDR_OFF] // DCRDR = v;
- LDR R0,[R3, #+_SYSTEM_DEMCR_OFF] // _SYSTEM_DEMCR |= (1uL << 19); => Set MON_REQ bit, so J-Link knows monitor is ready to receive commands
- ORR R0,R0,#0x80000
- STR R0,[R3, #+_SYSTEM_DEMCR_OFF] // Indicate data ready
- B _WaitProbeReadIndicateMonRdy
-
- // Data section for register addresses
-
-_HandleWriteReg:
- /*
- _MON_CMD_WRITE_REG
- CPU: DEMCR[19] -> 1 => Mon ready
- J-Link: Data -> DCRDR, DEMCR[19] -> 0 => Data placed by probe
- CPU: DCRDR -> Read, Process command, DEMCR[19] -> 1 => Data read & mon ready
-
- Register indexes
- 0-15: R0-R15 (13 == R13 reserved => is banked ... Has to be read as PSP / MSP. Decision has to be done by J-Link DLL side!)
- 16: XPSR
- 17: MSP
- 18: PSP
- 19: CFBP CONTROL/FAULTMASK/BASEPRI/PRIMASK (packed into 4 bytes of word. CONTROL = CFBP[31:24], FAULTMASK = CFBP[16:23], BASEPRI = CFBP[15:8], PRIMASK = CFBP[7:0]
- 20: FPSCR
- 21-52: FPS0-FPS31
-
-
- Register usage when entering this "subroutine":
- R0 Cmd
- R1 ParamInfo
- R2 ---
- R3 = &_SYSTEM_DCRDR (allows also access to DEMCR with offset)
- R12 ---
-
- Table B1-9 EXC_RETURN definition of exception return behavior, with FP extension
- LR Return to Return SP Frame type
- ---------------------------------------------------------
- 0xFFFFFFE1 Handler mode. MSP Extended
- 0xFFFFFFE9 Thread mode MSP Extended
- 0xFFFFFFED Thread mode PSP Extended
- 0xFFFFFFF1 Handler mode. MSP Basic
- 0xFFFFFFF9 Thread mode MSP Basic
- 0xFFFFFFFD Thread mode PSP Basic
-
- So LR[2] == 1 => Return stack == PSP else MSP
-
- R0-R3, R12, PC, xPSR can be written via application stackpointer
- Other regs can be written directly
-
-
- Read register data from J-Link into R0
- */
- LDR R0,[R3, #+_SYSTEM_DEMCR_OFF] // _SYSTEM_DEMCR |= (1uL << 19); => Monitor is ready to receive register data
- ORR R0,R0,#0x80000
- STR R0,[R3, #+_SYSTEM_DEMCR_OFF]
-_HandleWRegWaitUntilDataRecv:
- LDR R0,[R3, #+_SYSTEM_DEMCR_OFF]
- LSLS R0,R0,#+12
- BMI.N _HandleWRegWaitUntilDataRecv // DEMCR[19] == 0 => J-Link has placed new data for us
- LDR R0,[R3, #+_SYSTEM_DCRDR_OFF] // Get register data
- //
- // Determine application SP
- //
- LSRS R2,LR,#+3 // Shift LR[2] into carry => Carry clear means that CPU was running on MSP
- ITE CS
- MRSCS R2,PSP
- MRSCC R2,MSP
- CMP R1,#+4 // if (RegIndex < 4) { (R0-R3)
- BCS _HandleWriteRegR4
- STR R0,[R2, R1, LSL #+2] // v = [SP + Rx * 4] (R0-R3)
- B.N _HandleWriteRegDone
-_HandleWriteRegR4:
- CMP R1,#+5 // if (RegIndex < 5) { (R4)
- BCS _HandleWriteRegR5
- MOV R4,R0
- B.N _HandleWriteRegDone
-_HandleWriteRegR5:
- CMP R1,#+6 // if (RegIndex < 6) { (R5)
- BCS _HandleWriteRegR6
- MOV R5,R0
- B.N _HandleWriteRegDone
-_HandleWriteRegR6:
- CMP R1,#+7 // if (RegIndex < 7) { (R6)
- BCS _HandleWriteRegR7
- MOV R6,R0
- B.N _HandleWriteRegDone
-_HandleWriteRegR7:
- CMP R1,#+8 // if (RegIndex < 8) { (R7)
- BCS _HandleWriteRegR8
- MOV R7,R0
- B.N _HandleWriteRegDone
-_HandleWriteRegR8:
- CMP R1,#+9 // if (RegIndex < 9) { (R8)
- BCS _HandleWriteRegR9
- MOV R8,R0
- B.N _HandleWriteRegDone
-_HandleWriteRegR9:
- CMP R1,#+10 // if (RegIndex < 10) { (R9)
- BCS _HandleWriteRegR10
- MOV R9,R0
- B.N _HandleWriteRegDone
-_HandleWriteRegR10:
- CMP R1,#+11 // if (RegIndex < 11) { (R10)
- BCS _HandleWriteRegR11
- MOV R10,R0
- B.N _HandleWriteRegDone
-_HandleWriteRegR11:
- CMP R1,#+12 // if (RegIndex < 12) { (R11)
- BCS _HandleWriteRegR12
- MOV R11,R0
- B.N _HandleWriteRegDone
-_HandleWriteRegR12:
- CMP R1,#+14 // if (RegIndex < 14) { (R12)
- BCS _HandleWriteRegR14
- STR R0,[R2, #+_APP_SP_OFF_R12]
- B.N _HandleWriteRegDone
-_HandleWriteRegR14:
- CMP R1,#+15 // if (RegIndex < 15) { (R14 / LR)
- BCS _HandleWriteRegR15
- STR R0,[R2, #+_APP_SP_OFF_R14_LR]
- B.N _HandleWriteRegDone
-_HandleWriteRegR15:
- CMP R1,#+16 // if (RegIndex < 16) { (R15 / PC)
- BCS _HandleWriteRegXPSR
- STR R0,[R2, #+_APP_SP_OFF_PC]
- B.N _HandleWriteRegDone
-_HandleWriteRegXPSR:
- CMP R1,#+17 // if (RegIndex < 17) { (xPSR)
- BCS _HandleWriteRegMSP
- STR R0,[R2, #+_APP_SP_OFF_XPSR]
- B.N _HandleWriteRegDone
-_HandleWriteRegMSP:
- //
- // For now, SP cannot be modified because it is needed to jump back from monitor mode
- //
- CMP R1,#+18 // if (RegIndex < 18) { (MSP)
- BCS _HandleWriteRegPSP
- B.N _HandleWriteRegDone
-_HandleWriteRegPSP: // RegIndex == 18
- CMP R1,#+19 // if (RegIndex < 19) {
- BCS _HandleWriteRegCFBP
- B.N _HandleWriteRegDone
-_HandleWriteRegCFBP:
- /*
- CFBP is a register that can only be read via debug probe and is a merger of the following regs:
- CONTROL/FAULTMASK/BASEPRI/PRIMASK (packed into 4 bytes of word. CONTROL = CFBP[31:24], FAULTMASK = CFBP[16:23], BASEPRI = CFBP[15:8], PRIMASK = CFBP[7:0]
- To keep J-Link side the same for monitor and halt mode, we also return CFBP in monitor mode
- */
- CMP R1,#+20 // if (RegIndex < 20) { (CFBP)
- BCS _HandleWriteRegFPU
- LSLS R1,R0,#+24
- LSRS R1,R1,#+24 // Extract CFBP[7:0] => PRIMASK
- MSR PRIMASK,R1
- LSLS R1,R0,#+16
- LSRS R1,R1,#+24 // Extract CFBP[15:8] => BASEPRI
- MSR BASEPRI,R1
- LSLS R1,R0,#+8 // Extract CFBP[23:16] => FAULTMASK
- LSRS R1,R1,#+24
- MSR FAULTMASK,R1
- LSRS R1,R0,#+24 // Extract CFBP[31:24] => CONTROL
- LSRS R0,R1,#2 // Current CONTROL[1] -> Carry
- ITE CS // Update saved CONTROL.SPSEL (CONTROL[1]). CONTROL.SPSEL is saved to LR[2] on exception entry => ARM DDI0403D, B1.5.6 Exception entry behavior
- ORRCS LR,LR,#+4
- BICCC LR,LR,#+4
- BIC R1,R1,#+2 // CONTROL.SPSEL (CONTROL[1]) == 0 inside monitor. Otherwise behavior is UNPREDICTABLE
- LSRS R0,R1,#+3 // New CONTROL.FPCA (CONTROL[2]) -> Carry
- ITE CS // CONTROL[2] == FPCA => NOT(FPCA) saved to LR[4]. LR[4] == 0 => Extended stack frame, so FPU regs possibly on stack
- BICCS LR,LR,#+0x10 // Remember: NOT(FPCA) is stored to LR. == 0 means: Extended stack frame
- ORRCC LR,LR,#+0x10
- MRS R0,CONTROL
- LSRS R0,R0,#+3 // CONTROL[2] -> Carry
- ITE CS // Preserve original value of current CONTROL[2]
- ORRCS R1,R1,#+0x04
- BICCC R1,R1,#+0x04
- MSR CONTROL,R1
- ISB // Necessary after writing to CONTROL, see ARM DDI0403D, B1.4.4 The special-purpose CONTROL register
- B.N _HandleWriteRegDone
-_HandleWriteRegFPU:
-#if _HAS_FPU_REGS
- CMP R1,#+53 // if (RegIndex < 53) { (20 (FPSCR), 21-52 FPS0-FPS31)
- BCS _HandleWriteRegDone_Veneer
- /*
- Read Coprocessor Access Control Register (CPACR) to check if CP10 and CP11 are enabled
- If not, access to floating point is not possible
- CPACR[21:20] == CP10 enable. 0b01 = Privileged access only. 0b11 = Full access. Other = reserved
- CPACR[23:22] == CP11 enable. 0b01 = Privileged access only. 0b11 = Full access. Other = reserved
- */
- MOV R12,R0 // Save register data
- LDR R0,_AddrCPACR
- LDR R0,[R0]
- LSLS R0,R0,#+8
- LSRS R0,R0,#+28
- CMP R0,#+0xF
- BEQ _HandleWriteRegFPU_Allowed
- CMP R0,#+0x5
- BNE _HandleWriteRegDone_Veneer
-_HandleWriteRegFPU_Allowed:
- CMP R1,#+21 // if (RegIndex < 21) (20 == FPSCR)
- BCS _HandleWriteRegFPS0_FPS31
- LSRS R0,LR,#+5 // CONTROL[2] == FPCA => NOT(FPCA) saved to LR[4]. LR[4] == 0 => Extended stack frame, so FPU regs possibly on stack
- BCS _HandleWriteFPSCRLazyMode // Remember: NOT(FPCA) is stored to LR. == 0 means: Extended stack frame
- LDR R0,=_SYSTEM_FPCCR
- LDR R0,[R0]
- LSLS R0,R0,#+2 // FPCCR[30] -> Carry == 1 indicates if lazy mode is active, so space on stack is reserved but FPU registers are not saved on stack
- BCS _HandleWriteFPSCRLazyMode
- STR R12,[R2, #+_APP_SP_OFF_FPSCR]
- B _HandleWriteRegDone
-_HandleWriteFPSCRLazyMode:
- VMSR FPSCR,R12
- B _HandleWriteRegDone
-_HandleWriteRegFPS0_FPS31: // RegIndex == 21-52
- LDR R0,=_SYSTEM_FPCCR
- LDR R0,[R0]
- LSLS R0,R0,#+2 // FPCCR[30] -> Carry == 1 indicates if lazy mode is active, so space on stack is reserved but FPU registers are not saved on stack
- BCS _HandleWriteFPS0_FPS31LazyMode
- LSRS R0,LR,#+5 // CONTROL[2] == FPCA => NOT(FPCA) saved to LR[4]. LR[4] == 0 => Extended stack frame, so FPU regs possibly on stack
- BCS _HandleWriteFPS0_FPS31LazyMode // Remember: NOT(FPCA) is stored to LR. == 0 means: Extended stack frame
- SUBS R1,#+21 // Convert absolute reg index into rel. one
- LSLS R1,R1,#+2 // RegIndex to position on stack
- ADDS R1,#+_APP_SP_OFF_S0
- STR R12,[R2, R1]
-_HandleWriteRegDone_Veneer:
- B _HandleWriteRegDone
-_HandleWriteFPS0_FPS31LazyMode:
- SUBS R1,#+20 // Convert abs. RegIndex into rel. one
- MOVS R0,#+6
- MULS R1,R0,R1
- LDR R0,=_HandleReadRegUnknown
- SUB R0,R0,R1 // _HandleReadRegUnknown - 6 * ((RegIndex - 21) + 1)
- ORR R0,R0,#1 // Thumb bit needs to be set in DestAddr
- BX R0
- //
- // Table for reading FPS0-FPS31
- //
- VMOV S31,R12 // v = FPSx
- B _HandleWriteRegDone
- VMOV S30,R12
- B _HandleWriteRegDone
- VMOV S29,R12
- B _HandleWriteRegDone
- VMOV S28,R12
- B _HandleWriteRegDone
- VMOV S27,R12
- B _HandleWriteRegDone
- VMOV S26,R12
- B _HandleWriteRegDone
- VMOV S25,R12
- B _HandleWriteRegDone
- VMOV S24,R12
- B _HandleWriteRegDone
- VMOV S23,R12
- B _HandleWriteRegDone
- VMOV S22,R12
- B _HandleWriteRegDone
- VMOV S21,R12
- B _HandleWriteRegDone
- VMOV S20,R12
- B _HandleWriteRegDone
- VMOV S19,R12
- B _HandleWriteRegDone
- VMOV S18,R12
- B _HandleWriteRegDone
- VMOV S17,R12
- B _HandleWriteRegDone
- VMOV S16,R12
- B _HandleWriteRegDone
- VMOV S15,R12
- B _HandleWriteRegDone
- VMOV S14,R12
- B _HandleWriteRegDone
- VMOV S13,R12
- B _HandleWriteRegDone
- VMOV S12,R12
- B _HandleWriteRegDone
- VMOV S11,R12
- B _HandleWriteRegDone
- VMOV S10,R12
- B _HandleWriteRegDone
- VMOV S9,R12
- B _HandleWriteRegDone
- VMOV S8,R12
- B _HandleWriteRegDone
- VMOV S7,R12
- B _HandleWriteRegDone
- VMOV S6,R12
- B _HandleWriteRegDone
- VMOV S5,R12
- B _HandleWriteRegDone
- VMOV S4,R12
- B _HandleWriteRegDone
- VMOV S3,R12
- B _HandleWriteRegDone
- VMOV S2,R12
- B _HandleWriteRegDone
- VMOV S1,R12
- B _HandleWriteRegDone
- VMOV S0,R12
- B _HandleWriteRegDone
-#else
- B _HandleWriteRegUnknown
-#endif
-_HandleWriteRegUnknown:
- B.N _HandleWriteRegDone
-_HandleWriteRegDone:
- B _IndicateMonReady // Indicate that monitor has read data, processed command and is ready for a new one
- .end
-/****** End Of File *************************************************/
diff --git a/src/platform/nrf52/main-nrf52.cpp b/src/platform/nrf52/main-nrf52.cpp
index 4023a3cb9..f9329d875 100644
--- a/src/platform/nrf52/main-nrf52.cpp
+++ b/src/platform/nrf52/main-nrf52.cpp
@@ -270,6 +270,11 @@ void cpuDeepSleep(uint32_t msecToWake)
delay(msecToWake);
NVIC_SystemReset();
} else {
+ // Resume on user button press
+ // https://github.com/lyusupov/SoftRF/blob/81c519ca75693b696752235d559e881f2e0511ee/software/firmware/source/SoftRF/src/platform/nRF52.cpp#L1738
+ constexpr uint32_t DFU_MAGIC_SKIP = 0x6d;
+ sd_power_gpregret_set(0, DFU_MAGIC_SKIP); // Equivalent NRF_POWER->GPREGRET = DFU_MAGIC_SKIP
+
// FIXME, use system off mode with ram retention for key state?
// FIXME, use non-init RAM per
// https://devzone.nordicsemi.com/f/nordic-q-a/48919/ram-retention-settings-with-softdevice-enabled
diff --git a/src/platform/nrf52/pgmspace.h b/src/platform/nrf52/pgmspace.h
deleted file mode 100644
index 5ad8035be..000000000
--- a/src/platform/nrf52/pgmspace.h
+++ /dev/null
@@ -1,5 +0,0 @@
-#pragma once
-
-// dummy file to keep old arduino code happy
-#define PROGMEM
-#define pgm_read_byte(addr) (*((unsigned const char *)addr))
\ No newline at end of file
diff --git a/src/platform/portduino/PortduinoGlue.cpp b/src/platform/portduino/PortduinoGlue.cpp
index 9cf06ede8..c2928a9a3 100644
--- a/src/platform/portduino/PortduinoGlue.cpp
+++ b/src/platform/portduino/PortduinoGlue.cpp
@@ -224,6 +224,8 @@ void portduinoSetup()
settingsMap[displayPanel] = st7796;
else if (yamlConfig["Display"]["Panel"].as("") == "ILI9341")
settingsMap[displayPanel] = ili9341;
+ else if (yamlConfig["Display"]["Panel"].as("") == "ILI9342")
+ settingsMap[displayPanel] = ili9342;
else if (yamlConfig["Display"]["Panel"].as("") == "ILI9486")
settingsMap[displayPanel] = ili9486;
else if (yamlConfig["Display"]["Panel"].as("") == "ILI9488")
diff --git a/src/platform/portduino/PortduinoGlue.h b/src/platform/portduino/PortduinoGlue.h
index b64bb4f38..174e6e06e 100644
--- a/src/platform/portduino/PortduinoGlue.h
+++ b/src/platform/portduino/PortduinoGlue.h
@@ -58,7 +58,7 @@ enum configNames {
maxnodes,
ascii_logs
};
-enum { no_screen, x11, st7789, st7735, st7735s, st7796, ili9341, ili9486, ili9488, hx8357d };
+enum { no_screen, x11, st7789, st7735, st7735s, st7796, ili9341, ili9342, ili9486, ili9488, hx8357d };
enum { no_touchscreen, xpt2046, stmpe610, gt911, ft5x06 };
enum { level_error, level_warn, level_info, level_debug, level_trace };
diff --git a/userPrefs.h b/userPrefs.h
index 40f2cc6d2..ed622bcfb 100644
--- a/userPrefs.h
+++ b/userPrefs.h
@@ -1,6 +1,10 @@
#ifndef _USERPREFS_
#define _USERPREFS_
+// Slipstream values:
+
+#define USERPREFS_TZ_STRING "tzplaceholder "
+
// Uncomment and modify to set device defaults
// #define USERPREFS_EVENT_MODE 1
@@ -9,6 +13,10 @@
// #define USERPREFS_LORACONFIG_MODEM_PRESET meshtastic_Config_LoRaConfig_ModemPreset_SHORT_FAST
// #define USERPREFS_LORACONFIG_CHANNEL_NUM 31
// #define USERPREFS_CONFIG_LORA_IGNORE_MQTT true
+
+// #define USERPREFS_CONFIG_GPS_MODE meshtastic_Config_PositionConfig_GpsMode_ENABLED
+
+// #define USERPREFS_CHANNELS_TO_WRITE 3
/*
#define USERPREFS_CHANNEL_0_PSK \
{ \
@@ -18,6 +26,24 @@
*/
// #define USERPREFS_CHANNEL_0_NAME "DEFCONnect"
// #define USERPREFS_CHANNEL_0_PRECISION 14
+/*
+#define USERPREFS_CHANNEL_1_PSK \
+ { \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 \
+ }
+*/
+// #define USERPREFS_CHANNEL_1_NAME "REPLACEME"
+// #define USERPREFS_CHANNEL_1_PRECISION 14
+/*
+#define USERPREFS_CHANNEL_2_PSK \
+ { \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 \
+ }
+*/
+// #define USERPREFS_CHANNEL_2_NAME "REPLACEME"
+// #define USERPREFS_CHANNEL_2_PRECISION 14
// #define USERPREFS_CONFIG_OWNER_LONG_NAME "My Long Name"
// #define USERPREFS_CONFIG_OWNER_SHORT_NAME "MLN"
diff --git a/userPrefs.json b/userPrefs.json
new file mode 100644
index 000000000..bc62602be
--- /dev/null
+++ b/userPrefs.json
@@ -0,0 +1,16 @@
+{
+ "USERPREFS_CHANNEL_0_NAME": "\"DEFCONnect\"",
+ "USERPREFS_CHANNEL_0_PRECISION": "14",
+ "USERPREFS_CHANNEL_0_PSK": "{ 0x38, 0x4b, 0xbc, 0xc0, 0x1d, 0xc0, 0x22, 0xd1, 0x81, 0xbf, 0x36, 0xb8, 0x61, 0x21, 0xe1, 0xfb, 0x96, 0xb7, 0x2e, 0x55, 0xbf, 0x74, 0x22, 0x7e, 0x9d, 0x6a, 0xfb, 0x48, 0xd6, 0x4c, 0xb1, 0xa1 }",
+ "USERPREFS_CONFIG_LORA_IGNORE_MQTT": "true",
+ "USERPREFS_CONFIG_LORA_REGION": "meshtastic_Config_LoRaConfig_RegionCode_US",
+ "USERPREFS_CONFIG_OWNER_LONG_NAME": "\"My Long Name\"",
+ "USERPREFS_CONFIG_OWNER_SHORT_NAME": "\"MLN\"",
+ "USERPREFS_EVENT_MODE": "1",
+ "USERPREFS_HAS_SPLASH": "",
+ "USERPREFS_LORACONFIG_CHANNEL_NUM": "31",
+ "USERPREFS_LORACONFIG_MODEM_PRESET": "meshtastic_Config_LoRaConfig_ModemPreset_SHORT_FAST",
+ "USERPREFS_SPLASH_TITLE": "\"DEFCONtastic\"",
+ "USERPREFS_TZ_STRING": "\"tzplaceholder \"",
+ "USERPREFS_USE_ADMIN_KEY": "1"
+}
diff --git a/variants/heltec_mesh_node_t114/variant.h b/variants/heltec_mesh_node_t114/variant.h
index 2cea3ef2f..426085a26 100644
--- a/variants/heltec_mesh_node_t114/variant.h
+++ b/variants/heltec_mesh_node_t114/variant.h
@@ -154,8 +154,11 @@ No longer populated on PCB
// #define PIN_GPS_RESET (32 + 6) // An output to reset L76K GPS. As per datasheet, low for > 100ms will reset the L76K
#define GPS_RESET_MODE LOW
-#define PIN_GPS_EN (21)
-#define GPS_EN_ACTIVE HIGH
+// #define PIN_GPS_EN (21)
+#define VEXT_ENABLE (0 + 21)
+#define PERIPHERAL_WARMUP_MS 1000 // Make sure I2C QuickLink has stable power before continuing
+#define VEXT_ON_VALUE HIGH
+// #define GPS_EN_ACTIVE HIGH
#define PIN_GPS_STANDBY (32 + 2) // An output to wake GPS, low means allow sleep, high means force wake
#define PIN_GPS_PPS (32 + 4)
// Seems to be missing on this new board
diff --git a/variants/lora_relay_v1/platformio.ini b/variants/lora_relay_v1/platformio.ini
deleted file mode 100644
index 435d256c5..000000000
--- a/variants/lora_relay_v1/platformio.ini
+++ /dev/null
@@ -1,24 +0,0 @@
-; The https://github.com/BigCorvus/SX1262-LoRa-BLE-Relay board by @BigCorvus
-[env:lora-relay-v1]
-extends = nrf52840_base
-board = lora-relay-v1
-board_level = extra
-# add our variants files to the include and src paths
-# define build flags for the TFT_eSPI library
-build_flags = ${nrf52840_base.build_flags} -Ivariants/lora_relay_v1
- -DUSER_SETUP_LOADED
- -DTFT_WIDTH=80
- -DTFT_HEIGHT=160
- -DST7735_GREENTAB160x80
- -DST7735_DRIVER
- -DTFT_CS=ST7735_CS
- -DTFT_DC=ST7735_RS
- -DTFT_RST=ST7735_RESET
- -DSPI_FREQUENCY=27000000
- -L "${platformio.libdeps_dir}/${this.__env__}/bsec2/src/cortex-m4/fpv4-sp-d16-hard"
-build_src_filter = ${nrf52_base.build_src_filter} +<../variants/lora_relay_v1>
-lib_deps =
- ${nrf52840_base.lib_deps}
- sparkfun/SparkFun BQ27441 LiPo Fuel Gauge Arduino Library@^1.1.0
- bodmer/TFT_eSPI@^2.4.76
- adafruit/Adafruit NeoPixel @ ^1.12.0
\ No newline at end of file
diff --git a/variants/lora_relay_v1/variant.cpp b/variants/lora_relay_v1/variant.cpp
deleted file mode 100644
index 891c8bb29..000000000
--- a/variants/lora_relay_v1/variant.cpp
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- Copyright (c) 2014-2015 Arduino LLC. All right reserved.
- Copyright (c) 2016 Sandeep Mistry All right reserved.
- Copyright (c) 2018, Adafruit Industries (adafruit.com)
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-*/
-
-#include "variant.h"
-#include "nrf.h"
-#include "wiring_constants.h"
-#include "wiring_digital.h"
-
-const uint32_t g_ADigitalPinMap[] = {
- // D0 .. D13
- 25, // D0 is P0.25 (UART TX)
- 24, // D1 is P0.24 (UART RX
- 10, // D2 is P0.10 (NFC2)
- 47, // D3 is P1.15 (LED1)
- 42, // D4 is P1.10 (LED2)
- 40, // D5 is P1.08
- 7, // D6 is P0.07
- 34, // D7 is P1.02 (Button)
- 16, // D8 is P0.16 (NeoPixel)
- 26, // D9 is P0.26 D_RS (IPS data/command control)
- 27, // D10 is P0.27
- 6, // D11 is P0.06 D_RES (IPS display reset)
- 8, // D12 is P0.08 D_CS (IPS display chip select)
- 41, // D13 is P1.09 BLT (IPS display backlight)
- 4, // D14 is P0.04 SX1262 RXEN
- 5, // D15 is P0.05 BOOST_EN (5V buck converter enable for the the radio power)
-
- // D14 .. D21 (aka A0 .. A7)
- 30, // D16 is P0.30 (A0)
- 28, // D17 is P0.28 (A1)
- 2, // D18 is P0.02 (A2)
- 3, // D19 is P0.03 (A3)
- 29, // D20 is P0.29 (A4, Battery)
- 31, // D21 is P0.31 (A5, ARef)
-
- // D22 .. D23 (aka I2C pins)
- 12, // D22 is P0.12 (SDA)
- 11, // D23 is P0.11 (SCL)
-
- // D24 .. D26 (aka SPI pins)
- 15, // D24 is P0.15 (SPI MISO)
- 13, // D25 is P0.13 (SPI MOSI)
- 14, // D26 is P0.14 (SPI SCK )
-
- // QSPI pins (not exposed via any header / test point)
- // 19, // P0.19 (QSPI CLK)
- // 20, // P0.20 (QSPI CS)
- // 17, // P0.17 (QSPI Data 0)
- // 22, // P0.22 (QSPI Data 1)
- // 23, // P0.23 (QSPI Data 2)
- // 21, // P0.21 (QSPI Data 3)
-
- // The remaining NFC pin
- 9, // D27 P0.09 (NFC1, exposed only via test point on bottom of board)
-
- // The following pins were never listed as they were considered unusable
- // 0, // P0.00 is XL1 (attached to 32.768kHz crystal) Never expose as GPIOs
- // 1, // P0.01 is XL2 (attached to 32.768kHz crystal)
- 18, // D28 P0.18 is RESET (attached to switch)
- // 32, // P1.00 is SWO (attached to debug header)
-
- // D29-D43
- 27, // D29 P0.27 E22-SX1262 DIO1
- 28, // D30 P0.28 E22-SX1262 DIO2
- 30, // D31 P0.30 E22-SX1262 TXEN
- 35, // D32 P1.03 E22-SX1262 NSS
- 32 + 8, // D33 P1.08 E22-SX1262 BUSY
- 32 + 12, // D34 P1.12 E22-SX1262 RESET
- 32 + 1, // P1.01 BTN_UP
- 32 + 2, // P1.02 SWITCH
- 32 + 14, // D37 P1.14 is not connected per schematic
- 36, // P1.04 is not connected per schematic
- 37, // P1.05 is not connected per schematic
- 38, // P1.06 is not connected per schematic
- 39, // P1.07 is not connected per schematic
- 43, // P1.11 is not connected per schematic
- 45, // P1.13 is not connected per schematic
-};
-
-void initVariant()
-{
- // LED1 & LED2
- pinMode(PIN_LED1, OUTPUT);
- ledOff(PIN_LED1);
-
- pinMode(PIN_LED2, OUTPUT);
- ledOff(PIN_LED2);
-}
diff --git a/variants/lora_relay_v1/variant.h b/variants/lora_relay_v1/variant.h
deleted file mode 100644
index 6efd711c6..000000000
--- a/variants/lora_relay_v1/variant.h
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- Copyright (c) 2014-2015 Arduino LLC. All right reserved.
- Copyright (c) 2016 Sandeep Mistry All right reserved.
- Copyright (c) 2018, Adafruit Industries (adafruit.com)
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-*/
-
-#ifndef _VARIANT_LORA_RELAY_V1_
-#define _VARIANT_LORA_RELAY_V1_
-
-/** Master clock frequency */
-#define VARIANT_MCK (64000000ul)
-
-#define USE_LFXO // Board uses 32khz crystal for LF
-// define USE_LFRC // Board uses RC for LF
-
-/*----------------------------------------------------------------------------
- * Headers
- *----------------------------------------------------------------------------*/
-
-#include "WVariant.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif // __cplusplus
-
-// Number of pins defined in PinDescription array
-#define PINS_COUNT (43)
-#define NUM_DIGITAL_PINS (43)
-#define NUM_ANALOG_INPUTS (6) // A6 is used for battery, A7 is analog reference
-#define NUM_ANALOG_OUTPUTS (0)
-
-// LEDs
-#define PIN_LED1 (3)
-#define PIN_LED2 (4)
-// #define PIN_NEOPIXEL (8)
-#define HAS_NEOPIXEL // Enable the use of neopixels
-#define NEOPIXEL_COUNT 1 // How many neopixels are connected
-#define NEOPIXEL_DATA 8 // gpio pin used to send data to the neopixels
-#define NEOPIXEL_TYPE (NEO_GRB + NEO_KHZ800) // type of neopixels in use
-
-#define LED_BUILTIN PIN_LED1
-#define LED_CONN PIN_LED2
-
-#define LED_RED PIN_LED1
-#define LED_BLUE PIN_LED2
-
-#define LED_STATE_ON 1 // State when LED is litted
-
-/*
- * Buttons
- */
-#define PIN_BUTTON1 (7)
-
-/*
- * Analog pins
- */
-#define PIN_A0 (16)
-#define PIN_A1 (17)
-#define PIN_A2 (18)
-#define PIN_A3 (19)
-#define PIN_A4 (20)
-#define PIN_A5 (21)
-
-static const uint8_t A0 = PIN_A0;
-static const uint8_t A1 = PIN_A1;
-static const uint8_t A2 = PIN_A2;
-static const uint8_t A3 = PIN_A3;
-static const uint8_t A4 = PIN_A4;
-static const uint8_t A5 = PIN_A5;
-#define ADC_RESOLUTION 14
-
-// Other pins
-#define PIN_AREF PIN_A5
-#define PIN_VBAT PIN_A4
-#define BATTERY_PIN PIN_VBAT
-#define PIN_NFC1 (33)
-#define PIN_NFC2 (2)
-#define PIN_PIEZO (37)
-static const uint8_t AREF = PIN_AREF;
-
-/*
- * Serial interfaces
- */
-#define PIN_SERIAL1_RX (1)
-#define PIN_SERIAL1_TX (0)
-
-/*
- * SPI Interfaces
- */
-#define SPI_INTERFACES_COUNT 1
-
-#define PIN_SPI_MISO (24)
-#define PIN_SPI_MOSI (25)
-#define PIN_SPI_SCK (26)
-
-static const uint8_t SS = (5);
-static const uint8_t MOSI = PIN_SPI_MOSI;
-static const uint8_t MISO = PIN_SPI_MISO;
-static const uint8_t SCK = PIN_SPI_SCK;
-
-/*
- * Wire Interfaces
- */
-#define WIRE_INTERFACES_COUNT 1
-
-#define PIN_WIRE_SDA (22)
-#define PIN_WIRE_SCL (23)
-
-// I2C device addresses
-#define I2C_ADDR_BQ27441 0x55 // Battery gauge
-
-// SX1262 declaration
-#define USE_SX1262
-
-// CUSTOM GPIOs the SX1262
-#define SX126X_CS (32)
-
-// If you would prefer to get console debug output over the JTAG ICE connection rather than the CDC-ACM USB serial device, just
-// define this. #define USE_SEGGER
-
-#define SX126X_DIO1 (29)
-#define SX1262_DIO2 (30)
-#define SX126X_BUSY (33) // Supposed to be P0.18 but because of reworks, now on P0.31 (18)
-#define SX126X_RESET (34)
-// #define SX126X_ANT_SW (32 + 10)
-#define SX126X_RXEN (14)
-#define SX126X_TXEN (31)
-#define SX126X_POWER_EN \
- (15) // FIXME, see warning hre https://github.com/BigCorvus/SX1262-LoRa-BLE-Relay/blob/master/LORA_RELAY_NRF52840.ino
-// Indicates this SX1262 is inside of an ebyte E22 module and special config should be done for that
-#define SX126X_DIO3_TCXO_VOLTAGE 1.8
-
-#define ST7735_RESET (11) // Output
-#define ST7735_CS (12)
-#define TFT_BL (13)
-#define ST7735_RS (9)
-
-// #define LORA_DISABLE_SENDING // The board can brownout during lora TX if you don't have a battery connected. Disable sending
-// to allow USB power only based debugging
-
-#ifdef __cplusplus
-}
-#endif
-
-/*----------------------------------------------------------------------------
- * Arduino objects - C++ only
- *----------------------------------------------------------------------------*/
-
-#endif
\ No newline at end of file
diff --git a/variants/lora_relay_v2/platformio.ini b/variants/lora_relay_v2/platformio.ini
deleted file mode 100644
index 3598466d5..000000000
--- a/variants/lora_relay_v2/platformio.ini
+++ /dev/null
@@ -1,26 +0,0 @@
-; The https://github.com/BigCorvus/LoRa-BLE-Relay-v2 board by @BigCorvus
-[env:lora-relay-v2]
-extends = nrf52840_base
-board = lora-relay-v2
-board_level = extra
-# add our variants files to the include and src paths
-# define build flags for the TFT_eSPI library
-build_flags = ${nrf52840_base.build_flags} -Ivariants/lora_relay_v2
- -DUSER_SETUP_LOADED
- -DTFT_WIDTH=80
- -DTFT_HEIGHT=160
- -DST7735_GREENTAB160x80
- -DST7735_DRIVER
- -DTFT_CS=ST7735_CS
- -DTFT_DC=ST7735_RS
- -DTFT_RST=ST7735_RESET
- -DSPI_FREQUENCY=27000000
- -DTFT_WR=ST7735_SDA
- -DTFT_SCLK=ST7735_SCK
- -L "${platformio.libdeps_dir}/${this.__env__}/bsec2/src/cortex-m4/fpv4-sp-d16-hard"
-build_src_filter = ${nrf52_base.build_src_filter} +<../variants/lora_relay_v2>
-lib_deps =
- ${nrf52840_base.lib_deps}
- sparkfun/SparkFun BQ27441 LiPo Fuel Gauge Arduino Library@^1.1.0
- bodmer/TFT_eSPI@^2.4.76
- adafruit/Adafruit NeoPixel @ ^1.12.0
\ No newline at end of file
diff --git a/variants/lora_relay_v2/variant.cpp b/variants/lora_relay_v2/variant.cpp
deleted file mode 100644
index 23d648873..000000000
--- a/variants/lora_relay_v2/variant.cpp
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- Copyright (c) 2014-2015 Arduino LLC. All right reserved.
- Copyright (c) 2016 Sandeep Mistry All right reserved.
- Copyright (c) 2018, Adafruit Industries (adafruit.com)
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-*/
-
-#include "variant.h"
-#include "nrf.h"
-#include "wiring_constants.h"
-#include "wiring_digital.h"
-
-const uint32_t g_ADigitalPinMap[] = {
- // D0 .. D13
- 25, // D0 is P0.25 (UART TX)
- 24, // D1 is P0.24 (UART RX
- 10, // D2 is P0.10 (NFC2)
- 47, // D3 is P1.15 (LED1)
- (32 + 10), // D4 is P1.10 (LED2)
- 40, // D5 is P1.08
- 7, // D6 is P0.07
- 34, // D7 is P1.02 (Switch)
- 16, // D8 is P0.16 (NeoPixel)
- 26, // D9 is P0.26 D_RS (IPS data/command control)
- 27, // D10 is P0.27
- 6, // D11 is P0.06 D_RES (IPS display reset)
- 8, // D12 is P0.08 D_CS (IPS display chip select)
- 41, // D13 is P0.23 BLT (IPS display backlight)
- 4, // D14 is P0.04 SX1262 RXEN
- 5, // D15 is P0.05 BOOST_EN (5V buck converter enable for the the radio power)
-
- // D14 .. D21 (aka A0 .. A7)
- 30, // D16 is P0.30 (A0)
- 28, // D17 is P0.28 (A1)
- 2, // D18 is P0.02 (A2)
- 3, // D19 is P0.03 (A3)
- 29, // D20 is P0.29 (A4, Battery)
- 31, // D21 is P0.31 (A5, ARef)
-
- // D22 .. D23 (aka I2C pins)
- 12, // D22 is P0.12 (SDA)
- 11, // D23 is P0.11 (SCL)
-
- // D24 .. D26 (aka SPI pins)
- 15, // D24 is P0.15 (SPI MISO)
- 13, // D25 is P0.13 (SPI MOSI)
- 14, // D26 is P0.14 (SPI SCK )
-
- // QSPI pins (not exposed via any header / test point)
- // 19, // P0.19 (QSPI CLK)
- // 20, // P0.20 (QSPI CS)
- // 17, // P0.17 (QSPI Data 0)
- // 22, // P0.22 (QSPI Data 1)
- // 23, // P0.23 (QSPI Data 2)
- // 21, // P0.21 (QSPI Data 3)
-
- // The remaining NFC pin
- 9, // D27 P0.09 (NFC1, exposed only via test point on bottom of board)
-
- // The following pins were never listed as they were considered unusable
- // 0, // P0.00 is XL1 (attached to 32.768kHz crystal) Never expose as GPIOs
- // 1, // P0.01 is XL2 (attached to 32.768kHz crystal)
- 18, // D28 P0.18 is RESET (attached to switch)
- // 32, // P1.00 is SWO (attached to debug header)
-
- // D29-D43
- 32 + 12, // D29 P0.27 E22-SX1262 DIO1
- 28, // D30 P0.28 E22-SX1262 DIO2
- 30, // D31 P0.30 E22-SX1262 TXEN
- 35, // D32 P1.03 E22-SX1262 NSS
- 32 + 8, // D33 P1.08 E22-SX1262 BUSY
- 27, // D34 P0.27 E22-SX1262 RESET
- 32 + 1, // D35 P1.01 BTN_UP
- 32, // D36 P1.0 GPS power
- 21, // D37 P0.21 disp_clk
- 36, // P1.04 BTN_OK
- 37, // D39 P0.19 disp_SDA
- 38, // D40 P1.06 BUZZER
- 39, // P1.07 is not connected per schematic
- 43, // P1.11 is not connected per schematic
- 45, // P1.13 is not connected per schematic
-};
-
-void initVariant()
-{
- // LED1 & LED2
- pinMode(PIN_LED1, OUTPUT);
- ledOff(PIN_LED1);
-
- pinMode(PIN_LED2, OUTPUT);
- ledOff(PIN_LED2);
-}
diff --git a/variants/lora_relay_v2/variant.h b/variants/lora_relay_v2/variant.h
deleted file mode 100644
index f18f81034..000000000
--- a/variants/lora_relay_v2/variant.h
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- Copyright (c) 2014-2015 Arduino LLC. All right reserved.
- Copyright (c) 2016 Sandeep Mistry All right reserved.
- Copyright (c) 2018, Adafruit Industries (adafruit.com)
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-*/
-
-#ifndef _VARIANT_LORA_RELAY_V1_
-#define _VARIANT_LORA_RELAY_V1_
-
-/** Master clock frequency */
-#define VARIANT_MCK (64000000ul)
-
-#define USE_LFXO // Board uses 32khz crystal for LF
-// define USE_LFRC // Board uses RC for LF
-
-/*
-kevinh todo
-
-ok leds
-ok buttons
-ok gps power
-ok gps signal
-ok? lcd
-ok buzzer
-serial flash
-ok lora (inc boost en)
-
-mention dat1 and dat2 on sd card
-use hardware spi controller for lcd - not bitbang
-
-*/
-
-/*----------------------------------------------------------------------------
- * Headers
- *----------------------------------------------------------------------------*/
-
-#include "WVariant.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif // __cplusplus
-
-// Number of pins defined in PinDescription array
-#define PINS_COUNT (43)
-#define NUM_DIGITAL_PINS (43)
-#define NUM_ANALOG_INPUTS (6) // A6 is used for battery, A7 is analog reference
-#define NUM_ANALOG_OUTPUTS (0)
-
-// LEDs
-#define PIN_LED1 (3)
-#define PIN_LED2 (4)
-// #define PIN_NEOPIXEL (8)
-#define HAS_NEOPIXEL // Enable the use of neopixels
-#define NEOPIXEL_COUNT 1 // How many neopixels are connected
-#define NEOPIXEL_DATA 8 // gpio pin used to send data to the neopixels
-#define NEOPIXEL_TYPE (NEO_GRB + NEO_KHZ800) // type of neopixels in use
-
-#define PIN_BUZZER (40)
-
-#define LED_BUILTIN PIN_LED1
-#define LED_CONN PIN_LED2
-
-#define LED_RED PIN_LED1
-#define LED_BLUE PIN_LED2
-
-#define LED_STATE_ON 1 // State when LED is litted
-
-/*
- * Buttons
- */
-#define PIN_BUTTON1 (7)
-#define PIN_BUTTON2 (35)
-#define PIN_BUTTON3 (37)
-
-/*
- * Analog pins
- */
-#define PIN_A0 (16)
-#define PIN_A1 (17)
-#define PIN_A2 (18)
-#define PIN_A3 (19)
-#define PIN_A4 (20)
-#define PIN_A5 (21)
-
-static const uint8_t A0 = PIN_A0;
-static const uint8_t A1 = PIN_A1;
-static const uint8_t A2 = PIN_A2;
-static const uint8_t A3 = PIN_A3;
-static const uint8_t A4 = PIN_A4;
-static const uint8_t A5 = PIN_A5;
-#define ADC_RESOLUTION 14
-
-// Other pins
-#define PIN_AREF PIN_A5
-#define PIN_VBAT PIN_A4
-#define BATTERY_PIN PIN_VBAT
-#define PIN_NFC1 (33)
-#define PIN_NFC2 (2)
-#define PIN_PIEZO (37)
-static const uint8_t AREF = PIN_AREF;
-
-/*
- * Serial interfaces
- */
-#define PIN_SERIAL1_RX (1)
-#define PIN_SERIAL1_TX (0)
-
-/*
- * SPI Interfaces
- */
-#define SPI_INTERFACES_COUNT 1
-
-#define PIN_SPI_MISO (24)
-#define PIN_SPI_MOSI (25)
-#define PIN_SPI_SCK (26)
-
-static const uint8_t SS = (5);
-static const uint8_t MOSI = PIN_SPI_MOSI;
-static const uint8_t MISO = PIN_SPI_MISO;
-static const uint8_t SCK = PIN_SPI_SCK;
-
-/*
- * Wire Interfaces
- */
-#define WIRE_INTERFACES_COUNT 1
-
-#define PIN_WIRE_SDA (22)
-#define PIN_WIRE_SCL (23)
-
-// I2C device addresses
-#define I2C_ADDR_BQ27441 0x55 // Battery gauge
-
-// SX1262 declaration
-#define USE_SX1262
-
-// CUSTOM GPIOs the SX1262
-#define SX126X_CS (32)
-
-// If you would prefer to get console debug output over the JTAG ICE connection rather than the CDC-ACM USB serial device, just
-// define this. #define USE_SEGGER
-
-#define SX126X_DIO1 (29)
-#define SX1262_DIO2 (30)
-#define SX126X_BUSY (33) // Supposed to be P0.18 but because of reworks, now on P0.31 (18)
-#define SX126X_RESET (34)
-// #define SX126X_ANT_SW (32 + 10)
-#define SX126X_RXEN (14)
-#define SX126X_TXEN (31)
-#define SX126X_POWER_EN \
- (15) // FIXME, see warning hre https://github.com/BigCorvus/SX1262-LoRa-BLE-Relay/blob/master/LORA_RELAY_NRF52840.ino
-// Indicates this SX1262 is inside of an ebyte E22 module and special config should be done for that
-#define SX126X_DIO3_TCXO_VOLTAGE 1.8
-
-// ST7565 SPI
-#define ST7735_RESET (11) // Output
-#define ST7735_CS (12)
-#define TFT_BL (13)
-#define ST7735_RS (9)
-#define ST7735_SDA (39) // actually spi MOSI
-#define ST7735_SCK (37) // actually spi clk
-
-#define PIN_GPS_EN 36 // Just kill GPS power when we want it to sleep? FIXME
-#define GPS_EN_ACTIVE 0 // GPS Power output is active low
-
-// #define LORA_DISABLE_SENDING // The board can brownout during lora TX if you don't have a battery connected. Disable sending
-// to allow USB power only based debugging
-
-#ifdef __cplusplus
-}
-#endif
-
-/*----------------------------------------------------------------------------
- * Arduino objects - C++ only
- *----------------------------------------------------------------------------*/
-
-#endif
\ No newline at end of file
diff --git a/variants/pca10056-rc-clock/platformio.ini b/variants/pca10056-rc-clock/platformio.ini
deleted file mode 100644
index f8cff4d73..000000000
--- a/variants/pca10056-rc-clock/platformio.ini
+++ /dev/null
@@ -1,9 +0,0 @@
-; The NRF52840-dk development board, but @geeksville's board - which has a busted oscilliator
-[env:nrf52840dk-geeksville]
-board_level = extra
-extends = nrf52840_base
-board = nrf52840_dk_modified
-# add our variants files to the include and src paths
-build_flags = ${nrf52_base.build_flags} -Ivariants/pca10056-rc-clock
- -L "${platformio.libdeps_dir}/${this.__env__}/bsec2/src/cortex-m4/fpv4-sp-d16-hard"
-build_src_filter = ${nrf52_base.build_src_filter} +<../variants/pca10056-rc-clock>
\ No newline at end of file
diff --git a/variants/pca10056-rc-clock/variant.cpp b/variants/pca10056-rc-clock/variant.cpp
deleted file mode 100644
index a1882a33f..000000000
--- a/variants/pca10056-rc-clock/variant.cpp
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- Copyright (c) 2014-2015 Arduino LLC. All right reserved.
- Copyright (c) 2016 Sandeep Mistry All right reserved.
- Copyright (c) 2018, Adafruit Industries (adafruit.com)
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-*/
-
-#include "variant.h"
-#include "nrf.h"
-#include "wiring_constants.h"
-#include "wiring_digital.h"
-
-const uint32_t g_ADigitalPinMap[] = {
- // P0
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
-
- // P1
- 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47};
-
-void initVariant()
-{
- // LED1 & LED2
- pinMode(PIN_LED1, OUTPUT);
- ledOff(PIN_LED1);
-
- pinMode(PIN_LED2, OUTPUT);
- ledOff(PIN_LED2);
- ;
-}
diff --git a/variants/pca10056-rc-clock/variant.h b/variants/pca10056-rc-clock/variant.h
deleted file mode 100644
index 032e1de2b..000000000
--- a/variants/pca10056-rc-clock/variant.h
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- Copyright (c) 2014-2015 Arduino LLC. All right reserved.
- Copyright (c) 2016 Sandeep Mistry All right reserved.
- Copyright (c) 2018, Adafruit Industries (adafruit.com)
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-*/
-
-#ifndef _VARIANT_PCA10056_
-#define _VARIANT_PCA10056_
-
-/** Master clock frequency */
-#define VARIANT_MCK (64000000ul)
-
-// This file is the same as the standard pac10056 variant, except that @geeksville broke the xtal on his devboard so
-// he has to use a RC clock.
-
-// #define USE_LFXO // Board uses 32khz crystal for LF
-#define USE_LFRC // Board uses RC for LF
-
-/*----------------------------------------------------------------------------
- * Headers
- *----------------------------------------------------------------------------*/
-
-#include "WVariant.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif // __cplusplus
-
-// Number of pins defined in PinDescription array
-#define PINS_COUNT (48)
-#define NUM_DIGITAL_PINS (48)
-#define NUM_ANALOG_INPUTS (6)
-#define NUM_ANALOG_OUTPUTS (0)
-
-// LEDs
-#define PIN_LED1 (13)
-#define PIN_LED2 (14)
-
-#define LED_BUILTIN PIN_LED1
-#define LED_CONN PIN_LED2
-
-#define LED_RED PIN_LED1
-#define LED_BLUE PIN_LED2
-
-#define LED_STATE_ON 0 // State when LED is litted
-
-/*
- * Buttons
- */
-#define PIN_BUTTON1 11
-#define PIN_BUTTON2 12
-#define PIN_BUTTON3 24
-#define PIN_BUTTON4 25
-
-/*
- * Analog pins
- */
-#define PIN_A0 (3)
-#define PIN_A1 (4)
-#define PIN_A2 (28)
-#define PIN_A3 (29)
-#define PIN_A4 (30)
-#define PIN_A5 (31)
-#define PIN_A6 (0xff)
-#define PIN_A7 (0xff)
-
-static const uint8_t A0 = PIN_A0;
-static const uint8_t A1 = PIN_A1;
-static const uint8_t A2 = PIN_A2;
-static const uint8_t A3 = PIN_A3;
-static const uint8_t A4 = PIN_A4;
-static const uint8_t A5 = PIN_A5;
-static const uint8_t A6 = PIN_A6;
-static const uint8_t A7 = PIN_A7;
-#define ADC_RESOLUTION 14
-
-// Other pins
-#define PIN_AREF (2)
-#define PIN_NFC1 (9)
-#define PIN_NFC2 (10)
-
-static const uint8_t AREF = PIN_AREF;
-
-/*
- * Serial interfaces
- */
-
-// Arduino Header D0, D1
-#define PIN_SERIAL1_RX (33) // P1.01
-#define PIN_SERIAL1_TX (34) // P1.02
-
-// Connected to Jlink CDC
-#define PIN_SERIAL2_RX (8)
-#define PIN_SERIAL2_TX (6)
-
-/*
- * SPI Interfaces
- */
-#define SPI_INTERFACES_COUNT 1
-
-#define PIN_SPI_MISO (46)
-#define PIN_SPI_MOSI (45)
-#define PIN_SPI_SCK (47)
-
-static const uint8_t SS = 44;
-static const uint8_t MOSI = PIN_SPI_MOSI;
-static const uint8_t MISO = PIN_SPI_MISO;
-static const uint8_t SCK = PIN_SPI_SCK;
-
-/*
- * Wire Interfaces
- */
-#define WIRE_INTERFACES_COUNT 1
-
-#define PIN_WIRE_SDA (26)
-#define PIN_WIRE_SCL (27)
-
-// QSPI Pins
-#define PIN_QSPI_SCK 19
-#define PIN_QSPI_CS 17
-#define PIN_QSPI_IO0 20
-#define PIN_QSPI_IO1 21
-#define PIN_QSPI_IO2 22
-#define PIN_QSPI_IO3 23
-
-// On-board QSPI Flash
-#define EXTERNAL_FLASH_DEVICES MX25R6435F
-#define EXTERNAL_FLASH_USE_QSPI
-
-// CUSTOM GPIOs the SX1262MB2CAS shield when installed on the NRF52840-DK development board
-#define USE_SX1262
-#define SX126X_CS (32 + 8) // P1.08
-#define SX126X_DIO1 (32 + 6) // P1.06
-#define SX126X_BUSY (32 + 4) // P1.04
-#define SX126X_RESET (0 + 3) // P0.03
-#define SX126X_ANT_SW (32 + 10) // P1.10
-#define SX126X_DIO2_AS_RF_SWITCH
-
-// To debug via the segger JLINK console rather than the CDC-ACM serial device
-// #define USE_SEGGER
-
-#ifdef __cplusplus
-}
-#endif
-
-/*----------------------------------------------------------------------------
- * Arduino objects - C++ only
- *----------------------------------------------------------------------------*/
-
-#endif
diff --git a/variants/ppr/platformio.ini b/variants/ppr/platformio.ini
deleted file mode 100644
index 22273ce8e..000000000
--- a/variants/ppr/platformio.ini
+++ /dev/null
@@ -1,8 +0,0 @@
-; The PPR board
-[env:ppr]
-extends = nrf52_base
-board = ppr
-board_level = extra
-lib_deps =
- ${arduino_base.lib_deps}
- industruino/UC1701@^1.1.0
\ No newline at end of file
diff --git a/variants/ppr/variant.cpp b/variants/ppr/variant.cpp
deleted file mode 100644
index f5f219e9b..000000000
--- a/variants/ppr/variant.cpp
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- Copyright (c) 2014-2015 Arduino LLC. All right reserved.
- Copyright (c) 2016 Sandeep Mistry All right reserved.
- Copyright (c) 2018, Adafruit Industries (adafruit.com)
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-*/
-
-#include "variant.h"
-#include "nrf.h"
-#include "wiring_constants.h"
-#include "wiring_digital.h"
-
-const uint32_t g_ADigitalPinMap[] = {
- // P0
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0xff, 12, 13, 0xff, 15, 0xff, 17, 18, 0xff, 20, 0xff, 22, 0xff, 24, 0xff, 26, 0xff, 28, 29,
- 30, 31,
-
- // P1
- 32, 0xff, 34, 0xff, 36, 0xff, 38, 0xff, 0xff, 41, 42, 43, 0xff, 45};
-
-void initVariant()
-{
- // LED1 & LED2
- pinMode(PIN_LED1, OUTPUT);
- ledOff(PIN_LED1);
-
- pinMode(PIN_LED2, OUTPUT);
- ledOff(PIN_LED2);
-}
diff --git a/variants/ppr/variant.h b/variants/ppr/variant.h
deleted file mode 100644
index 4c6cc015c..000000000
--- a/variants/ppr/variant.h
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- Copyright (c) 2014-2015 Arduino LLC. All right reserved.
- Copyright (c) 2016 Sandeep Mistry All right reserved.
- Copyright (c) 2018, Adafruit Industries (adafruit.com)
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-*/
-
-#pragma once
-
-/** Master clock frequency */
-#define VARIANT_MCK (64000000ul)
-
-// This board does not have a 32khz crystal
-// #define USE_LFXO // Board uses 32khz crystal for LF
-#define USE_LFRC // Board uses RC for LF
-
-/*----------------------------------------------------------------------------
- * Headers
- *----------------------------------------------------------------------------*/
-
-#include "WVariant.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif // __cplusplus
-
-// Number of pins defined in PinDescription array
-#define PINS_COUNT (46)
-#define NUM_DIGITAL_PINS (46)
-#define NUM_ANALOG_INPUTS (0)
-#define NUM_ANALOG_OUTPUTS (0)
-
-// LEDs
-#define PIN_LED1 (0)
-#define PIN_LED2 (1)
-
-#define LED_BUILTIN PIN_LED1
-#define LED_CONN PIN_LED2
-
-#define LED_RED PIN_LED1
-#define LED_GREEN PIN_LED2
-
-// FIXME, bluefruit automatically blinks this led while connected. call AdafruitBluefruit::autoConnLed to change this.
-#define LED_BLUE LED_GREEN
-
-#define LED_STATE_ON 1 // State when LED is litted
-
-/*
- * Buttons
- */
-#define PIN_BUTTON1 4 // center
-#define PIN_BUTTON2 2
-#define PIN_BUTTON3 3
-#define PIN_BUTTON4 5
-#define PIN_BUTTON5 6
-
-/*
- * Analog pins
- */
-#define PIN_A0 (0xff)
-#define PIN_A1 (0xff)
-#define PIN_A2 (0xff)
-#define PIN_A3 (0xff)
-#define PIN_A4 (0xff)
-#define PIN_A5 (0xff)
-#define PIN_A6 (0xff)
-#define PIN_A7 (0xff)
-
-static const uint8_t A0 = PIN_A0;
-static const uint8_t A1 = PIN_A1;
-static const uint8_t A2 = PIN_A2;
-static const uint8_t A3 = PIN_A3;
-static const uint8_t A4 = PIN_A4;
-static const uint8_t A5 = PIN_A5;
-static const uint8_t A6 = PIN_A6;
-static const uint8_t A7 = PIN_A7;
-#define ADC_RESOLUTION 14
-
-// Other pins
-#define PIN_AREF (0xff)
-// #define PIN_NFC1 (9)
-// #define PIN_NFC2 (10)
-
-static const uint8_t AREF = PIN_AREF;
-
-/*
- * Serial interfaces
- */
-
-// GPS is on Serial1
-#define PIN_SERIAL1_RX (8)
-#define PIN_SERIAL1_TX (9)
-
-// Connected to Jlink CDC
-// #define PIN_SERIAL2_RX (8)
-// #define PIN_SERIAL2_TX (6)
-
-/*
- * SPI Interfaces
- */
-#define SPI_INTERFACES_COUNT 1
-
-#define PIN_SPI_MISO (15)
-#define PIN_SPI_MOSI (13)
-#define PIN_SPI_SCK (12)
-
-// static const uint8_t SS = 44;
-static const uint8_t MOSI = PIN_SPI_MOSI;
-static const uint8_t MISO = PIN_SPI_MISO;
-static const uint8_t SCK = PIN_SPI_SCK;
-
-/*
- * Wire Interfaces
- */
-#define WIRE_INTERFACES_COUNT 1
-
-#define PIN_WIRE_SDA (32 + 2)
-#define PIN_WIRE_SCL (32)
-
-// CUSTOM GPIOs the SX1262
-#define USE_SX1262
-#define SX126X_CS (10)
-#define SX126X_DIO1 (20)
-#define SX1262_DIO2 (26)
-#define SX126X_BUSY (31) // Supposed to be P0.18 but because of reworks, now on P0.31 (18)
-#define SX126X_RESET (17)
-// #define SX126X_ANT_SW (32 + 10)
-#define SX126X_RXEN (22)
-#define SX126X_TXEN (24)
-// Indicates this SX1262 is inside of an ebyte E22 module and special config should be done for that
-#define SX126X_DIO3_TCXO_VOLTAGE 1.8
-
-// ERC12864-10 LCD
-#define ERC12864_CS (32 + 4)
-#define ERC12864_RESET (32 + 6)
-#define ERC12864_CD (32 + 9)
-
-// L80 GPS
-#define L80_PPS (28)
-#define L80_RESET (29)
-
-#ifdef __cplusplus
-}
-#endif
-
-/*----------------------------------------------------------------------------
- * Arduino objects - C++ only
- *----------------------------------------------------------------------------*/
diff --git a/variants/ppr1/platformio.ini b/variants/ppr1/platformio.ini
deleted file mode 100644
index f6c2a5e0b..000000000
--- a/variants/ppr1/platformio.ini
+++ /dev/null
@@ -1,9 +0,0 @@
-; The PPR board
-[env:ppr1]
-extends = nrf52_base
-board = ppr1
-board_level = extra
-build_flags = ${nrf52_base.build_flags} -Ivariants/ppr1
-build_src_filter = ${nrf52_base.build_src_filter} +<../variants/ppr1>
-lib_deps =
- ${arduino_base.lib_deps}
\ No newline at end of file
diff --git a/variants/ppr1/variant.cpp b/variants/ppr1/variant.cpp
deleted file mode 100644
index acc3e344a..000000000
--- a/variants/ppr1/variant.cpp
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- Copyright (c) 2014-2015 Arduino LLC. All right reserved.
- Copyright (c) 2016 Sandeep Mistry All right reserved.
- Copyright (c) 2018, Adafruit Industries (adafruit.com)
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-*/
-
-#include "variant.h"
-#include "nrf.h"
-#include "wiring_constants.h"
-#include "wiring_digital.h"
-
-const uint32_t g_ADigitalPinMap[] = {
- // P0
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
-
- // P1
- 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45};
-
-void initVariant()
-{
- // LED1 & LED2
- pinMode(PIN_LED1, OUTPUT);
- ledOff(PIN_LED1);
-
- pinMode(PIN_LED2, OUTPUT);
- ledOff(PIN_LED2);
-}
diff --git a/variants/ppr1/variant.h b/variants/ppr1/variant.h
deleted file mode 100644
index ba3a25c2a..000000000
--- a/variants/ppr1/variant.h
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- Copyright (c) 2014-2015 Arduino LLC. All right reserved.
- Copyright (c) 2016 Sandeep Mistry All right reserved.
- Copyright (c) 2018, Adafruit Industries (adafruit.com)
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-*/
-
-#pragma once
-
-/** Master clock frequency */
-#define VARIANT_MCK (64000000ul)
-
-// This board does have a 32khz crystal
-#define USE_LFXO // Board uses 32khz crystal for LF
-// #define USE_LFRC // Board uses RC for LF
-
-/*----------------------------------------------------------------------------
- * Headers
- *----------------------------------------------------------------------------*/
-
-#include "WVariant.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif // __cplusplus
-
-// Number of pins defined in PinDescription array
-#define PINS_COUNT (46)
-#define NUM_DIGITAL_PINS (46)
-#define NUM_ANALOG_INPUTS (0)
-#define NUM_ANALOG_OUTPUTS (0)
-
-// LEDs
-#define PIN_LED1 (25)
-#define PIN_LED2 (11)
-
-#define LED_BUILTIN PIN_LED1
-#define LED_CONN PIN_LED2
-
-#define LED_RED PIN_LED1
-#define LED_GREEN PIN_LED2
-
-// FIXME, bluefruit automatically blinks this led while connected. call AdafruitBluefruit::autoConnLed to change this.
-#define LED_BLUE LED_GREEN
-
-#define LED_STATE_ON 1 // State when LED is litted
-
-/*
- * Buttons
- */
-#define PIN_BUTTON1 4 // up
-#define PIN_BUTTON2 2 // left
-#define PIN_BUTTON3 3 // center
-#define PIN_BUTTON4 5 // right
-#define PIN_BUTTON5 6 // down
-
-/*
- * Analog pins
- */
-#define PIN_A0 (0xff)
-#define PIN_A1 (0xff)
-#define PIN_A2 (0xff)
-#define PIN_A3 (0xff)
-#define PIN_A4 (0xff)
-#define PIN_A5 (0xff)
-#define PIN_A6 (0xff)
-#define PIN_A7 (0xff)
-
-static const uint8_t A0 = PIN_A0;
-static const uint8_t A1 = PIN_A1;
-static const uint8_t A2 = PIN_A2;
-static const uint8_t A3 = PIN_A3;
-static const uint8_t A4 = PIN_A4;
-static const uint8_t A5 = PIN_A5;
-static const uint8_t A6 = PIN_A6;
-static const uint8_t A7 = PIN_A7;
-#define ADC_RESOLUTION 14
-
-// Other pins
-#define PIN_AREF (0xff)
-// #define PIN_NFC1 (9)
-// #define PIN_NFC2 (10)
-
-static const uint8_t AREF = PIN_AREF;
-
-/*
- * Serial interfaces
- */
-
-// GPS is on Serial1
-#define PIN_SERIAL1_RX (8)
-#define PIN_SERIAL1_TX (9)
-
-// We intentionally leave this undefined so we don't even try to make a Ublox driver
-// #define GPS_TX_PIN PIN_SERIAL1_TX
-// #define GPS_RX_PIN PIN_SERIAL1_RX
-
-#define PIN_GPS_RESET 29 // active high
-#define PIN_GPS_PPS 28
-// #define PIN_GPS_WAKE 20 // CELL_CTRL in schematic? based on their example code
-#define PIN_GPS_EN 7 // GPS_EN active high
-
-// #define PIN_VUSB_EN 21
-
-// LCD
-
-#define PIN_LCD_RESET 23 // active low, pulse low for 20ms at boot
-#define USE_ST7567
-
-/// Charge controller I2C address
-#define BQ25703A_ADDR 0x6b
-
-// Define if screen should be mirrored left to right
-#define SCREEN_MIRROR
-
-// LCD screens are slow, so slowdown the wipe so it looks better
-#define SCREEN_TRANSITION_FRAMERATE 10 // fps
-
-/*
- * SPI Interfaces
- */
-#define SPI_INTERFACES_COUNT 1
-
-#define PIN_SPI_MISO (15)
-#define PIN_SPI_MOSI (13)
-#define PIN_SPI_SCK (12)
-
-// static const uint8_t SS = 44;
-static const uint8_t MOSI = PIN_SPI_MOSI;
-static const uint8_t MISO = PIN_SPI_MISO;
-static const uint8_t SCK = PIN_SPI_SCK;
-
-/*
- * Wire Interfaces
- */
-#define WIRE_INTERFACES_COUNT 1
-
-#define PIN_WIRE_SDA (32 + 2)
-#define PIN_WIRE_SCL (32)
-
-// CUSTOM GPIOs the SX1262
-#define USE_SX1262
-#define SX126X_CS (0 + 10) // FIXME - we really should define LORA_CS instead
-#define SX126X_DIO1 (0 + 20)
-#define SX1262_DIO2 (0 + 26)
-#define SX126X_BUSY (0 + 19)
-#define SX126X_RESET (0 + 17)
-#define SX126X_TXEN (0 + 24)
-#define SX126X_RXEN (0 + 22)
-// Not really an E22 but this board clones using DIO3 for tcxo control
-#define SX126X_DIO3_TCXO_VOLTAGE 1.8
-
-// FIXME, to prevent burning out parts I've set the power level super low, because I don't have
-// an antenna wired up
-#define SX126X_MAX_POWER 1
-
-#define LORA_DISABLE_SENDING // Define this to disable transmission for testing (power testing etc...)
-
-// To debug via the segger JLINK console rather than the CDC-ACM serial device
-// #define USE_SEGGER
-
-#ifdef __cplusplus
-}
-#endif
-
-/*----------------------------------------------------------------------------
- * Arduino objects - C++ only
- *----------------------------------------------------------------------------*/
diff --git a/version.properties b/version.properties
index f6a385c9f..df7ba70c7 100644
--- a/version.properties
+++ b/version.properties
@@ -1,4 +1,4 @@
[VERSION]
major = 2
minor = 5
-build = 5
+build = 6