diff --git a/platformio.ini b/platformio.ini
index c511587a62..2c373ab00f 100644
--- a/platformio.ini
+++ b/platformio.ini
@@ -79,7 +79,7 @@ lib_deps =
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#f9f4fef2183514aa52be91d714c1455dd6f26e45
- https://github.com/meshtastic/ArduinoThread.git#72921ac222eed6f526ba1682023cee290d9aa1b3
+ https://github.com/meshtastic/ArduinoThread.git#1ae8778c85d0a2a729f989e0b1e7d7c4dc84eef0
nanopb/Nanopb@^0.4.7
erriez/ErriezCRC32@^1.0.1
diff --git a/protobufs b/protobufs
index b2b145e332..556e49ba61 160000
--- a/protobufs
+++ b/protobufs
@@ -1 +1 @@
-Subproject commit b2b145e3321beab1441fa59290137ab42eb38dc8
+Subproject commit 556e49ba619e2f4d8fa3c2dee2a94129a43d5f08
diff --git a/src/PowerFSM.cpp b/src/PowerFSM.cpp
index f98b03077f..5d86987dfb 100644
--- a/src/PowerFSM.cpp
+++ b/src/PowerFSM.cpp
@@ -8,6 +8,7 @@
* actions to be taken upon entering or exiting each state.
*/
#include "PowerFSM.h"
+#include "Default.h"
#include "MeshService.h"
#include "NodeDB.h"
#include "configuration.h"
@@ -45,7 +46,7 @@ static void sdsEnter()
{
LOG_DEBUG("Enter state: SDS\n");
// FIXME - make sure GPS and LORA radio are off first - because we want close to zero current draw
- doDeepSleep(getConfiguredOrDefaultMs(config.power.sds_secs), false);
+ doDeepSleep(Default::getConfiguredOrDefaultMs(config.power.sds_secs), false);
}
extern Power *power;
@@ -343,13 +344,13 @@ void PowerFSM_setup()
powerFSM.add_transition(&stateDARK, &stateDARK, EVENT_CONTACT_FROM_PHONE, NULL, "Contact from phone");
powerFSM.add_timed_transition(&stateON, &stateDARK,
- getConfiguredOrDefaultMs(config.display.screen_on_secs, default_screen_on_secs), NULL,
+ Default::getConfiguredOrDefaultMs(config.display.screen_on_secs, default_screen_on_secs), NULL,
"Screen-on timeout");
powerFSM.add_timed_transition(&statePOWER, &stateDARK,
- getConfiguredOrDefaultMs(config.display.screen_on_secs, default_screen_on_secs), NULL,
+ Default::getConfiguredOrDefaultMs(config.display.screen_on_secs, default_screen_on_secs), NULL,
"Screen-on timeout");
powerFSM.add_timed_transition(&stateDARK, &stateDARK,
- getConfiguredOrDefaultMs(config.display.screen_on_secs, default_screen_on_secs), NULL,
+ Default::getConfiguredOrDefaultMs(config.display.screen_on_secs, default_screen_on_secs), NULL,
"Screen-on timeout");
// We never enter light-sleep or NB states on NRF52 (because the CPU uses so little power normally)
@@ -359,11 +360,12 @@ void PowerFSM_setup()
// modules
if ((isRouter || config.power.is_power_saving) && !isTrackerOrSensor) {
powerFSM.add_timed_transition(&stateNB, &stateLS,
- getConfiguredOrDefaultMs(config.power.min_wake_secs, default_min_wake_secs), NULL,
+ Default::getConfiguredOrDefaultMs(config.power.min_wake_secs, default_min_wake_secs), NULL,
"Min wake timeout");
- powerFSM.add_timed_transition(&stateDARK, &stateLS,
- getConfiguredOrDefaultMs(config.power.wait_bluetooth_secs, default_wait_bluetooth_secs),
- NULL, "Bluetooth timeout");
+ powerFSM.add_timed_transition(
+ &stateDARK, &stateLS,
+ Default::getConfiguredOrDefaultMs(config.power.wait_bluetooth_secs, default_wait_bluetooth_secs), NULL,
+ "Bluetooth timeout");
}
#endif
diff --git a/src/PowerFSMThread.h b/src/PowerFSMThread.h
index 584c955aa1..fb640dd8b7 100644
--- a/src/PowerFSMThread.h
+++ b/src/PowerFSMThread.h
@@ -1,3 +1,4 @@
+#include "Default.h"
#include "NodeDB.h"
#include "PowerFSM.h"
#include "concurrency/OSThread.h"
@@ -28,7 +29,7 @@ class PowerFSMThread : public OSThread
timeLastPowered = millis();
} else if (config.power.on_battery_shutdown_after_secs > 0 && config.power.on_battery_shutdown_after_secs != UINT32_MAX &&
millis() > (timeLastPowered +
- getConfiguredOrDefaultMs(
+ Default::getConfiguredOrDefaultMs(
config.power.on_battery_shutdown_after_secs))) { // shutdown after 30 minutes unpowered
powerFSM.trigger(EVENT_SHUTDOWN);
}
diff --git a/src/configuration.h b/src/configuration.h
index ac8f9435a7..ec32c72d1d 100644
--- a/src/configuration.h
+++ b/src/configuration.h
@@ -111,6 +111,7 @@ along with this program. If not, see .
#define MCP9808_ADDR 0x18
#define INA_ADDR 0x40
#define INA_ADDR_ALTERNATE 0x41
+#define INA_ADDR_WAVESHARE_UPS 0x43
#define INA3221_ADDR 0x42
#define QMC6310_ADDR 0x1C
#define QMI8658_ADDR 0x6B
diff --git a/src/detect/ScanI2CTwoWire.cpp b/src/detect/ScanI2CTwoWire.cpp
index b6eca5fa4c..146daa3dcf 100644
--- a/src/detect/ScanI2CTwoWire.cpp
+++ b/src/detect/ScanI2CTwoWire.cpp
@@ -183,8 +183,13 @@ void ScanI2CTwoWire::scanPort(I2CPort port)
#if !defined(ARCH_PORTDUINO) && !defined(ARCH_STM32WL)
case ATECC608B_ADDR:
- type = ATECC608B;
- if (atecc.begin(addr.address) == true) {
+#ifdef RP2040_SLOW_CLOCK
+ if (atecc.begin(addr.address, Wire, Serial2) == true)
+#else
+ if (atecc.begin(addr.address) == true)
+#endif
+
+ {
LOG_INFO("ATECC608B initialized\n");
} else {
LOG_WARN("ATECC608B initialization failed\n");
@@ -254,6 +259,7 @@ void ScanI2CTwoWire::scanPort(I2CPort port)
case INA_ADDR:
case INA_ADDR_ALTERNATE:
+ case INA_ADDR_WAVESHARE_UPS:
registerValue = getRegisterValue(ScanI2CTwoWire::RegisterLocation(addr, 0xFE), 2);
LOG_DEBUG("Register MFG_UID: 0x%x\n", registerValue);
if (registerValue == 0x5449) {
diff --git a/src/gps/GPS.cpp b/src/gps/GPS.cpp
index a09eda03d1..2aa45d3fb4 100644
--- a/src/gps/GPS.cpp
+++ b/src/gps/GPS.cpp
@@ -1,4 +1,5 @@
#include "GPS.h"
+#include "Default.h"
#include "NodeDB.h"
#include "RTC.h"
#include "configuration.h"
@@ -495,7 +496,6 @@ bool GPS::setup()
}
}
}
-
} else {
// LOG_INFO("u-blox M10 hardware found.\n");
delay(1000);
@@ -759,7 +759,7 @@ uint32_t GPS::getWakeTime() const
if (t == UINT32_MAX)
return t; // already maxint
- return getConfiguredOrDefaultMs(t, default_broadcast_interval_secs);
+ return Default::Default::getConfiguredOrDefaultMs(t, default_broadcast_interval_secs);
}
/** Get how long we should sleep between aqusition attempts in msecs
diff --git a/src/graphics/Screen.cpp b/src/graphics/Screen.cpp
index 7e36dfe4a7..3c3777496b 100644
--- a/src/graphics/Screen.cpp
+++ b/src/graphics/Screen.cpp
@@ -1519,8 +1519,7 @@ void DebugInfo::drawFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int16
char channelStr[20];
{
concurrency::LockGuard guard(&lock);
- auto chName = channels.getPrimaryName();
- snprintf(channelStr, sizeof(channelStr), "%s", chName);
+ snprintf(channelStr, sizeof(channelStr), "#%s", channels.getName(channels.getPrimaryIndex()));
}
// Display power status
diff --git a/src/mesh/Channels.cpp b/src/mesh/Channels.cpp
index 93dec7e7d3..840e65bca8 100644
--- a/src/mesh/Channels.cpp
+++ b/src/mesh/Channels.cpp
@@ -290,40 +290,6 @@ bool Channels::hasDefaultChannel()
return false;
}
-/**
-* Generate a short suffix used to disambiguate channels that might have the same "name" entered by the human but different PSKs.
-* The ideas is that the PSK changing should be visible to the user so that they see they probably messed up and that's why they
-their nodes
-* aren't talking to each other.
-*
-* This string is of the form "#name-X".
-*
-* Where X is either:
-* (for custom PSKS) a letter from A to Z (base26), and formed by xoring all the bytes of the PSK together,
-*
-* This function will also need to be implemented in GUI apps that talk to the radio.
-*
-* https://github.com/meshtastic/firmware/issues/269
-*/
-const char *Channels::getPrimaryName()
-{
- static char buf[32];
-
- char suffix;
- // auto channelSettings = getPrimary();
- // if (channelSettings.psk.size != 1) {
- // We have a standard PSK, so generate a letter based hash.
- uint8_t code = getHash(primaryIndex);
-
- suffix = 'A' + (code % 26);
- /* } else {
- suffix = '0' + channelSettings.psk.bytes[0];
- } */
-
- snprintf(buf, sizeof(buf), "#%s-%c", getName(primaryIndex), suffix);
- return buf;
-}
-
/** Given a channel hash setup crypto for decoding that channel (or the primary channel if that channel is unsecured)
*
* This method is called before decoding inbound packets
diff --git a/src/mesh/Channels.h b/src/mesh/Channels.h
index a1c4ba1711..952445a1da 100644
--- a/src/mesh/Channels.h
+++ b/src/mesh/Channels.h
@@ -61,25 +61,6 @@ class Channels
ChannelIndex getNumChannels() { return channelFile.channels_count; }
- /**
- * Generate a short suffix used to disambiguate channels that might have the same "name" entered by the human but different
- PSKs.
- * The ideas is that the PSK changing should be visible to the user so that they see they probably messed up and that's why
- they their nodes
- * aren't talking to each other.
- *
- * This string is of the form "#name-X".
- *
- * Where X is either:
- * (for custom PSKS) a letter from A to Z (base26), and formed by xoring all the bytes of the PSK together,
- * OR (for the standard minimially secure PSKs) a number from 0 to 9.
- *
- * This function will also need to be implemented in GUI apps that talk to the radio.
- *
- * https://github.com/meshtastic/firmware/issues/269
- */
- const char *getPrimaryName();
-
/// Called by NodeDB on initial boot when the radio config settings are unset. Set a default single channel config.
void initDefaults();
diff --git a/src/mesh/Default.cpp b/src/mesh/Default.cpp
new file mode 100644
index 0000000000..db058c5b0c
--- /dev/null
+++ b/src/mesh/Default.cpp
@@ -0,0 +1,23 @@
+#include "Default.h"
+
+uint32_t Default::getConfiguredOrDefaultMs(uint32_t configuredInterval)
+{
+ if (configuredInterval > 0)
+ return configuredInterval * 1000;
+ return default_broadcast_interval_secs * 1000;
+}
+
+uint32_t Default::getConfiguredOrDefaultMs(uint32_t configuredInterval, uint32_t defaultInterval)
+{
+ if (configuredInterval > 0)
+ return configuredInterval * 1000;
+ return defaultInterval * 1000;
+}
+
+uint32_t Default::getConfiguredOrDefault(uint32_t configured, uint32_t defaultValue)
+{
+ if (configured > 0)
+ return configured;
+
+ return defaultValue;
+}
\ No newline at end of file
diff --git a/src/mesh/Default.h b/src/mesh/Default.h
new file mode 100644
index 0000000000..734cdf5190
--- /dev/null
+++ b/src/mesh/Default.h
@@ -0,0 +1,30 @@
+#pragma once
+#include
+#include
+#define ONE_DAY 24 * 60 * 60
+
+#define default_gps_update_interval IF_ROUTER(ONE_DAY, 2 * 60)
+#define default_broadcast_interval_secs IF_ROUTER(ONE_DAY / 2, 15 * 60)
+#define default_wait_bluetooth_secs IF_ROUTER(1, 60)
+#define default_sds_secs IF_ROUTER(ONE_DAY, UINT32_MAX) // Default to forever super deep sleep
+#define default_ls_secs IF_ROUTER(ONE_DAY, 5 * 60)
+#define default_min_wake_secs 10
+#define default_screen_on_secs IF_ROUTER(1, 60 * 10)
+#define default_node_info_broadcast_secs 3 * 60 * 60
+#define min_node_info_broadcast_secs 60 * 60 // No regular broadcasts of more than once an hour
+
+#define default_mqtt_address "mqtt.meshtastic.org"
+#define default_mqtt_username "meshdev"
+#define default_mqtt_password "large4cats"
+#define default_mqtt_root "msh"
+
+#define IF_ROUTER(routerVal, normalVal) \
+ ((config.device.role == meshtastic_Config_DeviceConfig_Role_ROUTER) ? (routerVal) : (normalVal))
+
+class Default
+{
+ public:
+ static uint32_t getConfiguredOrDefaultMs(uint32_t configuredInterval);
+ static uint32_t getConfiguredOrDefaultMs(uint32_t configuredInterval, uint32_t defaultInterval);
+ static uint32_t getConfiguredOrDefault(uint32_t configured, uint32_t defaultValue);
+};
diff --git a/src/mesh/NodeDB.cpp b/src/mesh/NodeDB.cpp
index 8fb03055ce..398fda7a1d 100644
--- a/src/mesh/NodeDB.cpp
+++ b/src/mesh/NodeDB.cpp
@@ -3,6 +3,7 @@
#include "../detect/ScanI2C.h"
#include "Channels.h"
#include "CryptoEngine.h"
+#include "Default.h"
#include "FSCommon.h"
#include "GPS.h"
#include "MeshRadio.h"
@@ -117,13 +118,6 @@ bool NodeDB::resetRadioConfig(bool factory_reset)
channels.onConfigChanged();
- // temp hack for quicker testing
- // devicestate.no_save = true;
- if (devicestate.no_save) {
- LOG_DEBUG("***** DEVELOPMENT MODE - DO NOT RELEASE *****\n");
- // Put your development config changes here
- }
-
// Update the global myRegion
initRegion();
@@ -666,62 +660,54 @@ bool NodeDB::saveProto(const char *filename, size_t protoSize, const pb_msgdesc_
void NodeDB::saveChannelsToDisk()
{
- if (!devicestate.no_save) {
#ifdef FSCom
- FSCom.mkdir("/prefs");
+ FSCom.mkdir("/prefs");
#endif
- saveProto(channelFileName, meshtastic_ChannelFile_size, &meshtastic_ChannelFile_msg, &channelFile);
- }
+ saveProto(channelFileName, meshtastic_ChannelFile_size, &meshtastic_ChannelFile_msg, &channelFile);
}
void NodeDB::saveDeviceStateToDisk()
{
- if (!devicestate.no_save) {
#ifdef FSCom
- FSCom.mkdir("/prefs");
+ FSCom.mkdir("/prefs");
#endif
saveProto(prefFileName, sizeof(devicestate) + numMeshNodes * meshtastic_NodeInfoLite_size, &meshtastic_DeviceState_msg,
&devicestate);
- }
}
void NodeDB::saveToDisk(int saveWhat)
{
- if (!devicestate.no_save) {
#ifdef FSCom
- FSCom.mkdir("/prefs");
+ FSCom.mkdir("/prefs");
#endif
- if (saveWhat & SEGMENT_DEVICESTATE) {
- saveDeviceStateToDisk();
- }
-
- if (saveWhat & SEGMENT_CONFIG) {
- config.has_device = true;
- config.has_display = true;
- config.has_lora = true;
- config.has_position = true;
- config.has_power = true;
- config.has_network = true;
- config.has_bluetooth = true;
- saveProto(configFileName, meshtastic_LocalConfig_size, &meshtastic_LocalConfig_msg, &config);
- }
-
- if (saveWhat & SEGMENT_MODULECONFIG) {
- moduleConfig.has_canned_message = true;
- moduleConfig.has_external_notification = true;
- moduleConfig.has_mqtt = true;
- moduleConfig.has_range_test = true;
- moduleConfig.has_serial = true;
- moduleConfig.has_store_forward = true;
- moduleConfig.has_telemetry = true;
- saveProto(moduleConfigFileName, meshtastic_LocalModuleConfig_size, &meshtastic_LocalModuleConfig_msg, &moduleConfig);
- }
-
- if (saveWhat & SEGMENT_CHANNELS) {
- saveChannelsToDisk();
- }
- } else {
- LOG_DEBUG("***** DEVELOPMENT MODE - DO NOT RELEASE - not saving to flash *****\n");
+ if (saveWhat & SEGMENT_DEVICESTATE) {
+ saveDeviceStateToDisk();
+ }
+
+ if (saveWhat & SEGMENT_CONFIG) {
+ config.has_device = true;
+ config.has_display = true;
+ config.has_lora = true;
+ config.has_position = true;
+ config.has_power = true;
+ config.has_network = true;
+ config.has_bluetooth = true;
+ saveProto(configFileName, meshtastic_LocalConfig_size, &meshtastic_LocalConfig_msg, &config);
+ }
+
+ if (saveWhat & SEGMENT_MODULECONFIG) {
+ moduleConfig.has_canned_message = true;
+ moduleConfig.has_external_notification = true;
+ moduleConfig.has_mqtt = true;
+ moduleConfig.has_range_test = true;
+ moduleConfig.has_serial = true;
+ moduleConfig.has_store_forward = true;
+ moduleConfig.has_telemetry = true;
+ saveProto(moduleConfigFileName, meshtastic_LocalModuleConfig_size, &meshtastic_LocalModuleConfig_msg, &moduleConfig);
+ }
+
+ if (saveWhat & SEGMENT_CHANNELS) {
+ saveChannelsToDisk();
}
}
diff --git a/src/mesh/NodeDB.h b/src/mesh/NodeDB.h
index 362b28618b..dacf85eef1 100644
--- a/src/mesh/NodeDB.h
+++ b/src/mesh/NodeDB.h
@@ -192,48 +192,6 @@ extern NodeDB *nodeDB;
// Our delay functions check for this for times that should never expire
#define NODE_DELAY_FOREVER 0xffffffff
-#define IF_ROUTER(routerVal, normalVal) \
- ((config.device.role == meshtastic_Config_DeviceConfig_Role_ROUTER) ? (routerVal) : (normalVal))
-
-#define ONE_DAY 24 * 60 * 60
-
-#define default_gps_update_interval IF_ROUTER(ONE_DAY, 2 * 60)
-#define default_broadcast_interval_secs IF_ROUTER(ONE_DAY / 2, 15 * 60)
-#define default_wait_bluetooth_secs IF_ROUTER(1, 60)
-#define default_sds_secs IF_ROUTER(ONE_DAY, UINT32_MAX) // Default to forever super deep sleep
-#define default_ls_secs IF_ROUTER(ONE_DAY, 5 * 60)
-#define default_min_wake_secs 10
-#define default_screen_on_secs IF_ROUTER(1, 60 * 10)
-#define default_node_info_broadcast_secs 3 * 60 * 60
-#define min_node_info_broadcast_secs 60 * 60 // No regular broadcasts of more than once an hour
-
-#define default_mqtt_address "mqtt.meshtastic.org"
-#define default_mqtt_username "meshdev"
-#define default_mqtt_password "large4cats"
-#define default_mqtt_root "msh"
-
-inline uint32_t getConfiguredOrDefaultMs(uint32_t configuredInterval)
-{
- if (configuredInterval > 0)
- return configuredInterval * 1000;
- return default_broadcast_interval_secs * 1000;
-}
-
-inline uint32_t getConfiguredOrDefaultMs(uint32_t configuredInterval, uint32_t defaultInterval)
-{
- if (configuredInterval > 0)
- return configuredInterval * 1000;
- return defaultInterval * 1000;
-}
-
-inline uint32_t getConfiguredOrDefault(uint32_t configured, uint32_t defaultValue)
-{
- if (configured > 0)
- return configured;
-
- return defaultValue;
-}
-
/// Sometimes we will have Position objects that only have a time, so check for
/// valid lat/lon
static inline bool hasValidPosition(const meshtastic_NodeInfoLite *n)
@@ -256,4 +214,6 @@ extern uint32_t error_address;
#define Module_Config_size \
(ModuleConfig_CannedMessageConfig_size + ModuleConfig_ExternalNotificationConfig_size + ModuleConfig_MQTTConfig_size + \
ModuleConfig_RangeTestConfig_size + ModuleConfig_SerialConfig_size + ModuleConfig_StoreForwardConfig_size + \
- ModuleConfig_TelemetryConfig_size + ModuleConfig_size)
\ No newline at end of file
+ ModuleConfig_TelemetryConfig_size + ModuleConfig_size)
+
+// Please do not remove this comment, it makes trunk and compiler happy at the same time.
diff --git a/src/mesh/PhoneAPI.cpp b/src/mesh/PhoneAPI.cpp
index 7267c768a3..48f7eb9403 100644
--- a/src/mesh/PhoneAPI.cpp
+++ b/src/mesh/PhoneAPI.cpp
@@ -1,5 +1,6 @@
#include "PhoneAPI.h"
#include "Channels.h"
+#include "Default.h"
#include "GPS.h"
#include "MeshService.h"
#include "NodeDB.h"
diff --git a/src/mesh/generated/meshtastic/deviceonly.pb.h b/src/mesh/generated/meshtastic/deviceonly.pb.h
index 27acbea67a..5cccaef76c 100644
--- a/src/mesh/generated/meshtastic/deviceonly.pb.h
+++ b/src/mesh/generated/meshtastic/deviceonly.pb.h
@@ -142,7 +142,8 @@ typedef struct _meshtastic_DeviceState {
NodeDB.cpp in the device code. */
uint32_t version;
/* Used only during development.
- Indicates developer is testing and changes should never be saved to flash. */
+ Indicates developer is testing and changes should never be saved to flash.
+ Deprecated in 2.3.1 */
bool no_save;
/* Some GPS receivers seem to have bogus settings from the factory, so we always do one factory reset. */
bool did_gps_reset;
diff --git a/src/modules/AdminModule.cpp b/src/modules/AdminModule.cpp
index b363436f62..6d420ddb8a 100644
--- a/src/modules/AdminModule.cpp
+++ b/src/modules/AdminModule.cpp
@@ -16,6 +16,7 @@
#ifdef ARCH_PORTDUINO
#include "unistd.h"
#endif
+#include "Default.h"
#include "mqtt/MQTT.h"
diff --git a/src/modules/AtakPluginModule.cpp b/src/modules/AtakPluginModule.cpp
index ffc4fe68ab..64a85e2bf2 100644
--- a/src/modules/AtakPluginModule.cpp
+++ b/src/modules/AtakPluginModule.cpp
@@ -1,4 +1,5 @@
#include "AtakPluginModule.h"
+#include "Default.h"
#include "MeshService.h"
#include "NodeDB.h"
#include "PowerFSM.h"
diff --git a/src/modules/DetectionSensorModule.cpp b/src/modules/DetectionSensorModule.cpp
index 6c35e94ae1..fd26749c1e 100644
--- a/src/modules/DetectionSensorModule.cpp
+++ b/src/modules/DetectionSensorModule.cpp
@@ -1,10 +1,10 @@
#include "DetectionSensorModule.h"
+#include "Default.h"
#include "MeshService.h"
#include "NodeDB.h"
#include "PowerFSM.h"
#include "configuration.h"
#include "main.h"
-
DetectionSensorModule *detectionSensorModule;
#define GPIO_POLLING_INTERVAL 100
@@ -49,7 +49,7 @@ int32_t DetectionSensorModule::runOnce()
// LOG_DEBUG("Detection Sensor Module: Current pin state: %i\n", digitalRead(moduleConfig.detection_sensor.monitor_pin));
- if ((millis() - lastSentToMesh) >= getConfiguredOrDefaultMs(moduleConfig.detection_sensor.minimum_broadcast_secs) &&
+ if ((millis() - lastSentToMesh) >= Default::getConfiguredOrDefaultMs(moduleConfig.detection_sensor.minimum_broadcast_secs) &&
hasDetectionEvent()) {
sendDetectionMessage();
return DELAYED_INTERVAL;
@@ -58,7 +58,8 @@ int32_t DetectionSensorModule::runOnce()
// of heartbeat. We only do this if the minimum broadcast interval is greater than zero, otherwise we'll only broadcast state
// change detections.
else if (moduleConfig.detection_sensor.state_broadcast_secs > 0 &&
- (millis() - lastSentToMesh) >= getConfiguredOrDefaultMs(moduleConfig.detection_sensor.state_broadcast_secs)) {
+ (millis() - lastSentToMesh) >=
+ Default::getConfiguredOrDefaultMs(moduleConfig.detection_sensor.state_broadcast_secs)) {
sendCurrentStateMessage();
return DELAYED_INTERVAL;
}
diff --git a/src/modules/NeighborInfoModule.cpp b/src/modules/NeighborInfoModule.cpp
index ec756b4bb7..4d68b4a162 100644
--- a/src/modules/NeighborInfoModule.cpp
+++ b/src/modules/NeighborInfoModule.cpp
@@ -1,4 +1,5 @@
#include "NeighborInfoModule.h"
+#include "Default.h"
#include "MeshService.h"
#include "NodeDB.h"
#include "RTC.h"
@@ -194,7 +195,7 @@ int32_t NeighborInfoModule::runOnce()
{
bool requestReplies = false;
sendNeighborInfo(NODENUM_BROADCAST, requestReplies);
- return getConfiguredOrDefaultMs(moduleConfig.neighbor_info.update_interval, default_broadcast_interval_secs);
+ return Default::getConfiguredOrDefaultMs(moduleConfig.neighbor_info.update_interval, default_broadcast_interval_secs);
}
/*
diff --git a/src/modules/NodeInfoModule.cpp b/src/modules/NodeInfoModule.cpp
index 6aa28d5791..f770267086 100644
--- a/src/modules/NodeInfoModule.cpp
+++ b/src/modules/NodeInfoModule.cpp
@@ -1,4 +1,5 @@
#include "NodeInfoModule.h"
+#include "Default.h"
#include "MeshService.h"
#include "NodeDB.h"
#include "RTC.h"
@@ -58,8 +59,8 @@ void NodeInfoModule::sendOurNodeInfo(NodeNum dest, bool wantReplies, uint8_t cha
meshtastic_MeshPacket *NodeInfoModule::allocReply()
{
uint32_t now = millis();
- // If we sent our NodeInfo less than 1 min. ago, don't send it again as it may be still underway.
- if (lastSentToMesh && (now - lastSentToMesh) < 60 * 1000) {
+ // If we sent our NodeInfo less than 5 min. ago, don't send it again as it may be still underway.
+ if (lastSentToMesh && (now - lastSentToMesh) < (5 * 60 * 1000)) {
LOG_DEBUG("Sending NodeInfo will be ignored since we just sent it.\n");
ignoreRequest = true; // Mark it as ignored for MeshModule
return NULL;
@@ -91,5 +92,5 @@ int32_t NodeInfoModule::runOnce()
LOG_INFO("Sending our nodeinfo to mesh (wantReplies=%d)\n", requestReplies);
sendOurNodeInfo(NODENUM_BROADCAST, requestReplies); // Send our info (don't request replies)
}
- return getConfiguredOrDefaultMs(config.device.node_info_broadcast_secs, default_node_info_broadcast_secs);
-}
\ No newline at end of file
+ return Default::getConfiguredOrDefaultMs(config.device.node_info_broadcast_secs, default_node_info_broadcast_secs);
+}
diff --git a/src/modules/PositionModule.cpp b/src/modules/PositionModule.cpp
index 8f677315d9..0bfc775da7 100644
--- a/src/modules/PositionModule.cpp
+++ b/src/modules/PositionModule.cpp
@@ -1,4 +1,5 @@
#include "PositionModule.h"
+#include "Default.h"
#include "GPS.h"
#include "MeshService.h"
#include "NodeDB.h"
@@ -280,7 +281,7 @@ int32_t PositionModule::runOnce()
{
if (sleepOnNextExecution == true) {
sleepOnNextExecution = false;
- uint32_t nightyNightMs = getConfiguredOrDefaultMs(config.position.position_broadcast_secs);
+ uint32_t nightyNightMs = Default::getConfiguredOrDefaultMs(config.position.position_broadcast_secs);
LOG_DEBUG("Sleeping for %ims, then awaking to send position again.\n", nightyNightMs);
doDeepSleep(nightyNightMs, false);
}
@@ -291,7 +292,8 @@ int32_t PositionModule::runOnce()
// We limit our GPS broadcasts to a max rate
uint32_t now = millis();
- uint32_t intervalMs = getConfiguredOrDefaultMs(config.position.position_broadcast_secs, default_broadcast_interval_secs);
+ uint32_t intervalMs =
+ Default::getConfiguredOrDefaultMs(config.position.position_broadcast_secs, default_broadcast_interval_secs);
uint32_t msSinceLastSend = now - lastGpsSend;
// Only send packets if the channel util. is less than 25% utilized or we're a tracker with less than 40% utilized.
if (!airTime->isTxAllowedChannelUtil(config.device.role != meshtastic_Config_DeviceConfig_Role_TRACKER &&
@@ -322,7 +324,7 @@ int32_t PositionModule::runOnce()
if (hasValidPosition(node2)) {
// The minimum time (in seconds) that would pass before we are able to send a new position packet.
const uint32_t minimumTimeThreshold =
- getConfiguredOrDefaultMs(config.position.broadcast_smart_minimum_interval_secs, 30);
+ Default::getConfiguredOrDefaultMs(config.position.broadcast_smart_minimum_interval_secs, 30);
auto smartPosition = getDistanceTraveledSinceLastSend(node->position);
@@ -369,7 +371,8 @@ void PositionModule::sendLostAndFoundText()
struct SmartPosition PositionModule::getDistanceTraveledSinceLastSend(meshtastic_PositionLite currentPosition)
{
// The minimum distance to travel before we are able to send a new position packet.
- const uint32_t distanceTravelThreshold = getConfiguredOrDefault(config.position.broadcast_smart_minimum_distance, 100);
+ const uint32_t distanceTravelThreshold =
+ Default::getConfiguredOrDefault(config.position.broadcast_smart_minimum_distance, 100);
// Determine the distance in meters between two points on the globe
float distanceTraveledSinceLastSend = GeoCoord::latLongToMeter(
diff --git a/src/modules/Telemetry/AirQualityTelemetry.cpp b/src/modules/Telemetry/AirQualityTelemetry.cpp
index ada1fdef81..3e9b069c4b 100644
--- a/src/modules/Telemetry/AirQualityTelemetry.cpp
+++ b/src/modules/Telemetry/AirQualityTelemetry.cpp
@@ -1,5 +1,6 @@
#include "AirQualityTelemetry.h"
#include "../mesh/generated/meshtastic/telemetry.pb.h"
+#include "Default.h"
#include "MeshService.h"
#include "NodeDB.h"
#include "PowerFSM.h"
@@ -43,7 +44,7 @@ int32_t AirQualityTelemetryModule::runOnce()
uint32_t now = millis();
if (((lastSentToMesh == 0) ||
- ((now - lastSentToMesh) >= getConfiguredOrDefaultMs(moduleConfig.telemetry.air_quality_interval))) &&
+ ((now - lastSentToMesh) >= Default::getConfiguredOrDefaultMs(moduleConfig.telemetry.air_quality_interval))) &&
airTime->isTxAllowedAirUtil()) {
sendTelemetry();
lastSentToMesh = now;
diff --git a/src/modules/Telemetry/DeviceTelemetry.cpp b/src/modules/Telemetry/DeviceTelemetry.cpp
index 7b1f69cacd..7c02b57b4b 100644
--- a/src/modules/Telemetry/DeviceTelemetry.cpp
+++ b/src/modules/Telemetry/DeviceTelemetry.cpp
@@ -1,5 +1,6 @@
#include "DeviceTelemetry.h"
#include "../mesh/generated/meshtastic/telemetry.pb.h"
+#include "Default.h"
#include "MeshService.h"
#include "NodeDB.h"
#include "PowerFSM.h"
@@ -16,7 +17,7 @@ int32_t DeviceTelemetryModule::runOnce()
{
uint32_t now = millis();
if (((lastSentToMesh == 0) ||
- ((now - lastSentToMesh) >= getConfiguredOrDefaultMs(moduleConfig.telemetry.device_update_interval))) &&
+ ((now - lastSentToMesh) >= Default::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_CLIENT_HIDDEN) {
diff --git a/src/modules/Telemetry/EnvironmentTelemetry.cpp b/src/modules/Telemetry/EnvironmentTelemetry.cpp
index 7b59c28a6a..203b632a75 100644
--- a/src/modules/Telemetry/EnvironmentTelemetry.cpp
+++ b/src/modules/Telemetry/EnvironmentTelemetry.cpp
@@ -1,5 +1,6 @@
#include "EnvironmentTelemetry.h"
#include "../mesh/generated/meshtastic/telemetry.pb.h"
+#include "Default.h"
#include "MeshService.h"
#include "NodeDB.h"
#include "PowerFSM.h"
@@ -41,7 +42,7 @@ int32_t EnvironmentTelemetryModule::runOnce()
{
if (sleepOnNextExecution == true) {
sleepOnNextExecution = false;
- uint32_t nightyNightMs = getConfiguredOrDefaultMs(moduleConfig.telemetry.environment_update_interval);
+ uint32_t nightyNightMs = Default::getConfiguredOrDefaultMs(moduleConfig.telemetry.environment_update_interval);
LOG_DEBUG("Sleeping for %ims, then awaking to send metrics again.\n", nightyNightMs);
doDeepSleep(nightyNightMs, true);
}
@@ -102,7 +103,7 @@ int32_t EnvironmentTelemetryModule::runOnce()
uint32_t now = millis();
if (((lastSentToMesh == 0) ||
- ((now - lastSentToMesh) >= getConfiguredOrDefaultMs(moduleConfig.telemetry.environment_update_interval))) &&
+ ((now - lastSentToMesh) >= Default::getConfiguredOrDefaultMs(moduleConfig.telemetry.environment_update_interval))) &&
airTime->isTxAllowedAirUtil()) {
sendTelemetry();
lastSentToMesh = now;
diff --git a/src/modules/Telemetry/PowerTelemetry.cpp b/src/modules/Telemetry/PowerTelemetry.cpp
index 300ab1f628..713f6aacbb 100644
--- a/src/modules/Telemetry/PowerTelemetry.cpp
+++ b/src/modules/Telemetry/PowerTelemetry.cpp
@@ -1,5 +1,6 @@
#include "PowerTelemetry.h"
#include "../mesh/generated/meshtastic/telemetry.pb.h"
+#include "Default.h"
#include "MeshService.h"
#include "NodeDB.h"
#include "PowerFSM.h"
@@ -20,7 +21,7 @@ int32_t PowerTelemetryModule::runOnce()
{
if (sleepOnNextExecution == true) {
sleepOnNextExecution = false;
- uint32_t nightyNightMs = getConfiguredOrDefaultMs(moduleConfig.telemetry.power_update_interval);
+ uint32_t nightyNightMs = Default::getConfiguredOrDefaultMs(moduleConfig.telemetry.power_update_interval);
LOG_DEBUG("Sleeping for %ims, then awaking to send metrics again.\n", nightyNightMs);
doDeepSleep(nightyNightMs, true);
}
@@ -66,7 +67,7 @@ int32_t PowerTelemetryModule::runOnce()
uint32_t now = millis();
if (((lastSentToMesh == 0) ||
- ((now - lastSentToMesh) >= getConfiguredOrDefaultMs(moduleConfig.telemetry.power_update_interval))) &&
+ ((now - lastSentToMesh) >= Default::getConfiguredOrDefaultMs(moduleConfig.telemetry.power_update_interval))) &&
airTime->isTxAllowedAirUtil()) {
sendTelemetry();
lastSentToMesh = now;
diff --git a/src/modules/Telemetry/Sensor/INA219Sensor.cpp b/src/modules/Telemetry/Sensor/INA219Sensor.cpp
index 5a1faa99ff..ecb5643686 100644
--- a/src/modules/Telemetry/Sensor/INA219Sensor.cpp
+++ b/src/modules/Telemetry/Sensor/INA219Sensor.cpp
@@ -4,6 +4,10 @@
#include "configuration.h"
#include
+#ifndef INA219_MULTIPLIER
+#define INA219_MULTIPLIER 1.0f
+#endif
+
INA219Sensor::INA219Sensor() : TelemetrySensor(meshtastic_TelemetrySensorType_INA219, "INA219") {}
int32_t INA219Sensor::runOnce()
@@ -26,7 +30,7 @@ void INA219Sensor::setup() {}
bool INA219Sensor::getMetrics(meshtastic_Telemetry *measurement)
{
measurement->variant.environment_metrics.voltage = ina219.getBusVoltage_V();
- measurement->variant.environment_metrics.current = ina219.getCurrent_mA();
+ measurement->variant.environment_metrics.current = ina219.getCurrent_mA() * INA219_MULTIPLIER;
return true;
}
diff --git a/src/modules/esp32/PaxcounterModule.cpp b/src/modules/esp32/PaxcounterModule.cpp
index 54c67fad7e..aad7b5d63a 100644
--- a/src/modules/esp32/PaxcounterModule.cpp
+++ b/src/modules/esp32/PaxcounterModule.cpp
@@ -1,8 +1,8 @@
#include "configuration.h"
#if defined(ARCH_ESP32)
+#include "Default.h"
#include "MeshService.h"
#include "PaxcounterModule.h"
-
#include
PaxcounterModule *paxcounterModule;
@@ -82,9 +82,9 @@ int32_t PaxcounterModule::runOnce()
if (isActive()) {
if (firstTime) {
firstTime = false;
- LOG_DEBUG(
- "Paxcounter starting up with interval of %d seconds\n",
- getConfiguredOrDefault(moduleConfig.paxcounter.paxcounter_update_interval, default_broadcast_interval_secs));
+ LOG_DEBUG("Paxcounter starting up with interval of %d seconds\n",
+ Default::getConfiguredOrDefault(moduleConfig.paxcounter.paxcounter_update_interval,
+ default_broadcast_interval_secs));
struct libpax_config_t configuration;
libpax_default_config(&configuration);
@@ -104,7 +104,8 @@ int32_t PaxcounterModule::runOnce()
} else {
sendInfo(NODENUM_BROADCAST);
}
- return getConfiguredOrDefaultMs(moduleConfig.paxcounter.paxcounter_update_interval, default_broadcast_interval_secs);
+ return Default::getConfiguredOrDefaultMs(moduleConfig.paxcounter.paxcounter_update_interval,
+ default_broadcast_interval_secs);
} else {
return disable();
}
diff --git a/src/mqtt/MQTT.cpp b/src/mqtt/MQTT.cpp
index 2243aaf8a5..e29786dcb4 100644
--- a/src/mqtt/MQTT.cpp
+++ b/src/mqtt/MQTT.cpp
@@ -17,6 +17,7 @@
#include "mesh/wifi/WiFiAPClient.h"
#include
#endif
+#include "Default.h"
#include
const int reconnectMax = 5;
diff --git a/variants/rpipico-slowclock/platformio.ini b/variants/rpipico-slowclock/platformio.ini
new file mode 100644
index 0000000000..e583c4b0d5
--- /dev/null
+++ b/variants/rpipico-slowclock/platformio.ini
@@ -0,0 +1,28 @@
+[env:pico_slowclock]
+extends = rp2040_base
+board = rpipico
+upload_protocol = jlink
+# debug settings for external openocd with RP2040 support (custom build)
+debug_tool = custom
+debug_init_cmds =
+ target extended-remote localhost:3333
+ $INIT_BREAK
+ monitor reset halt
+ $LOAD_CMDS
+ monitor init
+ monitor reset halt
+
+# add our variants files to the include and src paths
+build_flags = ${rp2040_base.build_flags}
+ -DRPI_PICO
+ -Ivariants/rpipico_slowclock
+ -DDEBUG_RP2040_PORT=Serial2
+ -DHW_SPI1_DEVICE
+ -L "${platformio.libdeps_dir}/${this.__env__}/BSEC2 Software Library/src/cortex-m0plus"
+ -g
+ -DNO_USB
+lib_deps =
+ ${rp2040_base.lib_deps}
+debug_build_flags = ${rp2040_base.build_flags}
+ -g
+ -DNO_USB
\ No newline at end of file
diff --git a/variants/rpipico-slowclock/variant.h b/variants/rpipico-slowclock/variant.h
new file mode 100644
index 0000000000..fb97ec0fbf
--- /dev/null
+++ b/variants/rpipico-slowclock/variant.h
@@ -0,0 +1,87 @@
+#define ARDUINO_ARCH_AVR
+
+// Build with slow system clock enabled to reduce power consumption.
+#define RP2040_SLOW_CLOCK
+
+#ifdef RP2040_SLOW_CLOCK
+// Redefine UART1 serial log output to avoid collision with UART0 for GPS.
+#define SERIAL2_TX 4
+#define SERIAL2_RX 5
+// Reroute log output in SensorLib when USB is not available
+#define log_e(...) Serial2.printf(__VA_ARGS__)
+#define log_i(...) Serial2.printf(__VA_ARGS__)
+#define log_d(...) Serial2.printf(__VA_ARGS__)
+#endif
+
+// Expecting the Waveshare Pico GPS hat
+#define HAS_GPS 1
+
+// Enable OLED Screen
+#define HAS_SCREEN 1
+#define USE_SH1106 1
+#define RESET_OLED 13
+
+// Redefine I2C0 pins to avoid collision with UART1/Serial2.
+#define I2C_SDA 8
+#define I2C_SCL 9
+
+// Redefine Waveshare UPS-A/B I2C_1 pins:
+#define I2C_SDA1 6
+#define I2C_SCL1 7
+// Waveshare UPS-A/B uses a 0.01 Ohm shunt for the INA219 sensor
+#define INA219_MULTIPLIER 10.0f
+
+// Waveshare Pico GPS L76B pins:
+#define GPS_RX_PIN 1
+#define GPS_TX_PIN 0
+
+// Wakeup from backup mode
+// #define PIN_GPS_FORCE_ON 14
+// No GPS reset available
+#undef PIN_GPS_RESET
+/*
+ * For PPS output the resistor R20 needs to be populated with 0 Ohm
+ * on the Waveshare Pico GPS board.
+ */
+#define PIN_GPS_PPS 16
+/*
+ * For standby mode switching the resistor R18 needs to be populated
+ * with 0 Ohm on the Waveshare Pico GPS board.
+ */
+#define PIN_GPS_STANDBY 17
+
+#define BUTTON_PIN 18
+#define EXT_NOTIFY_OUT 22
+#define LED_PIN PIN_LED
+
+#define BATTERY_PIN 26
+// ratio of voltage divider = 3.0 (R17=200k, R18=100k)
+#define ADC_MULTIPLIER 3.1 // 3.0 + a bit for being optimistic
+#define BATTERY_SENSE_RESOLUTION_BITS ADC_RESOLUTION
+
+#define USE_SX1262
+
+#undef LORA_SCK
+#undef LORA_MISO
+#undef LORA_MOSI
+#undef LORA_CS
+
+#define LORA_SCK 10
+#define LORA_MISO 12
+#define LORA_MOSI 11
+#define LORA_CS 3
+
+#define LORA_DIO0 RADIOLIB_NC
+#define LORA_RESET 15
+#define LORA_DIO1 20
+#define LORA_DIO2 2
+#define LORA_DIO3 RADIOLIB_NC
+
+#ifdef USE_SX1262
+#define SX126X_CS LORA_CS
+#define SX126X_DIO1 LORA_DIO1
+#define SX126X_BUSY LORA_DIO2
+#define SX126X_RESET LORA_RESET
+#define SX126X_DIO2_AS_RF_SWITCH
+#define SX126X_DIO3_TCXO_VOLTAGE 1.8
+#endif
\ No newline at end of file
diff --git a/variants/t-deck/platformio.ini b/variants/t-deck/platformio.ini
index cb60333005..593fdae5e9 100644
--- a/variants/t-deck/platformio.ini
+++ b/variants/t-deck/platformio.ini
@@ -8,6 +8,7 @@ upload_protocol = esptool
build_flags = ${esp32_base.build_flags}
-DT_DECK
-DBOARD_HAS_PSRAM
+ -DMAX_THREADS=40
-DGPS_POWER_TOGGLE
-Ivariants/t-deck
diff --git a/version.properties b/version.properties
index 07fadd0d86..3cb488c167 100644
--- a/version.properties
+++ b/version.properties
@@ -1,4 +1,4 @@
[VERSION]
major = 2
minor = 3
-build = 1
+build = 1
\ No newline at end of file