Browse Source
Merge remote-tracking branch 'upstream/dev' into 2026/t114-sensors
pull/1596/head
João Brázio
4 months ago
No known key found for this signature in database
GPG Key ID: 56A1490716A324DD
8 changed files with
55 additions and
14 deletions
-
examples/companion_radio/main.cpp
-
examples/simple_repeater/main.cpp
-
src/helpers/ESP32Board.cpp
-
src/helpers/ESP32Board.h
-
src/helpers/NRF52Board.cpp
-
src/helpers/NRF52Board.h
-
src/helpers/radiolib/CustomSX1262.h
-
variants/heltec_v4/platformio.ini
|
|
|
@ -194,6 +194,7 @@ void setup() { |
|
|
|
); |
|
|
|
|
|
|
|
#ifdef WIFI_SSID |
|
|
|
board.setInhibitSleep(true); // prevent sleep when WiFi is active
|
|
|
|
WiFi.begin(WIFI_SSID, WIFI_PWD); |
|
|
|
serial_interface.begin(TCP_PORT); |
|
|
|
#elif defined(BLE_PIN_CODE) |
|
|
|
|
|
|
|
@ -134,14 +134,17 @@ void loop() { |
|
|
|
#endif |
|
|
|
rtc_clock.tick(); |
|
|
|
|
|
|
|
if (the_mesh.getNodePrefs()->powersaving_enabled && // To check if power saving is enabled
|
|
|
|
the_mesh.millisHasNowPassed(lastActive + nextSleepinSecs * 1000)) { // To check if it is time to sleep
|
|
|
|
if (!the_mesh.hasPendingWork()) { // No pending work. Safe to sleep
|
|
|
|
if (the_mesh.getNodePrefs()->powersaving_enabled && !the_mesh.hasPendingWork()) { |
|
|
|
#if defined(NRF52_PLATFORM) |
|
|
|
board.sleep(1800); // nrf ignores seconds param, sleeps whenever possible
|
|
|
|
#else |
|
|
|
if (the_mesh.millisHasNowPassed(lastActive + nextSleepinSecs * 1000)) { // To check if it is time to sleep
|
|
|
|
board.sleep(1800); // To sleep. Wake up after 30 minutes or when receiving a LoRa packet
|
|
|
|
lastActive = millis(); |
|
|
|
nextSleepinSecs = 5; // Default: To work for 5s and sleep again
|
|
|
|
} else { |
|
|
|
nextSleepinSecs += 5; // When there is pending work, to work another 5s
|
|
|
|
} |
|
|
|
#endif |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@ -11,6 +11,7 @@ |
|
|
|
#include <SPIFFS.h> |
|
|
|
|
|
|
|
bool ESP32Board::startOTAUpdate(const char* id, char reply[]) { |
|
|
|
inhibit_sleep = true; // prevent sleep during OTA
|
|
|
|
WiFi.softAP("MeshCore-OTA", NULL); |
|
|
|
|
|
|
|
sprintf(reply, "Started: http://%s/update", WiFi.softAPIP().toString().c_str()); |
|
|
|
|
|
|
|
@ -8,12 +8,12 @@ |
|
|
|
#include <rom/rtc.h> |
|
|
|
#include <sys/time.h> |
|
|
|
#include <Wire.h> |
|
|
|
#include "esp_wifi.h" |
|
|
|
#include "driver/rtc_io.h" |
|
|
|
|
|
|
|
class ESP32Board : public mesh::MainBoard { |
|
|
|
protected: |
|
|
|
uint8_t startup_reason; |
|
|
|
bool inhibit_sleep = false; |
|
|
|
|
|
|
|
public: |
|
|
|
void begin() { |
|
|
|
@ -72,11 +72,7 @@ public: |
|
|
|
} |
|
|
|
|
|
|
|
void sleep(uint32_t secs) override { |
|
|
|
// To check for WiFi status to see if there is active OTA
|
|
|
|
wifi_mode_t mode; |
|
|
|
esp_err_t err = esp_wifi_get_mode(&mode); |
|
|
|
|
|
|
|
if (err != ESP_OK) { // WiFi is off ~ No active OTA, safe to go to sleep
|
|
|
|
if (!inhibit_sleep) { |
|
|
|
enterLightSleep(secs); // To wake up after "secs" seconds or when receiving a LoRa packet
|
|
|
|
} |
|
|
|
} |
|
|
|
@ -126,6 +122,10 @@ public: |
|
|
|
} |
|
|
|
|
|
|
|
bool startOTAUpdate(const char* id, char reply[]) override; |
|
|
|
|
|
|
|
void setInhibitSleep(bool inhibit) { |
|
|
|
inhibit_sleep = inhibit; |
|
|
|
} |
|
|
|
}; |
|
|
|
|
|
|
|
class ESP32RTCClock : public mesh::RTCClock { |
|
|
|
|
|
|
|
@ -251,6 +251,32 @@ void NRF52BoardDCDC::begin() { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void NRF52Board::sleep(uint32_t secs) { |
|
|
|
// Clear FPU interrupt flags to avoid insomnia
|
|
|
|
// see errata 87 for details https://docs.nordicsemi.com/bundle/errata_nRF52840_Rev3/page/ERR/nRF52840/Rev3/latest/anomaly_840_87.html
|
|
|
|
#if (__FPU_USED == 1) |
|
|
|
__set_FPSCR(__get_FPSCR() & ~(0x0000009F)); |
|
|
|
(void) __get_FPSCR(); |
|
|
|
NVIC_ClearPendingIRQ(FPU_IRQn); |
|
|
|
#endif |
|
|
|
|
|
|
|
// On nRF52, we use event-driven sleep instead of timed sleep
|
|
|
|
// The 'secs' parameter is ignored - we wake on any interrupt
|
|
|
|
uint8_t sd_enabled = 0; |
|
|
|
sd_softdevice_is_enabled(&sd_enabled); |
|
|
|
|
|
|
|
if (sd_enabled) { |
|
|
|
// first call processes pending softdevice events, second call sleeps.
|
|
|
|
sd_app_evt_wait(); |
|
|
|
sd_app_evt_wait(); |
|
|
|
} else { |
|
|
|
// softdevice is disabled, use raw WFE
|
|
|
|
__SEV(); |
|
|
|
__WFE(); |
|
|
|
__WFE(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// Temperature from NRF52 MCU
|
|
|
|
float NRF52Board::getMCUTemperature() { |
|
|
|
NRF_TEMP->TASKS_START = 1; // Start temperature measurement
|
|
|
|
|
|
|
|
@ -51,6 +51,7 @@ public: |
|
|
|
virtual float getMCUTemperature() override; |
|
|
|
virtual void reboot() override { NVIC_SystemReset(); } |
|
|
|
virtual bool startOTAUpdate(const char *id, char reply[]) override; |
|
|
|
virtual void sleep(uint32_t secs) override; |
|
|
|
|
|
|
|
#ifdef NRF52_POWER_MANAGEMENT |
|
|
|
bool isExternalPowered() override; |
|
|
|
|
|
|
|
@ -76,6 +76,14 @@ class CustomSX1262 : public SX1262 { |
|
|
|
setRfSwitchPins(SX126X_RXEN, SX126X_TXEN); |
|
|
|
#endif |
|
|
|
|
|
|
|
// for improved RX with Heltec v4
|
|
|
|
#ifdef SX126X_REGISTER_PATCH |
|
|
|
uint8_t r_data = 0; |
|
|
|
readRegister(0x8B5, &r_data, 1); |
|
|
|
r_data |= 0x01; |
|
|
|
writeRegister(0x8B5, &r_data, 1); |
|
|
|
#endif |
|
|
|
|
|
|
|
return true; // success
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -17,18 +17,19 @@ build_flags = |
|
|
|
-D P_LORA_SCLK=9 |
|
|
|
-D P_LORA_MISO=11 |
|
|
|
-D P_LORA_MOSI=10 |
|
|
|
-D P_LORA_PA_POWER=7 ;power en |
|
|
|
-D P_LORA_PA_EN=2 |
|
|
|
-D P_LORA_PA_TX_EN=46 ;enable tx |
|
|
|
-D P_LORA_PA_POWER=7 ; VFEM_Ctrl - Power on GC1109 |
|
|
|
-D P_LORA_PA_EN=2 ; PA CSD - Enable GC1109 |
|
|
|
-D P_LORA_PA_TX_EN=46 ; PA CPS - GC1109 TX PA full(High) / bypass(Low) |
|
|
|
-D PIN_USER_BTN=0 |
|
|
|
-D PIN_VEXT_EN=36 |
|
|
|
-D PIN_VEXT_EN_ACTIVE=LOW |
|
|
|
-D LORA_TX_POWER=10 ;If it is configured as 10 here, the final output will be 22 dbm. |
|
|
|
-D MAX_LORA_TX_POWER=22 ; Max SX1262 output |
|
|
|
-D SX126X_DIO2_AS_RF_SWITCH=true |
|
|
|
-D SX126X_REGISTER_PATCH=1 ; Patch register 0x8B5 for improved RX |
|
|
|
-D SX126X_DIO2_AS_RF_SWITCH=true ; GC1109 CTX is controlled by SX1262 DIO2 |
|
|
|
-D SX126X_DIO3_TCXO_VOLTAGE=1.8 |
|
|
|
-D SX126X_CURRENT_LIMIT=140 |
|
|
|
-D SX126X_RX_BOOSTED_GAIN=1 |
|
|
|
-D SX126X_RX_BOOSTED_GAIN=1 ; In some cases, commenting this out will improve RX |
|
|
|
-D PIN_GPS_RX=38 |
|
|
|
-D PIN_GPS_TX=39 |
|
|
|
-D PIN_GPS_RESET=42 |
|
|
|
|