Compare commits

...

5 Commits

Author SHA1 Message Date
Ben Meadors
c0d8602e7c WIP 2024-09-10 18:25:39 -05:00
Thomas Göttgens
8ab2e91df6 Merge pull request #4659 from meshtastic/create-pull-request/patch
Changes by create-pull-request action
2024-09-09 12:21:56 +02:00
Thomas Göttgens
e985ee878f Merge pull request #4658 from fifieldt/zombiegps
If GPS sleepTime is Zero, don't sleep.
2024-09-09 12:12:53 +02:00
thebentern
fabd6b0d6f [create-pull-request] automated change 2024-09-09 02:54:25 +00:00
Tom Fifield
ebe1b40bee If GPS sleepTime is Zero, don't sleep.
At the moment if the result of sleepTime calculations comes out
to zero, we put the GPS into HARDSLEEP (losing all its status) and
then immediately make it ACTIVE again.

This patch avoids that toga.

fixes https://github.com/meshtastic/firmware/issues/4657
2024-09-09 09:28:04 +08:00
9 changed files with 144 additions and 9 deletions

View File

@@ -151,13 +151,10 @@ lib_deps =
ClosedCube OPT3001@^1.1.2
emotibit/EmotiBit MLX90632@^1.0.8
dfrobot/DFRobot_RTU@^1.0.3
https://github.com/boschsensortec/Bosch-BSEC2-Library#v1.7.2502
boschsensortec/BME68x Sensor Library@^1.1.40407
https://github.com/KodinLanewave/INA3221@^1.0.0
lewisxhe/SensorLib@^0.2.0
mprograms/QMC5883LCompass@^1.2.0
https://github.com/meshtastic/DFRobot_LarkWeatherStation#dee914270dc7cb3e43fbf034edd85a63a16a12ee
https://github.com/meshtastic/DFRobot_LarkWeatherStation#dee914270dc7cb3e43fbf034edd85a63a16a12ee
https://github.com/meshtastic/i2c-sensor#8e97122268960593c8c279df1a84a29970136a8f

View File

@@ -52,7 +52,8 @@ class ScanI2C
AHT10,
BMX160,
DFROBOT_LARK,
NAU7802
NAU7802,
CUSTOM_SENSOR,
} DeviceType;
// typedef uint8_t DeviceAddress;

View File

@@ -7,6 +7,7 @@
#include "linux/LinuxHardwareI2C.h"
#endif
#if !defined(ARCH_PORTDUINO) && !defined(ARCH_STM32WL)
#include "I2CDefinitions.h"
#include "main.h" // atecc
#endif
@@ -377,6 +378,7 @@ void ScanI2CTwoWire::scanPort(I2CPort port, uint8_t *address, uint8_t asize)
SCAN_SIMPLE_CASE(OPT3001_ADDR, OPT3001, "OPT3001 light sensor found\n");
SCAN_SIMPLE_CASE(MLX90632_ADDR, MLX90632, "MLX90632 IR temp sensor found\n");
SCAN_SIMPLE_CASE(NAU7802_ADDR, NAU7802, "NAU7802 based scale found\n");
SCAN_SIMPLE_CASE(MT_I2C_ADDRESS, CUSTOM_SENSOR, "Meshtastic custom I2C sensor found\n");
default:
LOG_INFO("Device found at address 0x%x was not able to be enumerated\n", addr.address);

View File

