diff --git a/platformio.ini b/platformio.ini
index bb051e5e2..5671ab513 100644
--- a/platformio.ini
+++ b/platformio.ini
@@ -70,6 +70,7 @@ src_filter = ${env.src_filter} -
; Common libs for environmental measurements (not included in native / portduino)
[environmental]
lib_deps =
+ adafruit/Adafruit BusIO@^1.11.4
adafruit/DHT sensor library@^1.4.1
adafruit/Adafruit Unified Sensor@^1.1.4
paulstoffregen/OneWire@^2.3.5
diff --git a/proto b/proto
index 6c790cef4..a3c790850 160000
--- a/proto
+++ b/proto
@@ -1 +1 @@
-Subproject commit 6c790cef4c500f02773986726e48d45d4a218b5d
+Subproject commit a3c790850d536eb11d898bd40fd7d58977703fac
diff --git a/src/Power.cpp b/src/Power.cpp
index 6c5301f15..e6fb9422d 100644
--- a/src/Power.cpp
+++ b/src/Power.cpp
@@ -100,12 +100,11 @@ class AnalogBatteryLevel : public HasBatteryLevel
#ifndef ADC_MULTIPLIER
#define ADC_MULTIPLIER 2.0
#endif
- // Override variant or default ADC_MULTIPLIER if we have the override pref
- float operativeAdcMultiplier = radioConfig.preferences.adc_multiplier_override > 0 ?
- radioConfig.preferences.adc_multiplier_override :
- ADC_MULTIPLIER;
#ifdef BATTERY_PIN
+ // Override variant or default ADC_MULTIPLIER if we have the override pref
+ float operativeAdcMultiplier = radioConfig.preferences.adc_multiplier_override > 0 ?
+ radioConfig.preferences.adc_multiplier_override : ADC_MULTIPLIER;
// Do not call analogRead() often.
const uint32_t min_read_interval = 5000;
if (millis() - last_read_time_ms > min_read_interval) {
diff --git a/src/esp32/ESP32Bluetooth.cpp b/src/esp32/ESP32Bluetooth.cpp
index 1816e7f6d..5ed46f119 100644
--- a/src/esp32/ESP32Bluetooth.cpp
+++ b/src/esp32/ESP32Bluetooth.cpp
@@ -23,9 +23,6 @@
// proccess at once
// static uint8_t trBytes[_max(_max(_max(_max(ToRadio_size, RadioConfig_size), User_size), MyNodeInfo_size), FromRadio_size)];
static uint8_t fromRadioBytes[FromRadio_size];
-static uint8_t toRadioBytes[ToRadio_size];
-
-static bool bleConnected;
NimBLECharacteristic *FromNumCharacteristic;
NimBLEServer *bleServer;
diff --git a/src/mesh/NodeDB.cpp b/src/mesh/NodeDB.cpp
index 660280fcb..c40849213 100644
--- a/src/mesh/NodeDB.cpp
+++ b/src/mesh/NodeDB.cpp
@@ -35,6 +35,7 @@ NodeDB nodeDB;
EXT_RAM_ATTR DeviceState devicestate;
MyNodeInfo &myNodeInfo = devicestate.my_node;
RadioConfig radioConfig;
+Config config;
ChannelFile channelFile;
/** The current change # for radio settings. Starts at 0 on boot and any time the radio settings
diff --git a/src/mesh/NodeDB.h b/src/mesh/NodeDB.h
index 4cea56068..d7cc44e85 100644
--- a/src/mesh/NodeDB.h
+++ b/src/mesh/NodeDB.h
@@ -12,6 +12,7 @@ extern DeviceState devicestate;
extern ChannelFile channelFile;
extern MyNodeInfo &myNodeInfo;
extern RadioConfig radioConfig;
+extern Config config;
extern User &owner;
/// Given a node, return how many seconds in the past (vs now) that we last heard from it
@@ -161,13 +162,17 @@ extern NodeDB nodeDB;
#define IF_ROUTER(routerVal, normalVal) ((radioConfig.preferences.role == Role_Router) ? (routerVal) : (normalVal))
+#define default_broadcast_interval_secs IF_ROUTER(12 * 60 * 60, 15 * 60)
+
+inline uint32_t getIntervalOrDefaultMs(uint32_t interval) {
+ if (interval > 0) return interval * 1000;
+ return default_broadcast_interval_secs * 1000;
+}
+
#define PREF_GET(name, defaultVal) \
inline uint32_t getPref_##name() { return radioConfig.preferences.name ? radioConfig.preferences.name : (defaultVal); }
PREF_GET(position_broadcast_secs, IF_ROUTER(12 * 60 * 60, 15 * 60))
-// Defaulting Telemetry to the same as position interval for now
-PREF_GET(telemetry_module_device_update_interval, IF_ROUTER(12 * 60 * 60, 15 * 60))
-PREF_GET(telemetry_module_environment_update_interval, IF_ROUTER(12 * 60 * 60, 15 * 60))
// Each time we wake into the DARK state allow 1 minute to send and receive BLE packets to the phone
diff --git a/src/mesh/generated/admin.pb.c b/src/mesh/generated/admin.pb.c
index 688cba334..aab68eb8f 100644
--- a/src/mesh/generated/admin.pb.c
+++ b/src/mesh/generated/admin.pb.c
@@ -10,3 +10,4 @@ PB_BIND(AdminMessage, AdminMessage, 2)
+
diff --git a/src/mesh/generated/admin.pb.h b/src/mesh/generated/admin.pb.h
index 13ec47ca2..c4c2a716f 100644
--- a/src/mesh/generated/admin.pb.h
+++ b/src/mesh/generated/admin.pb.h
@@ -29,7 +29,7 @@ typedef enum _AdminMessage_ConfigType {
AdminMessage_ConfigType_MODULE_EXTNOTIF_CONFIG = 11,
AdminMessage_ConfigType_MODULE_STOREFORWARD_CONFIG = 12,
AdminMessage_ConfigType_MODULE_RANGETEST_CONFIG = 13,
- AdminMessage_ConfigType_MODULE_ENVIRONMENTAL_CONFIG = 14,
+ AdminMessage_ConfigType_MODULE_TELEMETRY_CONFIG = 14,
AdminMessage_ConfigType_MODULE_CANNEDMSG_CONFIG = 15
} AdminMessage_ConfigType;
@@ -165,7 +165,7 @@ extern const pb_msgdesc_t AdminMessage_msg;
/* Maximum encoded size of messages (where known) */
#if defined(Config_size)
#define AdminMessage_size (0 + sizeof(union AdminMessage_variant_size_union))
-union AdminMessage_variant_size_union {char f0[598]; char f11[(6 + Config_size)];};
+union AdminMessage_variant_size_union {char f11[(6 + Config_size)]; char f0[551];};
#endif
#ifdef __cplusplus
diff --git a/src/mesh/generated/config.pb.h b/src/mesh/generated/config.pb.h
index cb7923d14..a8e78161d 100644
--- a/src/mesh/generated/config.pb.h
+++ b/src/mesh/generated/config.pb.h
@@ -4,6 +4,7 @@
#ifndef PB_CONFIG_PB_H_INCLUDED
#define PB_CONFIG_PB_H_INCLUDED
#include
+#include "telemetry.pb.h"
#if PB_PROTO_HEADER_VERSION != 40
#error Regenerate this file with the current version of nanopb generator.
@@ -50,14 +51,28 @@ typedef struct _Config_ModuleConfig_StoreForwardConfig {
char dummy_field;
} Config_ModuleConfig_StoreForwardConfig;
-typedef struct _Config_ModuleConfig_TelemetryConfig {
- char dummy_field;
-} Config_ModuleConfig_TelemetryConfig;
-
typedef struct _Config_PowerConfig {
char dummy_field;
} Config_PowerConfig;
+typedef struct _Config_ModuleConfig_TelemetryConfig {
+ uint32_t device_update_interval;
+ uint32_t environment_update_interval;
+ bool environment_measurement_enabled;
+ bool environment_screen_enabled;
+ uint32_t environment_read_error_count_threshold;
+ uint32_t environment_recovery_interval;
+ bool environment_display_fahrenheit;
+ TelemetrySensorType environment_sensor_type;
+ uint32_t environment_sensor_pin;
+} Config_ModuleConfig_TelemetryConfig;
+
+typedef struct _Config_WiFiConfig {
+ pb_callback_t wifi_ssid;
+ pb_callback_t wifi_password;
+ bool wifi_ap_mode;
+} Config_WiFiConfig;
+
typedef struct _Config_ModuleConfig {
pb_size_t which_payloadVariant;
union {
@@ -71,12 +86,6 @@ typedef struct _Config_ModuleConfig {
} payloadVariant;
} Config_ModuleConfig;
-typedef struct _Config_WiFiConfig {
- pb_callback_t wifi_ssid;
- pb_callback_t wifi_password;
- bool wifi_ap_mode;
-} Config_WiFiConfig;
-
typedef struct _Config {
/* TODO: REPLACE */
pb_size_t which_payloadVariant;
@@ -110,7 +119,7 @@ extern "C" {
#define Config_ModuleConfig_ExternalNotificationConfig_init_default {0}
#define Config_ModuleConfig_StoreForwardConfig_init_default {0}
#define Config_ModuleConfig_RangeTestConfig_init_default {0}
-#define Config_ModuleConfig_TelemetryConfig_init_default {0}
+#define Config_ModuleConfig_TelemetryConfig_init_default {0, 0, 0, 0, 0, 0, 0, _TelemetrySensorType_MIN, 0}
#define Config_ModuleConfig_CannedMessageConfig_init_default {0}
#define Config_init_zero {0, {Config_DeviceConfig_init_zero}}
#define Config_DeviceConfig_init_zero {0}
@@ -125,10 +134,22 @@ extern "C" {
#define Config_ModuleConfig_ExternalNotificationConfig_init_zero {0}
#define Config_ModuleConfig_StoreForwardConfig_init_zero {0}
#define Config_ModuleConfig_RangeTestConfig_init_zero {0}
-#define Config_ModuleConfig_TelemetryConfig_init_zero {0}
+#define Config_ModuleConfig_TelemetryConfig_init_zero {0, 0, 0, 0, 0, 0, 0, _TelemetrySensorType_MIN, 0}
#define Config_ModuleConfig_CannedMessageConfig_init_zero {0}
/* Field tags (for use in manual encoding/decoding) */
+#define Config_ModuleConfig_TelemetryConfig_device_update_interval_tag 1
+#define Config_ModuleConfig_TelemetryConfig_environment_update_interval_tag 2
+#define Config_ModuleConfig_TelemetryConfig_environment_measurement_enabled_tag 3
+#define Config_ModuleConfig_TelemetryConfig_environment_screen_enabled_tag 4
+#define Config_ModuleConfig_TelemetryConfig_environment_read_error_count_threshold_tag 5
+#define Config_ModuleConfig_TelemetryConfig_environment_recovery_interval_tag 6
+#define Config_ModuleConfig_TelemetryConfig_environment_display_fahrenheit_tag 7
+#define Config_ModuleConfig_TelemetryConfig_environment_sensor_type_tag 8
+#define Config_ModuleConfig_TelemetryConfig_environment_sensor_pin_tag 9
+#define Config_WiFiConfig_wifi_ssid_tag 1
+#define Config_WiFiConfig_wifi_password_tag 2
+#define Config_WiFiConfig_wifi_ap_mode_tag 3
#define Config_ModuleConfig_mqtt_config_tag 1
#define Config_ModuleConfig_serial_config_tag 2
#define Config_ModuleConfig_external_notification_config_tag 3
@@ -136,9 +157,6 @@ extern "C" {
#define Config_ModuleConfig_range_test_config_tag 5
#define Config_ModuleConfig_telemetry_config_tag 6
#define Config_ModuleConfig_canned_message_config_tag 7
-#define Config_WiFiConfig_wifi_ssid_tag 1
-#define Config_WiFiConfig_wifi_password_tag 2
-#define Config_WiFiConfig_wifi_ap_mode_tag 3
#define Config_device_config_tag 1
#define Config_gps_config_tag 2
#define Config_power_config_tag 3
@@ -242,7 +260,15 @@ X(a, STATIC, ONEOF, MESSAGE, (payloadVariant,canned_message_config,payload
#define Config_ModuleConfig_RangeTestConfig_DEFAULT NULL
#define Config_ModuleConfig_TelemetryConfig_FIELDLIST(X, a) \
-
+X(a, STATIC, SINGULAR, UINT32, device_update_interval, 1) \
+X(a, STATIC, SINGULAR, UINT32, environment_update_interval, 2) \
+X(a, STATIC, SINGULAR, BOOL, environment_measurement_enabled, 3) \
+X(a, STATIC, SINGULAR, BOOL, environment_screen_enabled, 4) \
+X(a, STATIC, SINGULAR, UINT32, environment_read_error_count_threshold, 5) \
+X(a, STATIC, SINGULAR, UINT32, environment_recovery_interval, 6) \
+X(a, STATIC, SINGULAR, BOOL, environment_display_fahrenheit, 7) \
+X(a, STATIC, SINGULAR, UENUM, environment_sensor_type, 8) \
+X(a, STATIC, SINGULAR, UINT32, environment_sensor_pin, 9)
#define Config_ModuleConfig_TelemetryConfig_CALLBACK NULL
#define Config_ModuleConfig_TelemetryConfig_DEFAULT NULL
@@ -297,8 +323,8 @@ extern const pb_msgdesc_t Config_ModuleConfig_CannedMessageConfig_msg;
#define Config_ModuleConfig_RangeTestConfig_size 0
#define Config_ModuleConfig_SerialConfig_size 0
#define Config_ModuleConfig_StoreForwardConfig_size 0
-#define Config_ModuleConfig_TelemetryConfig_size 0
-#define Config_ModuleConfig_size 2
+#define Config_ModuleConfig_TelemetryConfig_size 38
+#define Config_ModuleConfig_size 40
#define Config_PowerConfig_size 0
#ifdef __cplusplus
diff --git a/src/mesh/generated/radioconfig.pb.c b/src/mesh/generated/radioconfig.pb.c
index 47b4f3903..a5de74964 100644
--- a/src/mesh/generated/radioconfig.pb.c
+++ b/src/mesh/generated/radioconfig.pb.c
@@ -21,4 +21,3 @@ PB_BIND(RadioConfig_UserPreferences, RadioConfig_UserPreferences, 2)
-
diff --git a/src/mesh/generated/radioconfig.pb.h b/src/mesh/generated/radioconfig.pb.h
index b6a50bb90..343c32450 100644
--- a/src/mesh/generated/radioconfig.pb.h
+++ b/src/mesh/generated/radioconfig.pb.h
@@ -237,31 +237,6 @@ typedef enum _RadioConfig_UserPreferences_Serial_Mode {
RadioConfig_UserPreferences_Serial_Mode_MODE_PROTO = 2
} RadioConfig_UserPreferences_Serial_Mode;
-/* Sets the charge control current of devices with a battery charger that can be
- configured. This is passed into the axp power management chip like on the tbeam. */
-typedef enum _RadioConfig_UserPreferences_TelemetrySensorType {
- /* TODO: REPLACE */
- RadioConfig_UserPreferences_TelemetrySensorType_None = 0,
- /* TODO: REPLACE */
- RadioConfig_UserPreferences_TelemetrySensorType_DHT11 = 1,
- /* TODO: REPLACE */
- RadioConfig_UserPreferences_TelemetrySensorType_DS18B20 = 2,
- /* TODO: REPLACE */
- RadioConfig_UserPreferences_TelemetrySensorType_DHT12 = 3,
- /* TODO: REPLACE */
- RadioConfig_UserPreferences_TelemetrySensorType_DHT21 = 4,
- /* TODO: REPLACE */
- RadioConfig_UserPreferences_TelemetrySensorType_DHT22 = 5,
- /* TODO: REPLACE */
- RadioConfig_UserPreferences_TelemetrySensorType_BME280 = 6,
- /* TODO: REPLACE */
- RadioConfig_UserPreferences_TelemetrySensorType_BME680 = 7,
- /* TODO: REPLACE */
- RadioConfig_UserPreferences_TelemetrySensorType_MCP9808 = 8,
- /* TODO: REPLACE */
- RadioConfig_UserPreferences_TelemetrySensorType_SHTC3 = 9
-} RadioConfig_UserPreferences_TelemetrySensorType;
-
/* Struct definitions */
typedef struct _RadioConfig_UserPreferences {
uint32_t position_broadcast_secs;
@@ -314,14 +289,6 @@ typedef struct _RadioConfig_UserPreferences {
uint32_t store_forward_module_records;
uint32_t store_forward_module_history_return_max;
uint32_t store_forward_module_history_return_window;
- bool telemetry_module_environment_measurement_enabled;
- bool telemetry_module_environment_screen_enabled;
- uint32_t telemetry_module_environment_read_error_count_threshold;
- uint32_t telemetry_module_device_update_interval;
- uint32_t telemetry_module_environment_recovery_interval;
- bool telemetry_module_environment_display_fahrenheit;
- RadioConfig_UserPreferences_TelemetrySensorType telemetry_module_environment_sensor_type;
- uint32_t telemetry_module_environment_sensor_pin;
bool store_forward_module_enabled;
bool store_forward_module_heartbeat;
uint32_t position_flags;
@@ -347,7 +314,6 @@ typedef struct _RadioConfig_UserPreferences {
bool mqtt_encryption_enabled;
float adc_multiplier_override;
RadioConfig_UserPreferences_Serial_Baud serial_module_baud;
- uint32_t telemetry_module_environment_update_interval;
} RadioConfig_UserPreferences;
/* The entire set of user settable/readable settings for our radio device.
@@ -393,10 +359,6 @@ typedef struct _RadioConfig {
#define _RadioConfig_UserPreferences_Serial_Mode_MAX RadioConfig_UserPreferences_Serial_Mode_MODE_PROTO
#define _RadioConfig_UserPreferences_Serial_Mode_ARRAYSIZE ((RadioConfig_UserPreferences_Serial_Mode)(RadioConfig_UserPreferences_Serial_Mode_MODE_PROTO+1))
-#define _RadioConfig_UserPreferences_TelemetrySensorType_MIN RadioConfig_UserPreferences_TelemetrySensorType_None
-#define _RadioConfig_UserPreferences_TelemetrySensorType_MAX RadioConfig_UserPreferences_TelemetrySensorType_SHTC3
-#define _RadioConfig_UserPreferences_TelemetrySensorType_ARRAYSIZE ((RadioConfig_UserPreferences_TelemetrySensorType)(RadioConfig_UserPreferences_TelemetrySensorType_SHTC3+1))
-
#ifdef __cplusplus
extern "C" {
@@ -404,9 +366,9 @@ extern "C" {
/* Initializer values for message structs */
#define RadioConfig_init_default {false, RadioConfig_UserPreferences_init_default}
-#define RadioConfig_UserPreferences_init_default {0, 0, 0, 0, 0, 0, 0, 0, "", "", 0, _RegionCode_MIN, _ChargeCurrent_MIN, 0, _Role_MIN, 0, 0, 0, 0, 0, 0, 0, 0, "", 0, _GpsCoordinateFormat_MIN, 0, 0, 0, 0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, _RadioConfig_UserPreferences_Serial_Mode_MIN, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, _RadioConfig_UserPreferences_TelemetrySensorType_MIN, 0, 0, 0, 0, 0, 0, 0, 0, "", "", 0, 0, 0, 0, 0, 0, _InputEventChar_MIN, _InputEventChar_MIN, _InputEventChar_MIN, 0, 0, "", 0, 0, 0, _RadioConfig_UserPreferences_Serial_Baud_MIN, 0}
+#define RadioConfig_UserPreferences_init_default {0, 0, 0, 0, 0, 0, 0, 0, "", "", 0, _RegionCode_MIN, _ChargeCurrent_MIN, 0, _Role_MIN, 0, 0, 0, 0, 0, 0, 0, 0, "", 0, _GpsCoordinateFormat_MIN, 0, 0, 0, 0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, _RadioConfig_UserPreferences_Serial_Mode_MIN, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "", "", 0, 0, 0, 0, 0, 0, _InputEventChar_MIN, _InputEventChar_MIN, _InputEventChar_MIN, 0, 0, "", 0, 0, 0, _RadioConfig_UserPreferences_Serial_Baud_MIN}
#define RadioConfig_init_zero {false, RadioConfig_UserPreferences_init_zero}
-#define RadioConfig_UserPreferences_init_zero {0, 0, 0, 0, 0, 0, 0, 0, "", "", 0, _RegionCode_MIN, _ChargeCurrent_MIN, 0, _Role_MIN, 0, 0, 0, 0, 0, 0, 0, 0, "", 0, _GpsCoordinateFormat_MIN, 0, 0, 0, 0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, _RadioConfig_UserPreferences_Serial_Mode_MIN, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, _RadioConfig_UserPreferences_TelemetrySensorType_MIN, 0, 0, 0, 0, 0, 0, 0, 0, "", "", 0, 0, 0, 0, 0, 0, _InputEventChar_MIN, _InputEventChar_MIN, _InputEventChar_MIN, 0, 0, "", 0, 0, 0, _RadioConfig_UserPreferences_Serial_Baud_MIN, 0}
+#define RadioConfig_UserPreferences_init_zero {0, 0, 0, 0, 0, 0, 0, 0, "", "", 0, _RegionCode_MIN, _ChargeCurrent_MIN, 0, _Role_MIN, 0, 0, 0, 0, 0, 0, 0, 0, "", 0, _GpsCoordinateFormat_MIN, 0, 0, 0, 0, 0, {0, 0, 0}, 0, 0, 0, 0, 0, _RadioConfig_UserPreferences_Serial_Mode_MIN, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "", "", 0, 0, 0, 0, 0, 0, _InputEventChar_MIN, _InputEventChar_MIN, _InputEventChar_MIN, 0, 0, "", 0, 0, 0, _RadioConfig_UserPreferences_Serial_Baud_MIN}
/* Field tags (for use in manual encoding/decoding) */
#define RadioConfig_UserPreferences_position_broadcast_secs_tag 1
@@ -458,14 +420,6 @@ extern "C" {
#define RadioConfig_UserPreferences_store_forward_module_records_tag 137
#define RadioConfig_UserPreferences_store_forward_module_history_return_max_tag 138
#define RadioConfig_UserPreferences_store_forward_module_history_return_window_tag 139
-#define RadioConfig_UserPreferences_telemetry_module_environment_measurement_enabled_tag 140
-#define RadioConfig_UserPreferences_telemetry_module_environment_screen_enabled_tag 141
-#define RadioConfig_UserPreferences_telemetry_module_environment_read_error_count_threshold_tag 142
-#define RadioConfig_UserPreferences_telemetry_module_device_update_interval_tag 143
-#define RadioConfig_UserPreferences_telemetry_module_environment_recovery_interval_tag 144
-#define RadioConfig_UserPreferences_telemetry_module_environment_display_fahrenheit_tag 145
-#define RadioConfig_UserPreferences_telemetry_module_environment_sensor_type_tag 146
-#define RadioConfig_UserPreferences_telemetry_module_environment_sensor_pin_tag 147
#define RadioConfig_UserPreferences_store_forward_module_enabled_tag 148
#define RadioConfig_UserPreferences_store_forward_module_heartbeat_tag 149
#define RadioConfig_UserPreferences_position_flags_tag 150
@@ -491,7 +445,6 @@ extern "C" {
#define RadioConfig_UserPreferences_mqtt_encryption_enabled_tag 174
#define RadioConfig_UserPreferences_adc_multiplier_override_tag 175
#define RadioConfig_UserPreferences_serial_module_baud_tag 176
-#define RadioConfig_UserPreferences_telemetry_module_environment_update_interval_tag 177
#define RadioConfig_preferences_tag 1
/* Struct field encoding specification for nanopb */
@@ -551,14 +504,6 @@ X(a, STATIC, SINGULAR, BOOL, range_test_module_save, 134) \
X(a, STATIC, SINGULAR, UINT32, store_forward_module_records, 137) \
X(a, STATIC, SINGULAR, UINT32, store_forward_module_history_return_max, 138) \
X(a, STATIC, SINGULAR, UINT32, store_forward_module_history_return_window, 139) \
-X(a, STATIC, SINGULAR, BOOL, telemetry_module_environment_measurement_enabled, 140) \
-X(a, STATIC, SINGULAR, BOOL, telemetry_module_environment_screen_enabled, 141) \
-X(a, STATIC, SINGULAR, UINT32, telemetry_module_environment_read_error_count_threshold, 142) \
-X(a, STATIC, SINGULAR, UINT32, telemetry_module_device_update_interval, 143) \
-X(a, STATIC, SINGULAR, UINT32, telemetry_module_environment_recovery_interval, 144) \
-X(a, STATIC, SINGULAR, BOOL, telemetry_module_environment_display_fahrenheit, 145) \
-X(a, STATIC, SINGULAR, UENUM, telemetry_module_environment_sensor_type, 146) \
-X(a, STATIC, SINGULAR, UINT32, telemetry_module_environment_sensor_pin, 147) \
X(a, STATIC, SINGULAR, BOOL, store_forward_module_enabled, 148) \
X(a, STATIC, SINGULAR, BOOL, store_forward_module_heartbeat, 149) \
X(a, STATIC, SINGULAR, UINT32, position_flags, 150) \
@@ -583,8 +528,7 @@ X(a, STATIC, SINGULAR, STRING, canned_message_module_allow_input_source, 171
X(a, STATIC, SINGULAR, BOOL, canned_message_module_send_bell, 173) \
X(a, STATIC, SINGULAR, BOOL, mqtt_encryption_enabled, 174) \
X(a, STATIC, SINGULAR, FLOAT, adc_multiplier_override, 175) \
-X(a, STATIC, SINGULAR, UENUM, serial_module_baud, 176) \
-X(a, STATIC, SINGULAR, UINT32, telemetry_module_environment_update_interval, 177)
+X(a, STATIC, SINGULAR, UENUM, serial_module_baud, 176)
#define RadioConfig_UserPreferences_CALLBACK NULL
#define RadioConfig_UserPreferences_DEFAULT NULL
@@ -596,8 +540,8 @@ extern const pb_msgdesc_t RadioConfig_UserPreferences_msg;
#define RadioConfig_UserPreferences_fields &RadioConfig_UserPreferences_msg
/* Maximum encoded size of messages (where known) */
-#define RadioConfig_UserPreferences_size 592
-#define RadioConfig_size 595
+#define RadioConfig_UserPreferences_size 545
+#define RadioConfig_size 548
#ifdef __cplusplus
} /* extern "C" */
diff --git a/src/mesh/generated/telemetry.pb.c b/src/mesh/generated/telemetry.pb.c
index 674a2f84d..a2d812cad 100644
--- a/src/mesh/generated/telemetry.pb.c
+++ b/src/mesh/generated/telemetry.pb.c
@@ -16,3 +16,4 @@ PB_BIND(Telemetry, Telemetry, AUTO)
+
diff --git a/src/mesh/generated/telemetry.pb.h b/src/mesh/generated/telemetry.pb.h
index b3bf3df1d..6c9db655c 100644
--- a/src/mesh/generated/telemetry.pb.h
+++ b/src/mesh/generated/telemetry.pb.h
@@ -9,6 +9,31 @@
#error Regenerate this file with the current version of nanopb generator.
#endif
+/* Enum definitions */
+/* TODO: REPLACE */
+typedef enum _TelemetrySensorType {
+ /* No external telemetry sensor */
+ TelemetrySensorType_NotSet = 0,
+ /* TODO: REPLACE */
+ TelemetrySensorType_DHT11 = 1,
+ /* TODO: REPLACE */
+ TelemetrySensorType_DS18B20 = 2,
+ /* TODO: REPLACE */
+ TelemetrySensorType_DHT12 = 3,
+ /* TODO: REPLACE */
+ TelemetrySensorType_DHT21 = 4,
+ /* TODO: REPLACE */
+ TelemetrySensorType_DHT22 = 5,
+ /* TODO: REPLACE */
+ TelemetrySensorType_BME280 = 6,
+ /* TODO: REPLACE */
+ TelemetrySensorType_BME680 = 7,
+ /* TODO: REPLACE */
+ TelemetrySensorType_MCP9808 = 8,
+ /* TODO: REPLACE */
+ TelemetrySensorType_SHTC3 = 9
+} TelemetrySensorType;
+
/* Struct definitions */
/* Key native device metrics such as battery level */
typedef struct _DeviceMetrics {
@@ -55,6 +80,12 @@ typedef struct _Telemetry {
} Telemetry;
+/* Helper constants for enums */
+#define _TelemetrySensorType_MIN TelemetrySensorType_NotSet
+#define _TelemetrySensorType_MAX TelemetrySensorType_SHTC3
+#define _TelemetrySensorType_ARRAYSIZE ((TelemetrySensorType)(TelemetrySensorType_SHTC3+1))
+
+
#ifdef __cplusplus
extern "C" {
#endif
diff --git a/src/modules/AdminModule.cpp b/src/modules/AdminModule.cpp
index 8b018092f..9d5e161c8 100644
--- a/src/modules/AdminModule.cpp
+++ b/src/modules/AdminModule.cpp
@@ -124,9 +124,12 @@ void AdminModule::handleGetConfig(const MeshPacket &req)
DEBUG_MSG("Requesting AdminMessage_ConfigType_MODULE_RANGETEST_CONFIG\n");
r.get_config_response.which_payloadVariant = AdminMessage_ConfigType_MODULE_RANGETEST_CONFIG;
break;
- case AdminMessage_ConfigType_MODULE_ENVIRONMENTAL_CONFIG:
- DEBUG_MSG("Requesting AdminMessage_ConfigType_MODULE_ENVIRONMENTAL_CONFIG\n");
- r.get_config_response.which_payloadVariant = AdminMessage_ConfigType_MODULE_ENVIRONMENTAL_CONFIG;
+ case AdminMessage_ConfigType_MODULE_TELEMETRY_CONFIG:
+ DEBUG_MSG("Requesting AdminMessage_ConfigType_MODULE_TELEMETRY_CONFIG\n");
+ r.get_config_response.which_payloadVariant = AdminMessage_ConfigType_MODULE_TELEMETRY_CONFIG;
+ r.get_config_response.payloadVariant.module_config.which_payloadVariant = Config_ModuleConfig_telemetry_config_tag;
+ r.get_config_response.payloadVariant.module_config.payloadVariant.telemetry_config =
+ config.payloadVariant.module_config.payloadVariant.telemetry_config;
break;
case AdminMessage_ConfigType_MODULE_CANNEDMSG_CONFIG:
DEBUG_MSG("Requesting AdminMessage_ConfigType_MODULE_CANNEDMSG_CONFIG\n");
diff --git a/src/modules/Telemetry/DeviceTelemetry.cpp b/src/modules/Telemetry/DeviceTelemetry.cpp
index 4568521c3..9ba59f5a1 100644
--- a/src/modules/Telemetry/DeviceTelemetry.cpp
+++ b/src/modules/Telemetry/DeviceTelemetry.cpp
@@ -20,7 +20,8 @@ int32_t DeviceTelemetryModule::runOnce()
}
sendOurTelemetry();
// OSThread library. Multiply the preference value by 1000 to convert seconds to miliseconds
- return (getPref_telemetry_module_device_update_interval() * 1000);
+
+ return getIntervalOrDefaultMs(moduleConfig.device_update_interval);
#endif
}
diff --git a/src/modules/Telemetry/DeviceTelemetry.h b/src/modules/Telemetry/DeviceTelemetry.h
index c224a2c1d..07c781645 100644
--- a/src/modules/Telemetry/DeviceTelemetry.h
+++ b/src/modules/Telemetry/DeviceTelemetry.h
@@ -1,6 +1,7 @@
#pragma once
#include "../mesh/generated/telemetry.pb.h"
#include "ProtobufModule.h"
+#include "NodeDB.h"
#include
#include
@@ -27,6 +28,7 @@ class DeviceTelemetryModule : private concurrency::OSThread, public ProtobufModu
bool sendOurTelemetry(NodeNum dest = NODENUM_BROADCAST, bool wantReplies = false);
private:
+ Config_ModuleConfig_TelemetryConfig moduleConfig = config.payloadVariant.module_config.payloadVariant.telemetry_config;
bool firstTime = 1;
const MeshPacket *lastMeasurementPacket;
};
diff --git a/src/modules/Telemetry/EnvironmentTelemetry.cpp b/src/modules/Telemetry/EnvironmentTelemetry.cpp
index 0257fe311..2735f5ef1 100644
--- a/src/modules/Telemetry/EnvironmentTelemetry.cpp
+++ b/src/modules/Telemetry/EnvironmentTelemetry.cpp
@@ -50,17 +50,17 @@ int32_t EnvironmentTelemetryModule::runOnce()
without having to configure it from the PythonAPI or WebUI.
*/
/*
- radioConfig.preferences.telemetry_module_environment_measurement_enabled = 1;
- radioConfig.preferences.telemetry_module_environment_screen_enabled = 1;
- radioConfig.preferences.telemetry_module_environment_read_error_count_threshold = 5;
- radioConfig.preferences.telemetry_module_environment_update_interval = 600;
- radioConfig.preferences.telemetry_module_environment_recovery_interval = 60;
- radioConfig.preferences.telemetry_module_environment_sensor_pin = 13; // If one-wire
- radioConfig.preferences.telemetry_module_environment_sensor_type = RadioConfig_UserPreferences_TelemetrySensorType::RadioConfig_UserPreferences_TelemetrySensorType_BME280;
+ moduleConfig.environment_measurement_enabled = 1;
+ moduleConfig.environment_screen_enabled = 1;
+ moduleConfig.environment_read_error_count_threshold = 5;
+ moduleConfig.environment_update_interval = 600;
+ moduleConfig.environment_recovery_interval = 60;
+ moduleConfig.environment_sensor_pin = 13; // If one-wire
+ moduleConfig.environment_sensor_type = TelemetrySensorType::TelemetrySensorType_BME280;
*/
- if (!(radioConfig.preferences.telemetry_module_environment_measurement_enabled ||
- radioConfig.preferences.telemetry_module_environment_screen_enabled)) {
+ if (!(moduleConfig.environment_measurement_enabled ||
+ moduleConfig.environment_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 (INT32_MAX);
}
@@ -69,24 +69,24 @@ int32_t EnvironmentTelemetryModule::runOnce()
// This is the first time the OSThread library has called this function, so do some setup
firstTime = 0;
- if (radioConfig.preferences.telemetry_module_environment_measurement_enabled) {
+ if (moduleConfig.environment_measurement_enabled) {
DEBUG_MSG("Environment Telemetry: Initializing\n");
// it's possible to have this module enabled, only for displaying values on the screen.
// therefore, we should only enable the sensor loop if measurement is also enabled
- switch (radioConfig.preferences.telemetry_module_environment_sensor_type) {
+ switch (moduleConfig.environment_sensor_type) {
- case RadioConfig_UserPreferences_TelemetrySensorType_DHT11:
- case RadioConfig_UserPreferences_TelemetrySensorType_DHT12:
- case RadioConfig_UserPreferences_TelemetrySensorType_DHT21:
- case RadioConfig_UserPreferences_TelemetrySensorType_DHT22:
+ case TelemetrySensorType_DHT11:
+ case TelemetrySensorType_DHT12:
+ case TelemetrySensorType_DHT21:
+ case TelemetrySensorType_DHT22:
return dhtSensor.runOnce();
- case RadioConfig_UserPreferences_TelemetrySensorType_DS18B20:
+ case TelemetrySensorType_DS18B20:
return dallasSensor.runOnce();
- case RadioConfig_UserPreferences_TelemetrySensorType_BME280:
+ case TelemetrySensorType_BME280:
return bme280Sensor.runOnce();
- case RadioConfig_UserPreferences_TelemetrySensorType_BME680:
+ case TelemetrySensorType_BME680:
return bme680Sensor.runOnce();
- case RadioConfig_UserPreferences_TelemetrySensorType_MCP9808:
+ case TelemetrySensorType_MCP9808:
return mcp9808Sensor.runOnce();
default:
DEBUG_MSG("Environment Telemetry: Invalid sensor type selected; Disabling module");
@@ -97,55 +97,54 @@ int32_t EnvironmentTelemetryModule::runOnce()
return (INT32_MAX);
} else {
// if we somehow got to a second run of this module with measurement disabled, then just wait forever
- if (!radioConfig.preferences.telemetry_module_environment_measurement_enabled)
+ if (!moduleConfig.environment_measurement_enabled)
return (INT32_MAX);
// this is not the first time OSThread library has called this function
// so just do what we intend to do on the interval
- if (sensor_read_error_count > radioConfig.preferences.telemetry_module_environment_read_error_count_threshold) {
- if (radioConfig.preferences.telemetry_module_environment_recovery_interval > 0) {
+ if (sensor_read_error_count > moduleConfig.environment_read_error_count_threshold) {
+ if (moduleConfig.environment_recovery_interval > 0) {
DEBUG_MSG("Environment Telemetry: TEMPORARILY DISABLED; The "
"telemetry_module_environment_read_error_count_threshold has been exceed: %d. Will retry reads in "
"%d seconds\n",
- radioConfig.preferences.telemetry_module_environment_read_error_count_threshold,
- radioConfig.preferences.telemetry_module_environment_recovery_interval);
+ moduleConfig.environment_read_error_count_threshold,
+ moduleConfig.environment_recovery_interval);
sensor_read_error_count = 0;
- return (radioConfig.preferences.telemetry_module_environment_recovery_interval * 1000);
+ return (moduleConfig.environment_recovery_interval * 1000);
}
DEBUG_MSG("Environment Telemetry: DISABLED; The telemetry_module_environment_read_error_count_threshold has "
"been exceed: %d. Reads will not be retried until after device reset\n",
- radioConfig.preferences.telemetry_module_environment_read_error_count_threshold);
+ moduleConfig.environment_read_error_count_threshold);
return (INT32_MAX);
} else if (sensor_read_error_count > 0) {
DEBUG_MSG("Environment Telemetry: There have been %d sensor read failures. Will retry %d more times\n",
sensor_read_error_count, sensor_read_error_count, sensor_read_error_count,
- radioConfig.preferences.telemetry_module_environment_read_error_count_threshold -
+ moduleConfig.environment_read_error_count_threshold -
sensor_read_error_count);
}
if (!sendOurTelemetry()) {
// if we failed to read the sensor, then try again
// as soon as we can according to the maximum polling frequency
- switch (radioConfig.preferences.telemetry_module_environment_sensor_type) {
- case RadioConfig_UserPreferences_TelemetrySensorType_DHT11:
- case RadioConfig_UserPreferences_TelemetrySensorType_DHT12:
- case RadioConfig_UserPreferences_TelemetrySensorType_DHT21:
- case RadioConfig_UserPreferences_TelemetrySensorType_DHT22:
+ switch (moduleConfig.environment_sensor_type) {
+ case TelemetrySensorType_DHT11:
+ case TelemetrySensorType_DHT12:
+ case TelemetrySensorType_DHT21:
+ case TelemetrySensorType_DHT22:
return (DHT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS);
- case RadioConfig_UserPreferences_TelemetrySensorType_DS18B20:
+ case TelemetrySensorType_DS18B20:
return (DS18B20_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS);
- case RadioConfig_UserPreferences_TelemetrySensorType_BME280:
- case RadioConfig_UserPreferences_TelemetrySensorType_BME680:
+ case TelemetrySensorType_BME280:
+ case TelemetrySensorType_BME680:
return (BME_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS);
- case RadioConfig_UserPreferences_TelemetrySensorType_MCP9808:
+ case TelemetrySensorType_MCP9808:
return (MCP_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS);
default:
return (DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS);
}
}
}
- // OSThread library. Multiply the preference value by 1000 to convert seconds to miliseconds
- return (getPref_telemetry_module_environment_update_interval() * 1000);
+ return getIntervalOrDefaultMs(moduleConfig.environment_update_interval);
#endif
}
@@ -163,7 +162,7 @@ uint32_t GetTimeSinceMeshPacket(const MeshPacket *mp)
bool EnvironmentTelemetryModule::wantUIFrame()
{
- return radioConfig.preferences.telemetry_module_environment_screen_enabled;
+ return moduleConfig.environment_screen_enabled;
}
float EnvironmentTelemetryModule::CelsiusToFahrenheit(float c)
@@ -197,7 +196,7 @@ void EnvironmentTelemetryModule::drawFrame(OLEDDisplay *display, OLEDDisplayUiSt
display->setFont(FONT_SMALL);
String last_temp = String(lastMeasurement.variant.environment_metrics.temperature, 0) + "°C";
- if (radioConfig.preferences.telemetry_module_environment_display_fahrenheit) {
+ if (moduleConfig.environment_display_fahrenheit) {
last_temp = String(CelsiusToFahrenheit(lastMeasurement.variant.environment_metrics.temperature), 0) + "°F";
}
display->drawString(x, y += fontHeight(FONT_MEDIUM) - 2, "From: " + String(lastSender) + "(" + String(agoSecs) + "s)");
@@ -243,25 +242,25 @@ bool EnvironmentTelemetryModule::sendOurTelemetry(NodeNum dest, bool wantReplies
DEBUG_MSG("-----------------------------------------\n");
DEBUG_MSG("Environment Telemetry: Read data\n");
- switch (radioConfig.preferences.telemetry_module_environment_sensor_type) {
- case RadioConfig_UserPreferences_TelemetrySensorType_DS18B20:
+ switch (moduleConfig.environment_sensor_type) {
+ case TelemetrySensorType_DS18B20:
if (!dallasSensor.getMeasurement(&m))
sensor_read_error_count++;
break;
- case RadioConfig_UserPreferences_TelemetrySensorType_DHT11:
- case RadioConfig_UserPreferences_TelemetrySensorType_DHT12:
- case RadioConfig_UserPreferences_TelemetrySensorType_DHT21:
- case RadioConfig_UserPreferences_TelemetrySensorType_DHT22:
+ case TelemetrySensorType_DHT11:
+ case TelemetrySensorType_DHT12:
+ case TelemetrySensorType_DHT21:
+ case TelemetrySensorType_DHT22:
if (!dhtSensor.getMeasurement(&m))
sensor_read_error_count++;
break;
- case RadioConfig_UserPreferences_TelemetrySensorType_BME280:
+ case TelemetrySensorType_BME280:
bme280Sensor.getMeasurement(&m);
break;
- case RadioConfig_UserPreferences_TelemetrySensorType_BME680:
+ case TelemetrySensorType_BME680:
bme680Sensor.getMeasurement(&m);
break;
- case RadioConfig_UserPreferences_TelemetrySensorType_MCP9808:
+ case TelemetrySensorType_MCP9808:
mcp9808Sensor.getMeasurement(&m);
break;
default:
diff --git a/src/modules/Telemetry/EnvironmentTelemetry.h b/src/modules/Telemetry/EnvironmentTelemetry.h
index c1cdc9994..48360312f 100644
--- a/src/modules/Telemetry/EnvironmentTelemetry.h
+++ b/src/modules/Telemetry/EnvironmentTelemetry.h
@@ -1,6 +1,7 @@
#pragma once
#include "../mesh/generated/telemetry.pb.h"
#include "ProtobufModule.h"
+#include "NodeDB.h"
#include
#include
@@ -28,6 +29,7 @@ class EnvironmentTelemetryModule : private concurrency::OSThread, public Protobu
bool sendOurTelemetry(NodeNum dest = NODENUM_BROADCAST, bool wantReplies = false);
private:
+ Config_ModuleConfig_TelemetryConfig moduleConfig = config.payloadVariant.module_config.payloadVariant.telemetry_config;
float CelsiusToFahrenheit(float c);
bool firstTime = 1;
const MeshPacket *lastMeasurementPacket;
diff --git a/src/modules/Telemetry/Sensor/DHTSensor.cpp b/src/modules/Telemetry/Sensor/DHTSensor.cpp
index 063adced5..6711c4ce6 100644
--- a/src/modules/Telemetry/Sensor/DHTSensor.cpp
+++ b/src/modules/Telemetry/Sensor/DHTSensor.cpp
@@ -9,18 +9,18 @@ DHTSensor::DHTSensor() : TelemetrySensor {} {
}
int32_t DHTSensor::runOnce() {
- if (RadioConfig_UserPreferences_TelemetrySensorType_DHT11 ||
- RadioConfig_UserPreferences_TelemetrySensorType_DHT12) {
- dht = new DHT(radioConfig.preferences.telemetry_module_environment_sensor_pin, DHT11);
+ if (TelemetrySensorType_DHT11 ||
+ TelemetrySensorType_DHT12) {
+ dht = new DHT(moduleConfig.environment_sensor_pin, DHT11);
}
else {
- dht = new DHT(radioConfig.preferences.telemetry_module_environment_sensor_pin, DHT22);
+ dht = new DHT(moduleConfig.environment_sensor_pin, DHT22);
}
dht->begin();
dht->read();
DEBUG_MSG("Telemetry: Opened DHT11/DHT12 on pin: %d\n",
- radioConfig.preferences.telemetry_module_environment_sensor_pin);
+ moduleConfig.environment_sensor_pin);
return (DHT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS);
}
diff --git a/src/modules/Telemetry/Sensor/DallasSensor.cpp b/src/modules/Telemetry/Sensor/DallasSensor.cpp
index 1be369d79..f549a0af3 100644
--- a/src/modules/Telemetry/Sensor/DallasSensor.cpp
+++ b/src/modules/Telemetry/Sensor/DallasSensor.cpp
@@ -10,13 +10,13 @@ DallasSensor::DallasSensor() : TelemetrySensor {} {
}
int32_t DallasSensor::runOnce() {
- oneWire = new OneWire(radioConfig.preferences.telemetry_module_environment_sensor_pin);
+ oneWire = new OneWire(moduleConfig.environment_sensor_pin);
ds18b20 = new DS18B20(oneWire);
ds18b20->begin();
ds18b20->setResolution(12);
ds18b20->requestTemperatures();
DEBUG_MSG("Telemetry: Opened DS18B20 on pin: %d\n",
- radioConfig.preferences.telemetry_module_environment_sensor_pin);
+ moduleConfig.environment_sensor_pin);
return (DS18B20_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS);
}
diff --git a/src/modules/Telemetry/Sensor/TelemetrySensor.h b/src/modules/Telemetry/Sensor/TelemetrySensor.h
index 327ef8aaa..746a05621 100644
--- a/src/modules/Telemetry/Sensor/TelemetrySensor.h
+++ b/src/modules/Telemetry/Sensor/TelemetrySensor.h
@@ -1,11 +1,12 @@
#pragma once
#include "../mesh/generated/telemetry.pb.h"
+#include "NodeDB.h"
#define DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS 1000
class TelemetrySensor {
protected:
TelemetrySensor() { }
-
+ Config_ModuleConfig_TelemetryConfig moduleConfig = config.payloadVariant.module_config.payloadVariant.telemetry_config;
public:
virtual int32_t runOnce() = 0;
virtual bool getMeasurement(Telemetry *measurement) = 0;