diff --git a/.github/workflows/main_matrix.yml b/.github/workflows/main_matrix.yml
index 6b6ff1ad7..8b28090ca 100644
--- a/.github/workflows/main_matrix.yml
+++ b/.github/workflows/main_matrix.yml
@@ -66,6 +66,7 @@ jobs:
- board: tlora-v2-1-1_6
- board: tlora-v2-1-1_8
- board: tbeam
+ - board: heltec-ht62-esp32c3-sx1262
- board: heltec-v1
- board: heltec-v2_0
- board: heltec-v2_1
@@ -123,7 +124,9 @@ jobs:
matrix:
include:
- board: pico
+ - board: picow
- board: rak11310
+ - board: senselora_rp2040
uses: ./.github/workflows/build_rpi2040.yml
with:
board: ${{ matrix.board }}
@@ -210,6 +213,9 @@ jobs:
repository: ${{github.event.pull_request.head.repo.full_name}}
gather-artifacts:
+ permissions:
+ contents: write
+ pull-requests: write
runs-on: ubuntu-latest
needs:
[
@@ -283,14 +289,13 @@ jobs:
- name: Create request artifacts
continue-on-error: true # FIXME: Why are we getting 502, but things still work?
if: ${{ github.event_name == 'pull_request_target' || github.event_name == 'pull_request' }}
- uses: gavv/pull-request-artifacts@v1.1.0
+ uses: gavv/pull-request-artifacts@v2.1.0
with:
commit: ${{ (github.event.pull_request_target || github.event.pull_request).head.sha }}
repo-token: ${{ secrets.GITHUB_TOKEN }}
artifacts-token: ${{ secrets.ARTIFACTS_TOKEN }}
artifacts-repo: meshtastic/artifacts
artifacts-branch: device
- artifacts-dir: pr
artifacts: ./firmware-${{ steps.version.outputs.version }}.zip
release-artifacts:
diff --git a/.trunk/trunk.yaml b/.trunk/trunk.yaml
index e31b026f4..81a35f8f1 100644
--- a/.trunk/trunk.yaml
+++ b/.trunk/trunk.yaml
@@ -1,25 +1,24 @@
version: 0.1
cli:
- version: 1.17.1
+ version: 1.17.2
plugins:
sources:
- id: trunk
- ref: v1.2.6
+ ref: v1.3.0
uri: https://github.com/trunk-io/plugins
lint:
enabled:
- bandit@1.7.5
- - checkov@3.0.16
- - terrascan@1.18.3
- - trivy@0.46.1
- - trufflehog@3.62.1
+ - checkov@3.1.9
+ - terrascan@1.18.5
+ - trivy@0.47.0
+ #- trufflehog@3.63.2-rc0
- taplo@0.8.1
- - ruff@0.1.3
- - yamllint@1.32.0
+ - ruff@0.1.6
- isort@5.12.0
- markdownlint@0.37.0
- oxipng@9.0.0
- - svgo@3.0.2
+ - svgo@3.0.5
- actionlint@1.6.26
- flake8@6.1.0
- hadolint@2.12.0
@@ -27,9 +26,9 @@ lint:
- shellcheck@0.9.0
- black@23.9.1
- git-diff-check
- - gitleaks@8.18.0
+ - gitleaks@8.18.1
- clang-format@16.0.3
- - prettier@3.0.3
+ - prettier@3.1.0
runtimes:
enabled:
- python@3.10.8
diff --git a/arch/esp32/esp32.ini b/arch/esp32/esp32.ini
index db4b8e0b5..1f28ba6df 100644
--- a/arch/esp32/esp32.ini
+++ b/arch/esp32/esp32.ini
@@ -39,7 +39,6 @@ lib_deps =
${environmental_base.lib_deps}
https://github.com/meshtastic/esp32_https_server.git#23665b3adc080a311dcbb586ed5941b5f94d6ea2
h2zero/NimBLE-Arduino@^1.4.1
- jgromes/RadioLib@^6.2.0
https://github.com/lewisxhe/XPowersLib.git#84b7373faea3118b6c37954d52f98b8a337148d6
https://github.com/meshtastic/ESP32_Codec2.git#633326c78ac251c059ab3a8c430fcdf25b41672f
diff --git a/arch/nrf52/nrf52.ini b/arch/nrf52/nrf52.ini
index 1a3631420..04ca89a54 100644
--- a/arch/nrf52/nrf52.ini
+++ b/arch/nrf52/nrf52.ini
@@ -11,11 +11,10 @@ build_flags =
-Isrc/platform/nrf52
build_src_filter =
- ${arduino_base.build_src_filter} - - - - - - - -
+ ${arduino_base.build_src_filter} - - - - - - - - -
lib_deps=
${arduino_base.lib_deps}
- jgromes/RadioLib@^6.2.0
lib_ignore =
BluetoothOTA
\ No newline at end of file
diff --git a/arch/portduino/portduino.ini b/arch/portduino/portduino.ini
index 8b4ab5d4b..5933850e7 100644
--- a/arch/portduino/portduino.ini
+++ b/arch/portduino/portduino.ini
@@ -10,6 +10,7 @@ build_src_filter =
-
-
-
+ -
-
-
-
@@ -22,7 +23,6 @@ lib_deps =
${env.lib_deps}
${networking_base.lib_deps}
rweather/Crypto@^0.4.0
- jgromes/RadioLib@^6.1.0
build_flags =
${arduino_base.build_flags}
diff --git a/arch/rp2040/rp2040.ini b/arch/rp2040/rp2040.ini
index 38acde1e0..48fe0dae6 100644
--- a/arch/rp2040/rp2040.ini
+++ b/arch/rp2040/rp2040.ini
@@ -1,8 +1,8 @@
; Common settings for rp2040 Processor based targets
[rp2040_base]
-platform = https://github.com/maxgerhardt/platform-raspberrypi.git#0c33219f53faa035e188925ea1324f472e8b93d2
+platform = https://github.com/maxgerhardt/platform-raspberrypi.git#612de5399d68b359053f1307ed223d400aea975c
extends = arduino_base
-platform_packages = framework-arduinopico@https://github.com/earlephilhower/arduino-pico.git#3.2.2
+platform_packages = framework-arduinopico@https://github.com/earlephilhower/arduino-pico.git#3.6.2
board_build.core = earlephilhower
board_build.filesystem_size = 0.5m
@@ -12,7 +12,7 @@ build_flags =
-D__PLAT_RP2040__
# -D _POSIX_THREADS
build_src_filter =
- ${arduino_base.build_src_filter} - - - - - - - -
+ ${arduino_base.build_src_filter} - - - - - - - -
lib_ignore =
BluetoothOTA
@@ -20,5 +20,4 @@ lib_ignore =
lib_deps =
${arduino_base.lib_deps}
${environmental_base.lib_deps}
- jgromes/RadioLib@^6.2.0
rweather/Crypto
\ No newline at end of file
diff --git a/arch/stm32/stm32wl5e.ini b/arch/stm32/stm32wl5e.ini
index f563eec18..4483ff526 100644
--- a/arch/stm32/stm32wl5e.ini
+++ b/arch/stm32/stm32wl5e.ini
@@ -13,17 +13,16 @@ build_flags =
-DVECT_TAB_OFFSET=0x08000000
build_src_filter =
- ${arduino_base.build_src_filter} - - - - - - - - - - - -
+ ${arduino_base.build_src_filter} - - - - - - - - - - - - -
board_upload.offset_address = 0x08000000
upload_protocol = stlink
lib_deps =
${env.lib_deps}
- jgromes/RadioLib@^6.2.0
https://github.com/kokke/tiny-AES-c.git#f06ac37fc31dfdaca2e0d9bec83f90d5663c319b
https://github.com/littlefs-project/littlefs.git#v2.5.1
https://github.com/stm32duino/STM32FreeRTOS.git#10.3.1
lib_ignore =
- https://github.com/mathertel/OneButton#2.1.0
\ No newline at end of file
+ mathertel/OneButton
\ No newline at end of file
diff --git a/platformio.ini b/platformio.ini
index 451fe3f1a..d7ad05337 100644
--- a/platformio.ini
+++ b/platformio.ini
@@ -68,8 +68,9 @@ build_flags = -Wno-missing-field-initializers
monitor_speed = 115200
lib_deps =
+ jgromes/RadioLib@^6.3.0
https://github.com/meshtastic/esp8266-oled-ssd1306.git#b38094e03dfa964fbc0e799bc374e91a605c1223 ; ESP8266_SSD1306
- https://github.com/mathertel/OneButton#2.1.0 ; OneButton library for non-blocking button debounce
+ mathertel/OneButton@^2.5.0 ; OneButton library for non-blocking button debounce
https://github.com/meshtastic/arduino-fsm.git#7db3702bf0cfe97b783d6c72595e3f38e0b19159
https://github.com/meshtastic/TinyGPSPlus.git#076e8d2c8fb702d9be5b08c55b93ff76f8af7e61
https://github.com/meshtastic/ArduinoThread.git#72921ac222eed6f526ba1682023cee290d9aa1b3
diff --git a/protobufs b/protobufs
index 9148427a3..a34b2c680 160000
--- a/protobufs
+++ b/protobufs
@@ -1 +1 @@
-Subproject commit 9148427a3be535c9e3f17e846ecbb64ce04b6521
+Subproject commit a34b2c680e2c1c240643c515e57c5532b29c91a7
diff --git a/src/Power.cpp b/src/Power.cpp
index 0a56a1ba2..0fa97b7f0 100644
--- a/src/Power.cpp
+++ b/src/Power.cpp
@@ -435,7 +435,7 @@ void Power::shutdown()
ledOff(PIN_LED2);
#endif
#ifdef PIN_LED3
- ledOff(PIN_LED2);
+ ledOff(PIN_LED3);
#endif
doDeepSleep(DELAY_FOREVER, false);
#endif
@@ -897,4 +897,4 @@ bool Power::axpChipInit()
#else
return false;
#endif
-}
\ No newline at end of file
+}
diff --git a/src/PowerFSMThread.h b/src/PowerFSMThread.h
index 541522f43..b757f3abb 100644
--- a/src/PowerFSMThread.h
+++ b/src/PowerFSMThread.h
@@ -33,7 +33,7 @@ class PowerFSMThread : public OSThread
powerFSM.trigger(EVENT_SHUTDOWN);
}
- return 10;
+ return 100;
}
};
diff --git a/src/gps/GPS.cpp b/src/gps/GPS.cpp
index 7ea36c860..d5cd9b682 100644
--- a/src/gps/GPS.cpp
+++ b/src/gps/GPS.cpp
@@ -293,7 +293,7 @@ bool GPS::setup()
gnssModel = GNSS_MODEL_UNKNOWN;
}
#else
- gnssModel = GNSS_MODEL_UC6850;
+ gnssModel = GNSS_MODEL_UC6580;
#endif
if (gnssModel == GNSS_MODEL_MTK) {
@@ -311,11 +311,23 @@ bool GPS::setup()
// Switch to Vehicle Mode, since SoftRF enables Aviation < 2g
_serial_gps->write("$PCAS11,3*1E\r\n");
delay(250);
- } else if (gnssModel == GNSS_MODEL_UC6850) {
-
- // use GPS + GLONASS
- _serial_gps->write("$CFGSYS,h15\r\n");
+ } else if (gnssModel == GNSS_MODEL_UC6580) {
+ // The Unicore UC6580 can use a lot of sat systems, enable it to
+ // use GPS L1 & L5 + BDS B1I & B2a + GLONASS L1 + GALILEO E1 & E5a + SBAS
+ // This will reset the receiver, so wait a bit afterwards
+ // The paranoid will wait for the OK*04 confirmation response after each command.
+ _serial_gps->write("$CFGSYS,h25155\r\n");
+ delay(750);
+ // Must be done after the CFGSYS command
+ // Turn off GSV messages, we don't really care about which and where the sats are, maybe someday.
+ _serial_gps->write("$CFGMSG,0,3,0\r\n");
delay(250);
+ // Turn off NOTICE __TXT messages, these may provide Unicore some info but we don't care.
+ _serial_gps->write("$CFGMSG,6,0,0\r\n");
+ delay(250);
+ _serial_gps->write("$CFGMSG,6,1,0\r\n");
+ delay(250);
+
} else if (gnssModel == GNSS_MODEL_UBLOX) {
// Configure GNSS system to GPS+SBAS+GLONASS (Module may restart after this command)
// We need set it because by default it is GPS only, and we want to use GLONASS too
@@ -495,14 +507,14 @@ void GPS::setGPSPower(bool on, bool standbyOnly, uint32_t sleepTime)
#ifdef PIN_GPS_STANDBY // Specifically the standby pin for L76K and clones
if (on) {
LOG_INFO("Waking GPS");
- digitalWrite(PIN_GPS_STANDBY, 1);
pinMode(PIN_GPS_STANDBY, OUTPUT);
+ digitalWrite(PIN_GPS_STANDBY, 1);
return;
} else {
LOG_INFO("GPS entering sleep");
// notifyGPSSleep.notifyObservers(NULL);
- digitalWrite(PIN_GPS_STANDBY, 0);
pinMode(PIN_GPS_STANDBY, OUTPUT);
+ digitalWrite(PIN_GPS_STANDBY, 0);
return;
}
#endif
@@ -920,8 +932,8 @@ GPS *GPS::createGps()
if (_en_gpio != 0) {
LOG_DEBUG("Setting %d to output.\n", _en_gpio);
- digitalWrite(_en_gpio, !GPS_EN_ACTIVE);
pinMode(_en_gpio, OUTPUT);
+ digitalWrite(_en_gpio, !GPS_EN_ACTIVE);
}
#ifdef PIN_GPS_PPS
@@ -941,8 +953,8 @@ GPS *GPS::createGps()
new_gps->setGPSPower(true, false, 0);
#ifdef PIN_GPS_RESET
- digitalWrite(PIN_GPS_RESET, GPS_RESET_MODE); // assert for 10ms
pinMode(PIN_GPS_RESET, OUTPUT);
+ digitalWrite(PIN_GPS_RESET, GPS_RESET_MODE); // assert for 10ms
delay(10);
digitalWrite(PIN_GPS_RESET, !GPS_RESET_MODE);
#endif
@@ -987,8 +999,8 @@ bool GPS::factoryReset()
{
#ifdef PIN_GPS_REINIT
// The L76K GNSS on the T-Echo requires the RESET pin to be pulled LOW
- digitalWrite(PIN_GPS_REINIT, 0);
pinMode(PIN_GPS_REINIT, OUTPUT);
+ digitalWrite(PIN_GPS_REINIT, 0);
delay(150); // The L76K datasheet calls for at least 100MS delay
digitalWrite(PIN_GPS_REINIT, 1);
#endif
@@ -1268,4 +1280,4 @@ int32_t GPS::disable()
setAwake(false);
return INT32_MAX;
-}
\ No newline at end of file
+}
diff --git a/src/gps/GPS.h b/src/gps/GPS.h
index d52c79182..4cbdae06b 100644
--- a/src/gps/GPS.h
+++ b/src/gps/GPS.h
@@ -23,7 +23,7 @@ struct uBloxGnssModelInfo {
typedef enum {
GNSS_MODEL_MTK,
GNSS_MODEL_UBLOX,
- GNSS_MODEL_UC6850,
+ GNSS_MODEL_UC6580,
GNSS_MODEL_UNKNOWN,
} GnssModel_t;
diff --git a/src/gps/RTC.cpp b/src/gps/RTC.cpp
index ef438a7dd..10e9e0331 100644
--- a/src/gps/RTC.cpp
+++ b/src/gps/RTC.cpp
@@ -152,7 +152,7 @@ bool perhapsSetRTC(RTCQuality q, const struct timeval *tv)
#endif
// nrf52 doesn't have a readable RTC (yet - software not written)
-#ifdef HAS_RTC
+#if HAS_RTC
readFromRTC();
#endif
@@ -208,4 +208,4 @@ uint32_t getTime()
uint32_t getValidTime(RTCQuality minQuality)
{
return (currentQuality >= minQuality) ? getTime() : 0;
-}
\ No newline at end of file
+}
diff --git a/src/graphics/EInkDisplay2.cpp b/src/graphics/EInkDisplay2.cpp
index 61d0eea5a..3b97dd723 100644
--- a/src/graphics/EInkDisplay2.cpp
+++ b/src/graphics/EInkDisplay2.cpp
@@ -46,7 +46,7 @@
#define TECHO_DISPLAY_MODEL GxEPD2_154_M09
#elif defined(HELTEC_WIRELESS_PAPER)
-//#define TECHO_DISPLAY_MODEL GxEPD2_213_T5D
+// #define TECHO_DISPLAY_MODEL GxEPD2_213_T5D
#define TECHO_DISPLAY_MODEL GxEPD2_213_BN
#endif
@@ -193,14 +193,14 @@ bool EInkDisplay::connect()
LOG_INFO("Doing EInk init\n");
#ifdef PIN_EINK_PWR_ON
- digitalWrite(PIN_EINK_PWR_ON, HIGH); // If we need to assert a pin to power external peripherals
pinMode(PIN_EINK_PWR_ON, OUTPUT);
+ digitalWrite(PIN_EINK_PWR_ON, HIGH); // If we need to assert a pin to power external peripherals
#endif
#ifdef PIN_EINK_EN
// backlight power, HIGH is backlight on, LOW is off
- digitalWrite(PIN_EINK_EN, LOW);
pinMode(PIN_EINK_EN, OUTPUT);
+ digitalWrite(PIN_EINK_EN, LOW);
#endif
#if defined(TTGO_T_ECHO)
diff --git a/src/graphics/Screen.cpp b/src/graphics/Screen.cpp
index 2e144e41a..417a6e454 100644
--- a/src/graphics/Screen.cpp
+++ b/src/graphics/Screen.cpp
@@ -43,9 +43,12 @@ along with this program. If not, see .
#include "sleep.h"
#include "target_specific.h"
+#if HAS_WIFI && !defined(ARCH_RASPBERRY_PI)
+#include "mesh/wifi/WiFiAPClient.h"
+#endif
+
#ifdef ARCH_ESP32
#include "esp_task_wdt.h"
-#include "mesh/http/WiFiAPClient.h"
#include "modules/esp32/StoreForwardModule.h"
#endif
@@ -1294,7 +1297,7 @@ void Screen::setFrames()
// call a method on debugInfoScreen object (for more details)
normalFrames[numframes++] = &Screen::drawDebugInfoSettingsTrampoline;
-#ifdef ARCH_ESP32
+#if HAS_WIFI && !defined(ARCH_RASPBERRY_PI)
if (isWifiAvailable()) {
// call a method on debugInfoScreen object (for more details)
normalFrames[numframes++] = &Screen::drawDebugInfoWiFiTrampoline;
@@ -1618,12 +1621,19 @@ void DebugInfo::drawFrameWiFi(OLEDDisplay *display, OLEDDisplayUiState *state, i
display->drawString(x, y + FONT_HEIGHT_SMALL * 1, "Connection Failed");
} else if (WiFi.status() == WL_IDLE_STATUS) {
display->drawString(x, y + FONT_HEIGHT_SMALL * 1, "Idle ... Reconnecting");
- } else {
+ }
+#ifdef ARCH_ESP32
+ else {
// Codes:
// https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/wifi.html#wi-fi-reason-code
display->drawString(x, y + FONT_HEIGHT_SMALL * 1,
WiFi.disconnectReasonName(static_cast(getWifiDisconnectReason())));
}
+#else
+ else {
+ display->drawString(x, y + FONT_HEIGHT_SMALL * 1, "Unkown status: " + String(WiFi.status()));
+ }
+#endif
display->drawString(x, y + FONT_HEIGHT_SMALL * 2, "SSID: " + String(wifiName));
diff --git a/src/graphics/TFTDisplay.cpp b/src/graphics/TFTDisplay.cpp
index 63db8120a..618880a5c 100644
--- a/src/graphics/TFTDisplay.cpp
+++ b/src/graphics/TFTDisplay.cpp
@@ -478,8 +478,8 @@ bool TFTDisplay::connect()
LOG_INFO("Doing TFT init\n");
#ifdef TFT_BL
- digitalWrite(TFT_BL, TFT_BACKLIGHT_ON);
pinMode(TFT_BL, OUTPUT);
+ digitalWrite(TFT_BL, TFT_BACKLIGHT_ON);
// pinMode(PIN_3V3_EN, OUTPUT);
// digitalWrite(PIN_3V3_EN, HIGH);
LOG_INFO("Power to TFT Backlight\n");
@@ -487,11 +487,11 @@ bool TFTDisplay::connect()
#ifdef ST7735_BACKLIGHT_EN_V03
if (heltec_version == 3) {
- digitalWrite(ST7735_BACKLIGHT_EN_V03, TFT_BACKLIGHT_ON);
pinMode(ST7735_BACKLIGHT_EN_V03, OUTPUT);
+ digitalWrite(ST7735_BACKLIGHT_EN_V03, TFT_BACKLIGHT_ON);
} else {
- digitalWrite(ST7735_BACKLIGHT_EN_V05, TFT_BACKLIGHT_ON);
pinMode(ST7735_BACKLIGHT_EN_V05, OUTPUT);
+ digitalWrite(ST7735_BACKLIGHT_EN_V05, TFT_BACKLIGHT_ON);
}
#endif
@@ -515,4 +515,4 @@ bool TFTDisplay::connect()
return true;
}
-#endif
\ No newline at end of file
+#endif
diff --git a/src/main.cpp b/src/main.cpp
index 5cea142bc..c8fc61e4c 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -32,9 +32,6 @@
#include
// #include
-#include "mesh/eth/ethClient.h"
-#include "mesh/http/WiFiAPClient.h"
-
#ifdef ARCH_ESP32
#include "mesh/http/WebServer.h"
#include "nimble/NimbleBluetooth.h"
@@ -48,10 +45,12 @@ NRF52Bluetooth *nrf52Bluetooth;
#if HAS_WIFI
#include "mesh/api/WiFiServerAPI.h"
+#include "mesh/wifi/WiFiAPClient.h"
#endif
#if HAS_ETHERNET
#include "mesh/api/ethServerAPI.h"
+#include "mesh/eth/ethClient.h"
#endif
#include "mqtt/MQTT.h"
@@ -433,6 +432,10 @@ void setup()
auto i2cCount = i2cScanner->countDevices();
if (i2cCount == 0) {
LOG_INFO("No I2C devices found\n");
+ Wire.end();
+#ifdef I2C_SDA1
+ Wire1.end();
+#endif
} else {
LOG_INFO("%i I2C devices found\n", i2cCount);
}
@@ -577,10 +580,13 @@ void setup()
// but we need to do this after main cpu init (esp32setup), because we need the random seed set
nodeDB.init();
- // If we're taking on the repeater role, use flood router
- if (config.device.role == meshtastic_Config_DeviceConfig_Role_REPEATER)
+ // If we're taking on the repeater role, use flood router and turn off 3V3_S rail because peripherals are not needed
+ if (config.device.role == meshtastic_Config_DeviceConfig_Role_REPEATER) {
router = new FloodingRouter();
- else
+#ifdef PIN_3V3_EN
+ digitalWrite(PIN_3V3_EN, LOW);
+#endif
+ } else
router = new ReliableRouter();
#if HAS_BUTTON || defined(ARCH_RASPBERRY_PI)
@@ -654,7 +660,10 @@ void setup()
readFromRTC(); // read the main CPU RTC at first (in case we can't get GPS time)
- gps = GPS::createGps();
+ // If we're taking on the repeater role, ignore GPS
+ if (config.device.role != meshtastic_Config_DeviceConfig_Role_REPEATER) {
+ gps = GPS::createGps();
+ }
if (gps) {
gpsStatus->observe(&gps->newStatus);
} else {
@@ -835,11 +844,15 @@ void setup()
#ifndef ARCH_PORTDUINO
// Initialize Wifi
+#if HAS_WIFI
initWifi();
+#endif
+#if HAS_ETHERNET
// Initialize Ethernet
initEthernet();
#endif
+#endif
#ifdef ARCH_ESP32
// Start web server thread.
diff --git a/src/mesh/MeshService.cpp b/src/mesh/MeshService.cpp
index 44094f1bb..4fd9523c0 100644
--- a/src/mesh/MeshService.cpp
+++ b/src/mesh/MeshService.cpp
@@ -320,7 +320,9 @@ meshtastic_NodeInfoLite *MeshService::refreshLocalMeshNode()
position.time = getValidTime(RTCQualityFromNet);
- updateBatteryLevel(powerStatus->getBatteryChargePercent());
+ if (powerStatus->getHasBattery() == 1) {
+ updateBatteryLevel(powerStatus->getBatteryChargePercent());
+ }
return node;
}
diff --git a/src/mesh/NodeDB.cpp b/src/mesh/NodeDB.cpp
index 59b6e4bf1..9c623d973 100644
--- a/src/mesh/NodeDB.cpp
+++ b/src/mesh/NodeDB.cpp
@@ -21,7 +21,7 @@
#include
#ifdef ARCH_ESP32
-#include "mesh/http/WiFiAPClient.h"
+#include "mesh/wifi/WiFiAPClient.h"
#include "modules/esp32/StoreForwardModule.h"
#include
#include
@@ -248,6 +248,12 @@ void NodeDB::installDefaultModuleConfig()
#ifdef T_WATCH_S3
// Don't worry about the other settings, we'll use the DRV2056 behavior for notifications
moduleConfig.external_notification.enabled = true;
+#endif
+#ifdef NANO_G2_ULTRA
+ moduleConfig.external_notification.enabled = true;
+ moduleConfig.external_notification.alert_message = true;
+ moduleConfig.external_notification.output_ms = 100;
+ moduleConfig.external_notification.active = true;
#endif
moduleConfig.has_canned_message = true;
@@ -296,6 +302,15 @@ void NodeDB::installRoleDefaults(meshtastic_Config_DeviceConfig_Role role)
(meshtastic_Config_PositionConfig_PositionFlags_ALTITUDE | meshtastic_Config_PositionConfig_PositionFlags_SPEED |
meshtastic_Config_PositionConfig_PositionFlags_HEADING | meshtastic_Config_PositionConfig_PositionFlags_DOP);
moduleConfig.telemetry.device_update_interval = ONE_DAY;
+ } else if (role == meshtastic_Config_DeviceConfig_Role_CLIENT_HIDDEN) {
+ config.device.rebroadcast_mode = meshtastic_Config_DeviceConfig_RebroadcastMode_LOCAL_ONLY;
+ config.device.node_info_broadcast_secs = UINT32_MAX;
+ config.position.position_broadcast_smart_enabled = false;
+ config.position.position_broadcast_secs = UINT32_MAX;
+ moduleConfig.neighbor_info.update_interval = UINT32_MAX;
+ moduleConfig.telemetry.device_update_interval = UINT32_MAX;
+ moduleConfig.telemetry.environment_update_interval = UINT32_MAX;
+ moduleConfig.telemetry.air_quality_interval = UINT32_MAX;
}
}
diff --git a/src/mesh/Router.cpp b/src/mesh/Router.cpp
index b2d8d585d..ff657fd11 100644
--- a/src/mesh/Router.cpp
+++ b/src/mesh/Router.cpp
@@ -299,6 +299,12 @@ bool perhapsDecode(meshtastic_MeshPacket *p)
config.device.rebroadcast_mode == meshtastic_Config_DeviceConfig_RebroadcastMode_ALL_SKIP_DECODING)
return false;
+ if (config.device.rebroadcast_mode == meshtastic_Config_DeviceConfig_RebroadcastMode_KNOWN_ONLY &&
+ !nodeDB.getMeshNode(p->from)->has_user) {
+ LOG_DEBUG("Node 0x%x not in NodeDB. Rebroadcast mode KNOWN_ONLY will ignore packet\n", p->from);
+ return false;
+ }
+
if (p->which_payload_variant == meshtastic_MeshPacket_decoded_tag)
return true; // If packet was already decoded just return
diff --git a/src/mesh/SX126xInterface.cpp b/src/mesh/SX126xInterface.cpp
index 30951cd16..0692d1ef1 100644
--- a/src/mesh/SX126xInterface.cpp
+++ b/src/mesh/SX126xInterface.cpp
@@ -26,8 +26,8 @@ SX126xInterface::SX126xInterface(LockingArduinoHal *hal, RADIOLIB_PIN_TYPE cs
template bool SX126xInterface::init()
{
#ifdef SX126X_POWER_EN
- digitalWrite(SX126X_POWER_EN, HIGH);
pinMode(SX126X_POWER_EN, OUTPUT);
+ digitalWrite(SX126X_POWER_EN, HIGH);
#endif
// FIXME: correct logic to default to not using TCXO if no voltage is specified for SX126X_DIO3_TCXO_VOLTAGE
diff --git a/src/mesh/SX128xInterface.cpp b/src/mesh/SX128xInterface.cpp
index 1916c8042..0c5c4dcfa 100644
--- a/src/mesh/SX128xInterface.cpp
+++ b/src/mesh/SX128xInterface.cpp
@@ -22,8 +22,8 @@ SX128xInterface::SX128xInterface(LockingArduinoHal *hal, RADIOLIB_PIN_TYPE cs
template bool SX128xInterface::init()
{
#ifdef SX128X_POWER_EN
- digitalWrite(SX128X_POWER_EN, HIGH);
pinMode(SX128X_POWER_EN, OUTPUT);
+ digitalWrite(SX128X_POWER_EN, HIGH);
#endif
#ifdef RF95_FAN_EN
@@ -32,12 +32,12 @@ template bool SX128xInterface::init()
#endif
#if defined(SX128X_RXEN) && (SX128X_RXEN != RADIOLIB_NC) // set not rx or tx mode
- digitalWrite(SX128X_RXEN, LOW); // Set low before becoming an output
pinMode(SX128X_RXEN, OUTPUT);
+ digitalWrite(SX128X_RXEN, LOW); // Set low before becoming an output
#endif
#if defined(SX128X_TXEN) && (SX128X_TXEN != RADIOLIB_NC)
- digitalWrite(SX128X_TXEN, LOW);
pinMode(SX128X_TXEN, OUTPUT);
+ digitalWrite(SX128X_TXEN, LOW);
#endif
RadioLibInterface::init();
diff --git a/src/mesh/api/WiFiServerAPI.h b/src/mesh/api/WiFiServerAPI.h
index 11b494d23..e436a177d 100644
--- a/src/mesh/api/WiFiServerAPI.h
+++ b/src/mesh/api/WiFiServerAPI.h
@@ -22,4 +22,4 @@ class WiFiServerPort : public APIServerPort
explicit WiFiServerPort(int port);
};
-void initApiServer(int port = 4403);
+void initApiServer(int port = 4403);
\ No newline at end of file
diff --git a/src/mesh/generated/meshtastic/config.pb.h b/src/mesh/generated/meshtastic/config.pb.h
index 53e92a948..8406dc887 100644
--- a/src/mesh/generated/meshtastic/config.pb.h
+++ b/src/mesh/generated/meshtastic/config.pb.h
@@ -43,7 +43,18 @@ typedef enum _meshtastic_Config_DeviceConfig_Role {
Used for nodes dedicated for connection to an ATAK EUD.
Turns off many of the routine broadcasts to favor CoT packet stream
from the Meshtastic ATAK plugin -> IMeshService -> Node */
- meshtastic_Config_DeviceConfig_Role_TAK = 7
+ meshtastic_Config_DeviceConfig_Role_TAK = 7,
+ /* Client Hidden device role
+ Used for nodes that "only speak when spoken to"
+ Turns all of the routine broadcasts but allows for ad-hoc communication
+ Still rebroadcasts, but with local only rebroadcast mode (known meshes only)
+ Can be used for clandestine operation or to dramatically reduce airtime / power consumption */
+ meshtastic_Config_DeviceConfig_Role_CLIENT_HIDDEN = 8,
+ /* Lost and Found device role
+ Used to automatically send a text message to the mesh
+ with the current position of the device on a frequent interval:
+ "I'm lost! Position: lat / long" */
+ meshtastic_Config_DeviceConfig_Role_LOST_AND_FOUND = 9
} meshtastic_Config_DeviceConfig_Role;
/* Defines the device's behavior for how messages are rebroadcast */
@@ -56,7 +67,10 @@ typedef enum _meshtastic_Config_DeviceConfig_RebroadcastMode {
meshtastic_Config_DeviceConfig_RebroadcastMode_ALL_SKIP_DECODING = 1,
/* Ignores observed messages from foreign meshes that are open or those which it cannot decrypt.
Only rebroadcasts message on the nodes local primary / secondary channels. */
- meshtastic_Config_DeviceConfig_RebroadcastMode_LOCAL_ONLY = 2
+ meshtastic_Config_DeviceConfig_RebroadcastMode_LOCAL_ONLY = 2,
+ /* Ignores observed messages from foreign meshes like LOCAL_ONLY,
+ but takes it step further by also ignoring messages from nodenums not in the node's known list (NodeDB) */
+ meshtastic_Config_DeviceConfig_RebroadcastMode_KNOWN_ONLY = 3
} meshtastic_Config_DeviceConfig_RebroadcastMode;
/* Bit field of boolean configuration options, indicating which optional
@@ -479,12 +493,12 @@ extern "C" {
/* Helper constants for enums */
#define _meshtastic_Config_DeviceConfig_Role_MIN meshtastic_Config_DeviceConfig_Role_CLIENT
-#define _meshtastic_Config_DeviceConfig_Role_MAX meshtastic_Config_DeviceConfig_Role_TAK
-#define _meshtastic_Config_DeviceConfig_Role_ARRAYSIZE ((meshtastic_Config_DeviceConfig_Role)(meshtastic_Config_DeviceConfig_Role_TAK+1))
+#define _meshtastic_Config_DeviceConfig_Role_MAX meshtastic_Config_DeviceConfig_Role_LOST_AND_FOUND
+#define _meshtastic_Config_DeviceConfig_Role_ARRAYSIZE ((meshtastic_Config_DeviceConfig_Role)(meshtastic_Config_DeviceConfig_Role_LOST_AND_FOUND+1))
#define _meshtastic_Config_DeviceConfig_RebroadcastMode_MIN meshtastic_Config_DeviceConfig_RebroadcastMode_ALL
-#define _meshtastic_Config_DeviceConfig_RebroadcastMode_MAX meshtastic_Config_DeviceConfig_RebroadcastMode_LOCAL_ONLY
-#define _meshtastic_Config_DeviceConfig_RebroadcastMode_ARRAYSIZE ((meshtastic_Config_DeviceConfig_RebroadcastMode)(meshtastic_Config_DeviceConfig_RebroadcastMode_LOCAL_ONLY+1))
+#define _meshtastic_Config_DeviceConfig_RebroadcastMode_MAX meshtastic_Config_DeviceConfig_RebroadcastMode_KNOWN_ONLY
+#define _meshtastic_Config_DeviceConfig_RebroadcastMode_ARRAYSIZE ((meshtastic_Config_DeviceConfig_RebroadcastMode)(meshtastic_Config_DeviceConfig_RebroadcastMode_KNOWN_ONLY+1))
#define _meshtastic_Config_PositionConfig_PositionFlags_MIN meshtastic_Config_PositionConfig_PositionFlags_UNSET
#define _meshtastic_Config_PositionConfig_PositionFlags_MAX meshtastic_Config_PositionConfig_PositionFlags_SPEED
diff --git a/src/mesh/generated/meshtastic/mesh.pb.h b/src/mesh/generated/meshtastic/mesh.pb.h
index 59005db48..ae80b3fe5 100644
--- a/src/mesh/generated/meshtastic/mesh.pb.h
+++ b/src/mesh/generated/meshtastic/mesh.pb.h
@@ -67,6 +67,10 @@ typedef enum _meshtastic_HardwareModel {
meshtastic_HardwareModel_STATION_G1 = 25,
/* RAK11310 (RP2040 + SX1262) */
meshtastic_HardwareModel_RAK11310 = 26,
+ /* Makerfabs SenseLoRA Receiver (RP2040 + RFM96) */
+ meshtastic_HardwareModel_SENSELORA_RP2040 = 27,
+ /* Makerfabs SenseLoRA Industrial Monitor (ESP32-S3 + RFM96) */
+ meshtastic_HardwareModel_SENSELORA_S3 = 28,
/* ---------------------------------------------------------------------------
Less common/prototype boards listed here (needs one more byte over the air)
--------------------------------------------------------------------------- */
diff --git a/src/mesh/http/ContentHandler.cpp b/src/mesh/http/ContentHandler.cpp
index 2ea2a76a5..4ca37a256 100644
--- a/src/mesh/http/ContentHandler.cpp
+++ b/src/mesh/http/ContentHandler.cpp
@@ -5,7 +5,7 @@
#include "main.h"
#include "mesh/http/ContentHelper.h"
#include "mesh/http/WebServer.h"
-#include "mesh/http/WiFiAPClient.h"
+#include "mesh/wifi/WiFiAPClient.h"
#include "mqtt/JSON.h"
#include "power.h"
#include "sleep.h"
diff --git a/src/mesh/http/ContentHandler.h b/src/mesh/http/ContentHandler.h
index 903d5ee08..987e3ffef 100644
--- a/src/mesh/http/ContentHandler.h
+++ b/src/mesh/http/ContentHandler.h
@@ -1,5 +1,4 @@
#pragma once
-
void registerHandlers(HTTPServer *insecureServer, HTTPSServer *secureServer);
// Declare some handler functions for the various URLs on the server
@@ -34,4 +33,4 @@ class HttpAPI : public PhoneAPI
protected:
/// Check the current underlying physical link to see if the client is currently connected
virtual bool checkIsConnected() override { return true; } // FIXME, be smarter about this
-};
+};
\ No newline at end of file
diff --git a/src/mesh/http/ContentHelper.cpp b/src/mesh/http/ContentHelper.cpp
index 249dcbde6..8f283932b 100644
--- a/src/mesh/http/ContentHelper.cpp
+++ b/src/mesh/http/ContentHelper.cpp
@@ -1,6 +1,6 @@
#include "mesh/http/ContentHelper.h"
-//#include
-//#include "main.h"
+// #include
+// #include "main.h"
void replaceAll(std::string &str, const std::string &from, const std::string &to)
{
diff --git a/src/mesh/http/WebServer.cpp b/src/mesh/http/WebServer.cpp
index 2b045c0be..7814f2c29 100644
--- a/src/mesh/http/WebServer.cpp
+++ b/src/mesh/http/WebServer.cpp
@@ -2,7 +2,7 @@
#include "NodeDB.h"
#include "graphics/Screen.h"
#include "main.h"
-#include "mesh/http/WiFiAPClient.h"
+#include "mesh/wifi/WiFiAPClient.h"
#include "sleep.h"
#include
#include
@@ -210,4 +210,4 @@ void initWebServer()
} else {
LOG_ERROR("Web Servers Failed! ;-( \n");
}
-}
+}
\ No newline at end of file
diff --git a/src/mesh/http/WiFiAPClient.cpp b/src/mesh/wifi/WiFiAPClient.cpp
similarity index 90%
rename from src/mesh/http/WiFiAPClient.cpp
rename to src/mesh/wifi/WiFiAPClient.cpp
index cc8d4b168..1e521e033 100644
--- a/src/mesh/http/WiFiAPClient.cpp
+++ b/src/mesh/wifi/WiFiAPClient.cpp
@@ -1,17 +1,20 @@
-#include "mesh/http/WiFiAPClient.h"
+#include "mesh/wifi/WiFiAPClient.h"
#include "NodeDB.h"
#include "RTC.h"
#include "concurrency/Periodic.h"
#include "configuration.h"
#include "main.h"
#include "mesh/api/WiFiServerAPI.h"
-#include "mesh/http/WebServer.h"
#include "mqtt/MQTT.h"
#include "target_specific.h"
-#include
#include
#include
+#ifdef ARCH_ESP32
+#include "mesh/http/WebServer.h"
+#include
#include
+static void WiFiEvent(WiFiEvent_t event);
+#endif
#ifndef DISABLE_NTP
#include
@@ -19,8 +22,6 @@
using namespace concurrency;
-static void WiFiEvent(WiFiEvent_t event);
-
// NTP
WiFiUDP ntpUDP;
@@ -44,6 +45,65 @@ Syslog syslog(syslogClient);
Periodic *wifiReconnect;
+static void onNetworkConnected()
+{
+ if (!APStartupComplete) {
+ // Start web server
+ LOG_INFO("Starting network services\n");
+
+#ifdef ARCH_ESP32
+ // start mdns
+ if (!MDNS.begin("Meshtastic")) {
+ LOG_ERROR("Error setting up MDNS responder!\n");
+ } else {
+ LOG_INFO("mDNS responder started\n");
+ LOG_INFO("mDNS Host: Meshtastic.local\n");
+ MDNS.addService("http", "tcp", 80);
+ MDNS.addService("https", "tcp", 443);
+ }
+#else // ESP32 handles this in WiFiEvent
+ LOG_INFO("Obtained IP address: %s\n", WiFi.localIP().toString().c_str());
+#endif
+
+#ifndef DISABLE_NTP
+ LOG_INFO("Starting NTP time client\n");
+ timeClient.begin();
+ timeClient.setUpdateInterval(60 * 60); // Update once an hour
+#endif
+
+ if (config.network.rsyslog_server[0]) {
+ LOG_INFO("Starting Syslog client\n");
+ // Defaults
+ int serverPort = 514;
+ const char *serverAddr = config.network.rsyslog_server;
+ String server = String(serverAddr);
+ int delimIndex = server.indexOf(':');
+ if (delimIndex > 0) {
+ String port = server.substring(delimIndex + 1, server.length());
+ server[delimIndex] = 0;
+ serverPort = port.toInt();
+ serverAddr = server.c_str();
+ }
+ syslog.server(serverAddr, serverPort);
+ syslog.deviceHostname(getDeviceName());
+ syslog.appName("Meshtastic");
+ syslog.defaultPriority(LOGLEVEL_USER);
+ syslog.enable();
+ }
+
+#ifdef ARCH_ESP32
+ initWebServer();
+#endif
+ initApiServer();
+
+ APStartupComplete = true;
+ }
+
+ // FIXME this is kinda yucky, instead we should just have an observable for 'wifireconnected'
+ if (mqtt)
+ mqtt->reconnect();
+}
+
static int32_t reconnectWiFi()
{
const char *wifiName = config.network.wifi_ssid;
@@ -57,7 +117,11 @@ static int32_t reconnectWiFi()
needReconnect = false;
// Make sure we clear old connection credentials
+#ifdef ARCH_ESP32
WiFi.disconnect(false, true);
+#else
+ WiFi.disconnect(false);
+#endif
LOG_INFO("Reconnecting to WiFi access point %s\n", wifiName);
delay(5000);
@@ -87,8 +151,16 @@ static int32_t reconnectWiFi()
#endif
if (config.network.wifi_enabled && !WiFi.isConnected()) {
+#ifdef ARCH_RP2040 // (ESP32 handles this in WiFiEvent)
+ /* If APStartupComplete, but we're not connected, try again.
+ Shouldn't try again before APStartupComplete. */
+ needReconnect = APStartupComplete;
+#endif
return 1000; // check once per second
} else {
+#ifdef ARCH_RP2040
+ onNetworkConnected(); // will only do anything once
+#endif
return 300000; // every 5 minutes
}
}
@@ -109,66 +181,17 @@ void deinitWifi()
LOG_INFO("WiFi deinit\n");
if (isWifiAvailable()) {
+#ifdef ARCH_ESP32
+ WiFi.disconnect(true, false);
+#else
WiFi.disconnect(true);
- WiFi.mode(WIFI_MODE_NULL);
+#endif
+ WiFi.mode(WIFI_OFF);
LOG_INFO("WiFi Turned Off\n");
// WiFi.printDiag(Serial);
}
}
-static void onNetworkConnected()
-{
- if (!APStartupComplete) {
- // Start web server
- LOG_INFO("Starting network services\n");
-
- // start mdns
- if (!MDNS.begin("Meshtastic")) {
- LOG_ERROR("Error setting up MDNS responder!\n");
- } else {
- LOG_INFO("mDNS responder started\n");
- LOG_INFO("mDNS Host: Meshtastic.local\n");
- MDNS.addService("http", "tcp", 80);
- MDNS.addService("https", "tcp", 443);
- }
-
-#ifndef DISABLE_NTP
- LOG_INFO("Starting NTP time client\n");
- timeClient.begin();
- timeClient.setUpdateInterval(60 * 60); // Update once an hour
-#endif
-
- if (config.network.rsyslog_server[0]) {
- LOG_INFO("Starting Syslog client\n");
- // Defaults
- int serverPort = 514;
- const char *serverAddr = config.network.rsyslog_server;
- String server = String(serverAddr);
- int delimIndex = server.indexOf(':');
- if (delimIndex > 0) {
- String port = server.substring(delimIndex + 1, server.length());
- server[delimIndex] = 0;
- serverPort = port.toInt();
- serverAddr = server.c_str();
- }
- syslog.server(serverAddr, serverPort);
- syslog.deviceHostname(getDeviceName());
- syslog.appName("Meshtastic");
- syslog.defaultPriority(LOGLEVEL_USER);
- syslog.enable();
- }
-
- initWebServer();
- initApiServer();
-
- APStartupComplete = true;
- }
-
- // FIXME this is kinda yucky, instead we should just have an observable for 'wifireconnected'
- if (mqtt)
- mqtt->reconnect();
-}
-
// Startup WiFi
bool initWifi()
{
@@ -177,10 +200,10 @@ bool initWifi()
const char *wifiName = config.network.wifi_ssid;
const char *wifiPsw = config.network.wifi_psk;
- createSSLCert();
-
+#ifndef ARCH_RP2040
+ createSSLCert(); // For WebServer
esp_wifi_set_storage(WIFI_STORAGE_RAM); // Disable flash storage for WiFi credentials
-
+#endif
if (!*wifiPsw) // Treat empty password as no password
wifiPsw = NULL;
@@ -189,17 +212,17 @@ bool initWifi()
getMacAddr(dmac);
snprintf(ourHost, sizeof(ourHost), "Meshtastic-%02x%02x", dmac[4], dmac[5]);
- WiFi.mode(WIFI_MODE_STA);
+ WiFi.mode(WIFI_STA);
WiFi.setHostname(ourHost);
- WiFi.onEvent(WiFiEvent);
- WiFi.setAutoReconnect(true);
- WiFi.setSleep(false);
if (config.network.address_mode == meshtastic_Config_NetworkConfig_AddressMode_STATIC &&
config.network.ipv4_config.ip != 0) {
WiFi.config(config.network.ipv4_config.ip, config.network.ipv4_config.gateway, config.network.ipv4_config.subnet,
- config.network.ipv4_config.dns,
- config.network.ipv4_config.dns); // Wifi wants two DNS servers... set both to the same value
+ config.network.ipv4_config.dns);
}
+#ifndef ARCH_RP2040
+ WiFi.onEvent(WiFiEvent);
+ WiFi.setAutoReconnect(true);
+ WiFi.setSleep(false);
// This is needed to improve performance.
esp_wifi_set_ps(WIFI_PS_NONE); // Disable radio power saving
@@ -218,7 +241,7 @@ bool initWifi()
wifiDisconnectReason = info.wifi_sta_disconnected.reason;
},
WiFiEvent_t::ARDUINO_EVENT_WIFI_STA_DISCONNECTED);
-
+#endif
LOG_DEBUG("JOINING WIFI soon: ssid=%s\n", wifiName);
wifiReconnect = new Periodic("WifiConnect", reconnectWiFi);
}
@@ -229,6 +252,7 @@ bool initWifi()
}
}
+#ifdef ARCH_ESP32
// Called by the Espressif SDK to
static void WiFiEvent(WiFiEvent_t event)
{
@@ -262,11 +286,11 @@ static void WiFiEvent(WiFiEvent_t event)
LOG_INFO("Authentication mode of access point has changed\n");
break;
case ARDUINO_EVENT_WIFI_STA_GOT_IP:
- LOG_INFO("Obtained IP address: ", WiFi.localIPv6());
+ LOG_INFO("Obtained IP address: %s\n", WiFi.localIP().toString().c_str());
onNetworkConnected();
break;
case ARDUINO_EVENT_WIFI_STA_GOT_IP6:
- LOG_INFO("Obtained IP6 address: %s", WiFi.localIPv6());
+ LOG_INFO("Obtained IP6 address: %s\n", WiFi.localIPv6().toString().c_str());
break;
case ARDUINO_EVENT_WIFI_STA_LOST_IP:
LOG_INFO("Lost IP address and IP address is reset to 0\n");
@@ -369,6 +393,7 @@ static void WiFiEvent(WiFiEvent_t event)
break;
}
}
+#endif
uint8_t getWifiDisconnectReason()
{
diff --git a/src/mesh/http/WiFiAPClient.h b/src/mesh/wifi/WiFiAPClient.h
similarity index 79%
rename from src/mesh/http/WiFiAPClient.h
rename to src/mesh/wifi/WiFiAPClient.h
index 0c08c567b..6625d3e46 100644
--- a/src/mesh/http/WiFiAPClient.h
+++ b/src/mesh/wifi/WiFiAPClient.h
@@ -5,7 +5,7 @@
#include
#include
-#ifdef ARCH_ESP32
+#if defined(HAS_WIFI) && !defined(ARCH_PORTDUINO)
#include
#endif
@@ -19,4 +19,4 @@ void deinitWifi();
bool isWifiAvailable();
-uint8_t getWifiDisconnectReason();
+uint8_t getWifiDisconnectReason();
\ No newline at end of file
diff --git a/src/modules/AdminModule.h b/src/modules/AdminModule.h
index eb06e7b83..6ecc88829 100644
--- a/src/modules/AdminModule.h
+++ b/src/modules/AdminModule.h
@@ -1,7 +1,7 @@
#pragma once
#include "ProtobufModule.h"
-#ifdef ARCH_ESP32
-#include "mesh/http/WiFiAPClient.h"
+#if HAS_WIFI
+#include "mesh/wifi/WiFiAPClient.h"
#endif
/**
@@ -50,4 +50,4 @@ class AdminModule : public ProtobufModule
void reboot(int32_t seconds);
};
-extern AdminModule *adminModule;
+extern AdminModule *adminModule;
\ No newline at end of file
diff --git a/src/modules/NodeInfoModule.cpp b/src/modules/NodeInfoModule.cpp
index 855ba9cde..799f6ec7c 100644
--- a/src/modules/NodeInfoModule.cpp
+++ b/src/modules/NodeInfoModule.cpp
@@ -89,7 +89,7 @@ int32_t NodeInfoModule::runOnce()
bool requestReplies = currentGeneration != radioGeneration;
currentGeneration = radioGeneration;
- if (airTime->isTxAllowedAirUtil()) {
+ if (airTime->isTxAllowedAirUtil() && config.device.role != meshtastic_Config_DeviceConfig_Role_CLIENT_HIDDEN) {
LOG_INFO("Sending our nodeinfo to mesh (wantReplies=%d)\n", requestReplies);
sendOurNodeInfo(NODENUM_BROADCAST, requestReplies); // Send our info (don't request replies)
}
diff --git a/src/modules/RoutingModule.cpp b/src/modules/RoutingModule.cpp
index d81311481..edeb1fb86 100644
--- a/src/modules/RoutingModule.cpp
+++ b/src/modules/RoutingModule.cpp
@@ -46,5 +46,6 @@ void RoutingModule::sendAckNak(meshtastic_Routing_Error err, NodeNum to, PacketI
RoutingModule::RoutingModule() : ProtobufModule("routing", meshtastic_PortNum_ROUTING_APP, &meshtastic_Routing_msg)
{
isPromiscuous = true;
- encryptedOk = config.device.rebroadcast_mode != meshtastic_Config_DeviceConfig_RebroadcastMode_LOCAL_ONLY;
+ encryptedOk = config.device.rebroadcast_mode != meshtastic_Config_DeviceConfig_RebroadcastMode_LOCAL_ONLY &&
+ config.device.rebroadcast_mode != meshtastic_Config_DeviceConfig_RebroadcastMode_KNOWN_ONLY;
}
diff --git a/src/modules/Telemetry/DeviceTelemetry.cpp b/src/modules/Telemetry/DeviceTelemetry.cpp
index bc6c03c52..a6eecda80 100644
--- a/src/modules/Telemetry/DeviceTelemetry.cpp
+++ b/src/modules/Telemetry/DeviceTelemetry.cpp
@@ -18,7 +18,8 @@ int32_t DeviceTelemetryModule::runOnce()
if (((lastSentToMesh == 0) ||
((now - lastSentToMesh) >= getConfiguredOrDefaultMs(moduleConfig.telemetry.device_update_interval))) &&
airTime->isTxAllowedChannelUtil() && airTime->isTxAllowedAirUtil() &&
- config.device.role != meshtastic_Config_DeviceConfig_Role_REPEATER) {
+ config.device.role != meshtastic_Config_DeviceConfig_Role_REPEATER &&
+ config.device.role != meshtastic_Config_DeviceConfig_Role_CLIENT_HIDDEN) {
sendTelemetry();
lastSentToMesh = now;
} else if (service.isToPhoneQueueEmpty()) {
diff --git a/src/modules/Telemetry/EnvironmentTelemetry.cpp b/src/modules/Telemetry/EnvironmentTelemetry.cpp
index 1047ade1d..9c7b406e9 100644
--- a/src/modules/Telemetry/EnvironmentTelemetry.cpp
+++ b/src/modules/Telemetry/EnvironmentTelemetry.cpp
@@ -97,9 +97,9 @@ int32_t EnvironmentTelemetryModule::runOnce()
result = lps22hbSensor.runOnce();
if (sht31Sensor.hasSensor())
result = sht31Sensor.runOnce();
- if (ina219Sensor.hasSensor() && !ina219Sensor.isInitialized())
+ if (ina219Sensor.hasSensor())
result = ina219Sensor.runOnce();
- if (ina260Sensor.hasSensor() && !ina260Sensor.isInitialized())
+ if (ina260Sensor.hasSensor())
result = ina260Sensor.runOnce();
}
return result;
diff --git a/src/mqtt/MQTT.cpp b/src/mqtt/MQTT.cpp
index 29a634922..a97aa5255 100644
--- a/src/mqtt/MQTT.cpp
+++ b/src/mqtt/MQTT.cpp
@@ -7,9 +7,9 @@
#include "mesh/Router.h"
#include "mesh/generated/meshtastic/mqtt.pb.h"
#include "mesh/generated/meshtastic/telemetry.pb.h"
-#include "mesh/http/WiFiAPClient.h"
#include "sleep.h"
#if HAS_WIFI
+#include "mesh/wifi/WiFiAPClient.h"
#include
#endif
#include "mqtt/JSON.h"
diff --git a/src/nimble/NimbleBluetooth.cpp b/src/nimble/NimbleBluetooth.cpp
index 3175e0f09..0b2a806c9 100644
--- a/src/nimble/NimbleBluetooth.cpp
+++ b/src/nimble/NimbleBluetooth.cpp
@@ -186,7 +186,7 @@ void NimbleBluetooth::setupService()
// Setup the battery service
NimBLEService *batteryService = bleServer->createService(NimBLEUUID((uint16_t)0x180f)); // 0x180F is the Battery Service
BatteryCharacteristic = batteryService->createCharacteristic( // 0x2A19 is the Battery Level characteristic)
- (uint16_t)0x2a19, NIMBLE_PROPERTY::READ | NIMBLE_PROPERTY::NOTIFY);
+ (uint16_t)0x2a19, NIMBLE_PROPERTY::READ | NIMBLE_PROPERTY::NOTIFY, 1);
NimBLE2904 *batteryLevelDescriptor = (NimBLE2904 *)BatteryCharacteristic->createDescriptor((uint16_t)0x2904);
batteryLevelDescriptor->setFormat(NimBLE2904::FORMAT_UINT8);
@@ -208,8 +208,10 @@ void NimbleBluetooth::startAdvertising()
/// Given a level between 0-100, update the BLE attribute
void updateBatteryLevel(uint8_t level)
{
- BatteryCharacteristic->setValue(&level, 1);
- BatteryCharacteristic->notify();
+ if ((config.bluetooth.enabled == true) && bleServer && nimbleBluetooth->isConnected()) {
+ BatteryCharacteristic->setValue(&level, 1);
+ BatteryCharacteristic->notify();
+ }
}
void NimbleBluetooth::clearBonds()
diff --git a/src/platform/esp32/architecture.h b/src/platform/esp32/architecture.h
index 0686aa59f..451d7ffbe 100644
--- a/src/platform/esp32/architecture.h
+++ b/src/platform/esp32/architecture.h
@@ -121,6 +121,10 @@
#define HW_VENDOR meshtastic_HardwareModel_PICOMPUTER_S3
#elif defined(HELTEC_HT62)
#define HW_VENDOR meshtastic_HardwareModel_HELTEC_HT62
+#elif defined(SENSELORA_S3)
+#define HW_VENDOR meshtastic_HardwareModel_SENSELORA_S3
+#elif defined(HELTEC_HT62)
+#define HW_VENDOR meshtastic_HardwareModel_HELTEC_HT62
#endif
// -----------------------------------------------------------------------------
diff --git a/src/platform/esp32/main-esp32.cpp b/src/platform/esp32/main-esp32.cpp
index 833e058d8..7da41512e 100644
--- a/src/platform/esp32/main-esp32.cpp
+++ b/src/platform/esp32/main-esp32.cpp
@@ -7,7 +7,7 @@
#include "nimble/NimbleBluetooth.h"
#endif
#include "BleOta.h"
-#include "mesh/http/WiFiAPClient.h"
+#include "mesh/wifi/WiFiAPClient.h"
#include "meshUtils.h"
#include "sleep.h"
diff --git a/src/platform/nrf52/NRF52Bluetooth.cpp b/src/platform/nrf52/NRF52Bluetooth.cpp
index c29739542..dd81929c8 100644
--- a/src/platform/nrf52/NRF52Bluetooth.cpp
+++ b/src/platform/nrf52/NRF52Bluetooth.cpp
@@ -211,6 +211,7 @@ void NRF52Bluetooth::shutdown()
// Shutdown bluetooth for minimum power draw
LOG_INFO("Disable NRF52 bluetooth\n");
Bluefruit.Advertising.stop();
+ Bluefruit.setTxPower(0); // Minimum power
}
bool NRF52Bluetooth::isConnected()
@@ -333,4 +334,4 @@ void NRF52Bluetooth::onPairingCompleted(uint16_t conn_handle, uint8_t auth_statu
LOG_INFO("BLE pairing failed\n");
screen->stopBluetoothPinScreen();
-}
+}
\ No newline at end of file
diff --git a/src/platform/rp2040/architecture.h b/src/platform/rp2040/architecture.h
index 762a2dc83..61eb1bbe8 100644
--- a/src/platform/rp2040/architecture.h
+++ b/src/platform/rp2040/architecture.h
@@ -25,4 +25,6 @@
#define HW_VENDOR meshtastic_HardwareModel_RPI_PICO
#elif defined(RAK11310)
#define HW_VENDOR meshtastic_HardwareModel_RAK11310
+#elif defined(SENSELORA_RP2040)
+#define HW_VENDOR meshtastic_HardwareModel_SENSELORA_RP2040
#endif
\ No newline at end of file
diff --git a/src/sleep.cpp b/src/sleep.cpp
index b0f4aec88..464486d00 100644
--- a/src/sleep.cpp
+++ b/src/sleep.cpp
@@ -11,7 +11,7 @@
#ifdef ARCH_ESP32
#include "esp32/pm.h"
#include "esp_pm.h"
-#include "mesh/http/WiFiAPClient.h"
+#include "mesh/wifi/WiFiAPClient.h"
#include "rom/rtc.h"
#include
#include
diff --git a/variants/diy/hydra/variant.h b/variants/diy/hydra/variant.h
index a51b21653..60bb60beb 100644
--- a/variants/diy/hydra/variant.h
+++ b/variants/diy/hydra/variant.h
@@ -18,6 +18,7 @@
// Radio
#define USE_SX1262 // E22-900M30S uses SX1262
+#define USE_SX1268 // E22-400M30S uses SX1268
#define SX126X_MAX_POWER \
22 // Outputting 22dBm from SX1262 results in ~30dBm E22-900M30S output (module only uses last stage of the YP2233W PA)
#define SX126X_DIO3_TCXO_VOLTAGE 1.8 // E22 series TCXO reference voltage is 1.8V
diff --git a/variants/rpipicow/platformio.ini b/variants/rpipicow/platformio.ini
index 3228e4c24..4c8cf992d 100644
--- a/variants/rpipicow/platformio.ini
+++ b/variants/rpipicow/platformio.ini
@@ -8,8 +8,10 @@ upload_protocol = picotool
build_flags = ${rp2040_base.build_flags}
-DRPI_PICO
-Ivariants/rpipicow
- -DDEBUG_RP2040_PORT=Serial
-DHW_SPI1_DEVICE
-L "${platformio.libdeps_dir}/${this.__env__}/BSEC2 Software Library/src/cortex-m0plus"
+ -fexceptions # for exception handling in MQTT
+build_src_filter = ${rp2040_base.build_src_filter} +
lib_deps =
- ${rp2040_base.lib_deps}
\ No newline at end of file
+ ${rp2040_base.lib_deps}
+ ${networking_base.lib_deps}
\ No newline at end of file
diff --git a/variants/rpipicow/variant.h b/variants/rpipicow/variant.h
index abbd1c465..c48b901ac 100644
--- a/variants/rpipicow/variant.h
+++ b/variants/rpipicow/variant.h
@@ -4,6 +4,10 @@
#define ARDUINO_ARCH_AVR
+#ifndef HAS_WIFI
+#define HAS_WIFI 1
+#endif
+
#define USE_SH1106 1
// default I2C pins:
@@ -46,4 +50,4 @@
#define SX126X_RESET LORA_RESET
#define SX126X_DIO2_AS_RF_SWITCH
#define SX126X_DIO3_TCXO_VOLTAGE 1.8
-#endif
+#endif
\ No newline at end of file
diff --git a/variants/senselora_rp2040/pins_arduino.h b/variants/senselora_rp2040/pins_arduino.h
new file mode 100644
index 000000000..bb0ee637e
--- /dev/null
+++ b/variants/senselora_rp2040/pins_arduino.h
@@ -0,0 +1,50 @@
+#pragma once
+
+#define PIN_A0 (26u)
+#define PIN_A1 (27u)
+#define PIN_A2 (28u)
+#define PIN_A3 (29u)
+
+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;
+
+// LEDs
+#define PIN_LED (23u)
+#define PIN_LED1 PIN_LED
+#define LED_BUILTIN PIN_LED
+
+#define ADC_RESOLUTION 12
+
+// Serial
+#define PIN_SERIAL1_TX (0ul)
+#define PIN_SERIAL1_RX (1ul)
+
+#define PIN_SERIAL2_TX (4ul)
+#define PIN_SERIAL2_RX (5ul)
+
+// SPI
+#define PIN_SPI0_MISO (16u)
+#define PIN_SPI0_MOSI (19u)
+#define PIN_SPI0_SCK (18u)
+#define PIN_SPI0_SS (17u)
+
+// Wire
+#define PIN_WIRE0_SDA (6u)
+#define PIN_WIRE0_SCL (7u)
+
+#define PIN_WIRE1_SDA (-1)
+#define PIN_WIRE1_SCL (-1)
+
+#define SERIAL_HOWMANY (3u)
+#define SPI_HOWMANY (2u)
+#define WIRE_HOWMANY (1u)
+
+static const uint8_t SS = PIN_SPI0_SS;
+static const uint8_t MOSI = PIN_SPI0_MOSI;
+static const uint8_t MISO = PIN_SPI0_MISO;
+static const uint8_t SCK = PIN_SPI0_SCK;
+
+static const uint8_t SDA = PIN_WIRE0_SDA;
+static const uint8_t SCL = PIN_WIRE0_SCL;
\ No newline at end of file
diff --git a/variants/senselora_rp2040/platformio.ini b/variants/senselora_rp2040/platformio.ini
new file mode 100644
index 000000000..3b3253ee8
--- /dev/null
+++ b/variants/senselora_rp2040/platformio.ini
@@ -0,0 +1,13 @@
+[env:senselora_rp2040]
+extends = rp2040_base
+board = rpipico
+upload_protocol = picotool
+
+# add our variants files to the include and src paths
+build_flags = ${rp2040_base.build_flags}
+ -DSENSELORA_RP2040
+ -Ivariants/senselora_rp2040
+ -DDEBUG_RP2040_PORT=Serial
+ -L "${platformio.libdeps_dir}/${this.__env__}/BSEC2 Software Library/src/cortex-m0plus"
+lib_deps =
+ ${rp2040_base.lib_deps}
\ No newline at end of file
diff --git a/variants/senselora_rp2040/variant.h b/variants/senselora_rp2040/variant.h
new file mode 100644
index 000000000..9eda65521
--- /dev/null
+++ b/variants/senselora_rp2040/variant.h
@@ -0,0 +1,26 @@
+#define ARDUINO_ARCH_AVR
+
+#define USE_SSD1306
+
+#define BUTTON_PIN 2
+#define BUTTON_NEED_PULLUP
+
+#define LED_PIN PIN_LED
+
+#undef BATTERY_PIN
+
+#undef LORA_SCK
+#undef LORA_MISO
+#undef LORA_MOSI
+#undef LORA_CS
+
+#define USE_RF95
+#define LORA_SCK PIN_SPI0_SCK
+#define LORA_MISO PIN_SPI0_MISO
+#define LORA_MOSI PIN_SPI0_MOSI
+#define LORA_CS PIN_SPI0_SS
+
+#define LORA_DIO0 21
+#define LORA_DIO1 22
+#define LORA_DIO2 RADIOLIB_NC
+#define LORA_RESET 20
\ No newline at end of file
diff --git a/version.properties b/version.properties
index 972a6f6de..c95d5701a 100644
--- a/version.properties
+++ b/version.properties
@@ -1,4 +1,4 @@
[VERSION]
major = 2
minor = 2
-build = 14
+build = 16