@@ -1019,7 +1019,7 @@ void GPS::down()
LOG_DEBUG("%us until next search\n", sleepTime / 1000);
// If update interval less than 10 seconds, no attempt to sleep
if (updateInterval <= 10 * 1000UL)
if (updateInterval <= 10 * 1000UL || sleepTime == 0)
setPowerState(GPS_IDLE);
else {

View File

@@ -569,6 +569,7 @@ void setup()
SCANNER_TO_SENSORS_MAP(ScanI2C::DeviceType::SHT4X, meshtastic_TelemetrySensorType_SHT4X)
SCANNER_TO_SENSORS_MAP(ScanI2C::DeviceType::AHT10, meshtastic_TelemetrySensorType_AHT10)
SCANNER_TO_SENSORS_MAP(ScanI2C::DeviceType::DFROBOT_LARK, meshtastic_TelemetrySensorType_DFROBOT_LARK)
SCANNER_TO_SENSORS_MAP(ScanI2C::DeviceType::CUSTOM_SENSOR, meshtastic_TelemetrySensorType_CUSTOM_SENSOR)
i2cScanner.reset();
#endif

View File

@@ -24,6 +24,7 @@
#include "Sensor/BMP085Sensor.h"
#include "Sensor/BMP280Sensor.h"
#include "Sensor/BMP3XXSensor.h"
#include "Sensor/CustomI2CSensor.h"
#include "Sensor/DFRobotLarkSensor.h"
#include "Sensor/LPS22HBSensor.h"
#include "Sensor/MCP9808Sensor.h"
@@ -56,6 +57,7 @@ MLX90632Sensor mlx90632Sensor;
DFRobotLarkSensor dfRobotLarkSensor;
NAU7802Sensor nau7802Sensor;
BMP3XXSensor bmp3xxSensor;
CustomI2CSensor customI2CSensor;
#ifdef T1000X_SENSOR_EN
T1000xSensor t1000xSensor;
#endif
@@ -82,7 +84,7 @@ int32_t EnvironmentTelemetryModule::runOnce()
*/
// moduleConfig.telemetry.environment_measurement_enabled = 1;
// moduleConfig.telemetry.environment_screen_enabled = 1;
// moduleConfig.telemetry.environment_screen_enabled = 1;
// moduleConfig.telemetry.environment_update_interval = 15;
if (!(moduleConfig.telemetry.environment_measurement_enabled || moduleConfig.telemetry.environment_screen_enabled)) {
@@ -143,6 +145,8 @@ int32_t EnvironmentTelemetryModule::runOnce()
result = mlx90632Sensor.runOnce();
if (nau7802Sensor.hasSensor())
result = nau7802Sensor.runOnce();
if (customI2CSensor.hasSensor())
result = customI2CSensor.runOnce();
#endif
}
return result;
@@ -397,6 +401,10 @@ bool EnvironmentTelemetryModule::getEnvironmentTelemetry(meshtastic_Telemetry *m
m->variant.environment_metrics.relative_humidity = m_ahtx.variant.environment_metrics.relative_humidity;
}
}
if (customI2CSensor.hasSensor()) {
valid = valid && customI2CSensor.getMetrics(m);
hasSensor = true;
}
#endif
return valid && hasSensor;

View File

@@ -0,0 +1,107 @@
#include "configuration.h"
#if !MESHTASTIC_EXCLUDE_ENVIRONMENTAL_SENSOR
#include "../mesh/generated/meshtastic/telemetry.pb.h"
#include "CustomI2CSensor.h"
#include "I2CClient.h"
#include "I2CDefinitions.h"
#include "TelemetrySensor.h"
CustomI2CSensor::CustomI2CSensor() : TelemetrySensor(meshtastic_TelemetrySensorType_CUSTOM_SENSOR, "CUSTOM") {}
int32_t CustomI2CSensor::runOnce()
{
LOG_INFO("Init sensor: %s\n", sensorName);
if (!hasSensor()) {
return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS;
} else {
status = 1;
}
return initI2CSensor();
}
void CustomI2CSensor::setup()
{
// populates lastMetricsRecieved when data is received
Wire.requestFrom(MT_I2C_ADDRESS, meshtastic_EnvironmentMetrics_size);
Wire.onReceive(onReceiveMetrics);
}
bool CustomI2CSensor::getMetrics(meshtastic_Telemetry *measurement)
{
// Wire.requestFrom(MT_I2C_ADDRESS, meshtastic_EnvironmentMetrics_size);
// auto length = Wire.available();
// LOG_DEBUG("CustomI2CSensor::getMetrics=%d\n", length);
// uint8_t buffer[meshtastic_EnvironmentMetrics_size];
// Wire.readBytes(buffer, length);
// meshtastic_EnvironmentMetrics metrics = meshtastic_EnvironmentMetrics_init_zero;
// proto_decode(buffer, meshtastic_EnvironmentMetrics_size, meshtastic_EnvironmentMetrics_fields, &metrics);
measurement->which_variant = meshtastic_Telemetry_environment_metrics_tag;
if (lastMetricsRecieved.has_temperature) {
measurement->variant.environment_metrics.has_temperature = true;
measurement->variant.environment_metrics.temperature = lastMetricsRecieved.temperature;
}
if (lastMetricsRecieved.has_relative_humidity) {
measurement->variant.environment_metrics.has_relative_humidity = true;
measurement->variant.environment_metrics.relative_humidity = lastMetricsRecieved.relative_humidity;
}
if (lastMetricsRecieved.has_barometric_pressure) {
measurement->variant.environment_metrics.has_barometric_pressure = true;
measurement->variant.environment_metrics.barometric_pressure = lastMetricsRecieved.barometric_pressure;
}
if (lastMetricsRecieved.has_gas_resistance) {
measurement->variant.environment_metrics.has_gas_resistance = true;
measurement->variant.environment_metrics.gas_resistance = lastMetricsRecieved.gas_resistance;
}
if (lastMetricsRecieved.has_iaq) {
measurement->variant.environment_metrics.has_iaq = true;
measurement->variant.environment_metrics.iaq = lastMetricsRecieved.iaq;
}
if (lastMetricsRecieved.has_voltage) {
measurement->variant.environment_metrics.has_voltage = true;
measurement->variant.environment_metrics.voltage = lastMetricsRecieved.voltage;
}
if (lastMetricsRecieved.has_current) {
measurement->variant.environment_metrics.has_current = true;
measurement->variant.environment_metrics.current = lastMetricsRecieved.current;
}
if (lastMetricsRecieved.has_distance) {
measurement->variant.environment_metrics.has_distance = true;
measurement->variant.environment_metrics.distance = lastMetricsRecieved.distance;
}
if (lastMetricsRecieved.has_lux) {
measurement->variant.environment_metrics.has_lux = true;
measurement->variant.environment_metrics.lux = lastMetricsRecieved.lux;
}
if (lastMetricsRecieved.has_white_lux) {
measurement->variant.environment_metrics.has_white_lux = true;
measurement->variant.environment_metrics.white_lux = lastMetricsRecieved.white_lux;
}
if (lastMetricsRecieved.has_ir_lux) {
measurement->variant.environment_metrics.has_ir_lux = true;
measurement->variant.environment_metrics.ir_lux = lastMetricsRecieved.ir_lux;
}
if (lastMetricsRecieved.has_uv_lux) {
measurement->variant.environment_metrics.has_uv_lux = true;
measurement->variant.environment_metrics.uv_lux = lastMetricsRecieved.uv_lux;
}
if (lastMetricsRecieved.has_wind_direction) {
measurement->variant.environment_metrics.has_wind_direction = true;
measurement->variant.environment_metrics.wind_direction = lastMetricsRecieved.wind_direction;
}
if (lastMetricsRecieved.has_wind_speed) {
measurement->variant.environment_metrics.has_wind_speed = true;
measurement->variant.environment_metrics.wind_speed = lastMetricsRecieved.wind_speed;
}
if (lastMetricsRecieved.has_wind_lull) {
measurement->variant.environment_metrics.has_wind_lull = true;
measurement->variant.environment_metrics.wind_lull = lastMetricsRecieved.wind_lull;
}
return true;
}
#endif

View File

@@ -0,0 +1,19 @@
#include "configuration.h"
#if !MESHTASTIC_EXCLUDE_ENVIRONMENTAL_SENSOR
#include "../mesh/generated/meshtastic/telemetry.pb.h"
#include "TelemetrySensor.h"
class CustomI2CSensor : public TelemetrySensor
{
protected:
virtual void setup() override;
public:
CustomI2CSensor();
virtual int32_t runOnce() override;
virtual bool getMetrics(meshtastic_Telemetry *measurement) override;
};
#endif

View File

@@ -1,4 +1,4 @@
[VERSION]
major = 2
minor = 5
build = 0
build = 1